1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
5 #include "gtest/gtest.h"
6 #include "global/global_init.h"
7 #include "common/common_init.h"
9 #include "osd/mClockClientQueue.h"
12 int main(int argc
, char **argv
) {
13 std::vector
<const char*> args(argv
, argv
+argc
);
14 auto cct
= global_init(nullptr, args
, CEPH_ENTITY_TYPE_OSD
,
15 CODE_ENVIRONMENT_UTILITY
,
16 CINIT_FLAG_NO_DEFAULT_CONFIG_FILE
);
17 common_init_finish(g_ceph_context
);
19 ::testing::InitGoogleTest(&argc
, argv
);
20 return RUN_ALL_TESTS();
24 class MClockClientQueueTest
: public testing::Test
{
28 entity_inst_t client1
;
29 entity_inst_t client2
;
30 entity_inst_t client3
;
32 MClockClientQueueTest() :
34 client1(entity_name_t(CEPH_ENTITY_TYPE_OSD
, 1), entity_addr_t()),
35 client2(entity_name_t(CEPH_ENTITY_TYPE_OSD
, 2), entity_addr_t()),
36 client3(entity_name_t(CEPH_ENTITY_TYPE_CLIENT
, 1), entity_addr_t())
39 #if 0 // more work needed here
40 Request
create_client_op(epoch_t e
, const entity_inst_t
& owner
) {
41 return Request(spg_t(), PGQueueable(OpRequestRef(), e
));
45 Request
create_snaptrim(epoch_t e
, const entity_inst_t
& owner
) {
46 return Request(spg_t(),
47 PGQueueable(PGSnapTrim(e
),
49 utime_t(), owner
, e
));
52 Request
create_scrub(epoch_t e
, const entity_inst_t
& owner
) {
53 return Request(spg_t(),
54 PGQueueable(PGScrub(e
),
56 utime_t(), owner
, e
));
59 Request
create_recovery(epoch_t e
, const entity_inst_t
& owner
) {
60 return Request(spg_t(),
61 PGQueueable(PGRecovery(e
, 64),
63 utime_t(), owner
, e
));
68 TEST_F(MClockClientQueueTest
, TestSize
) {
69 ASSERT_TRUE(q
.empty());
70 ASSERT_EQ(0u, q
.length());
72 q
.enqueue(client1
, 12, 0, create_snaptrim(100, client1
));
73 q
.enqueue_strict(client2
, 12, create_snaptrim(101, client2
));
74 q
.enqueue(client2
, 12, 0, create_snaptrim(102, client2
));
75 q
.enqueue_strict(client3
, 12, create_snaptrim(103, client3
));
76 q
.enqueue(client1
, 12, 0, create_snaptrim(104, client1
));
78 ASSERT_FALSE(q
.empty());
79 ASSERT_EQ(5u, q
.length());
81 std::list
<Request
> reqs
;
83 reqs
.push_back(q
.dequeue());
84 reqs
.push_back(q
.dequeue());
85 reqs
.push_back(q
.dequeue());
87 ASSERT_FALSE(q
.empty());
88 ASSERT_EQ(2u, q
.length());
90 q
.enqueue_front(client2
, 12, 0, reqs
.back());
93 q
.enqueue_strict_front(client3
, 12, reqs
.back());
96 q
.enqueue_strict_front(client2
, 12, reqs
.back());
99 ASSERT_FALSE(q
.empty());
100 ASSERT_EQ(5u, q
.length());
102 for (int i
= 0; i
< 5; ++i
) {
106 ASSERT_TRUE(q
.empty());
107 ASSERT_EQ(0u, q
.length());
111 TEST_F(MClockClientQueueTest
, TestEnqueue
) {
112 q
.enqueue(client1
, 12, 0, create_snaptrim(100, client1
));
113 q
.enqueue(client2
, 12, 0, create_snaptrim(101, client2
));
114 q
.enqueue(client2
, 12, 0, create_snaptrim(102, client2
));
115 q
.enqueue(client3
, 12, 0, create_snaptrim(103, client3
));
116 q
.enqueue(client1
, 12, 0, create_snaptrim(104, client1
));
118 Request r
= q
.dequeue();
119 ASSERT_EQ(100u, r
.second
.get_map_epoch());
122 ASSERT_EQ(101u, r
.second
.get_map_epoch());
125 ASSERT_EQ(103u, r
.second
.get_map_epoch());
128 ASSERT_TRUE(r
.second
.get_map_epoch() == 102u ||
129 r
.second
.get_map_epoch() == 104u);
132 ASSERT_TRUE(r
.second
.get_map_epoch() == 102u ||
133 r
.second
.get_map_epoch() == 104u);
137 TEST_F(MClockClientQueueTest
, TestEnqueueStrict
) {
138 q
.enqueue_strict(client1
, 12, create_snaptrim(100, client1
));
139 q
.enqueue_strict(client2
, 13, create_snaptrim(101, client2
));
140 q
.enqueue_strict(client2
, 16, create_snaptrim(102, client2
));
141 q
.enqueue_strict(client3
, 14, create_snaptrim(103, client3
));
142 q
.enqueue_strict(client1
, 15, create_snaptrim(104, client1
));
144 Request r
= q
.dequeue();
145 ASSERT_EQ(102u, r
.second
.get_map_epoch());
148 ASSERT_EQ(104u, r
.second
.get_map_epoch());
151 ASSERT_EQ(103u, r
.second
.get_map_epoch());
154 ASSERT_EQ(101u, r
.second
.get_map_epoch());
157 ASSERT_EQ(100u, r
.second
.get_map_epoch());
161 TEST_F(MClockClientQueueTest
, TestRemoveByClass
) {
162 q
.enqueue(client1
, 12, 0, create_snaptrim(100, client1
));
163 q
.enqueue_strict(client2
, 12, create_snaptrim(101, client2
));
164 q
.enqueue(client2
, 12, 0, create_snaptrim(102, client2
));
165 q
.enqueue_strict(client3
, 12, create_snaptrim(103, client3
));
166 q
.enqueue(client1
, 12, 0, create_snaptrim(104, client1
));
168 std::list
<Request
> filtered_out
;
169 q
.remove_by_class(client2
, &filtered_out
);
171 ASSERT_EQ(2u, filtered_out
.size());
172 while (!filtered_out
.empty()) {
173 auto e
= filtered_out
.front().second
.get_map_epoch() ;
174 ASSERT_TRUE(e
== 101 || e
== 102);
175 filtered_out
.pop_front();
178 ASSERT_EQ(3u, q
.length());
179 Request r
= q
.dequeue();
180 ASSERT_EQ(103u, r
.second
.get_map_epoch());
183 ASSERT_EQ(100u, r
.second
.get_map_epoch());
186 ASSERT_EQ(104u, r
.second
.get_map_epoch());