]>
Commit | Line | Data |
---|---|---|
224ce89b WB |
1 | // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- |
2 | ||
3 | #include <iostream> | |
4 | ||
5 | #include "gtest/gtest.h" | |
6 | #include "global/global_init.h" | |
7 | #include "common/common_init.h" | |
8 | ||
9 | #include "osd/mClockClientQueue.h" | |
10 | ||
11 | ||
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); | |
18 | ||
19 | ::testing::InitGoogleTest(&argc, argv); | |
20 | return RUN_ALL_TESTS(); | |
21 | } | |
22 | ||
23 | ||
24 | class MClockClientQueueTest : public testing::Test { | |
25 | public: | |
26 | mClockClientQueue q; | |
27 | ||
11fdf7f2 TL |
28 | uint64_t client1; |
29 | uint64_t client2; | |
30 | uint64_t client3; | |
224ce89b WB |
31 | |
32 | MClockClientQueueTest() : | |
33 | q(g_ceph_context), | |
11fdf7f2 TL |
34 | client1(1001), |
35 | client2(9999), | |
36 | client3(100000001) | |
224ce89b WB |
37 | {} |
38 | ||
39 | #if 0 // more work needed here | |
11fdf7f2 TL |
40 | Request create_client_op(epoch_t e, uint64_t owner) { |
41 | return Request(spg_t(), OpQueueItem(OpRequestRef(), e)); | |
224ce89b WB |
42 | } |
43 | #endif | |
44 | ||
11fdf7f2 TL |
45 | Request create_snaptrim(epoch_t e, uint64_t owner) { |
46 | return Request(OpQueueItem(unique_ptr<OpQueueItem::OpQueueable>(new PGSnapTrim(spg_t(), e)), | |
224ce89b WB |
47 | 12, 12, |
48 | utime_t(), owner, e)); | |
49 | } | |
50 | ||
11fdf7f2 TL |
51 | Request create_scrub(epoch_t e, uint64_t owner) { |
52 | return Request(OpQueueItem(unique_ptr<OpQueueItem::OpQueueable>(new PGScrub(spg_t(), e)), | |
224ce89b WB |
53 | 12, 12, |
54 | utime_t(), owner, e)); | |
55 | } | |
56 | ||
11fdf7f2 TL |
57 | Request create_recovery(epoch_t e, uint64_t owner) { |
58 | return Request(OpQueueItem(unique_ptr<OpQueueItem::OpQueueable>(new PGRecovery(spg_t(), e, 64)), | |
224ce89b WB |
59 | 12, 12, |
60 | utime_t(), owner, e)); | |
61 | } | |
62 | }; | |
63 | ||
64 | ||
65 | TEST_F(MClockClientQueueTest, TestSize) { | |
66 | ASSERT_TRUE(q.empty()); | |
11fdf7f2 | 67 | ASSERT_EQ(0u, q.get_size_slow()); |
224ce89b | 68 | |
11fdf7f2 | 69 | q.enqueue(client1, 12, 1u, create_snaptrim(100, client1)); |
224ce89b | 70 | q.enqueue_strict(client2, 12, create_snaptrim(101, client2)); |
11fdf7f2 | 71 | q.enqueue(client2, 12, 1u, create_snaptrim(102, client2)); |
224ce89b | 72 | q.enqueue_strict(client3, 12, create_snaptrim(103, client3)); |
11fdf7f2 | 73 | q.enqueue(client1, 12, 1u, create_snaptrim(104, client1)); |
224ce89b WB |
74 | |
75 | ASSERT_FALSE(q.empty()); | |
11fdf7f2 | 76 | ASSERT_EQ(5u, q.get_size_slow()); |
224ce89b WB |
77 | |
78 | std::list<Request> reqs; | |
79 | ||
80 | reqs.push_back(q.dequeue()); | |
81 | reqs.push_back(q.dequeue()); | |
82 | reqs.push_back(q.dequeue()); | |
83 | ||
84 | ASSERT_FALSE(q.empty()); | |
11fdf7f2 | 85 | ASSERT_EQ(2u, q.get_size_slow()); |
224ce89b | 86 | |
11fdf7f2 | 87 | q.enqueue_front(client2, 12, 1u, std::move(reqs.back())); |
224ce89b WB |
88 | reqs.pop_back(); |
89 | ||
11fdf7f2 | 90 | q.enqueue_strict_front(client3, 12, std::move(reqs.back())); |
224ce89b WB |
91 | reqs.pop_back(); |
92 | ||
11fdf7f2 | 93 | q.enqueue_strict_front(client2, 12, std::move(reqs.back())); |
224ce89b WB |
94 | reqs.pop_back(); |
95 | ||
96 | ASSERT_FALSE(q.empty()); | |
11fdf7f2 | 97 | ASSERT_EQ(5u, q.get_size_slow()); |
224ce89b WB |
98 | |
99 | for (int i = 0; i < 5; ++i) { | |
100 | (void) q.dequeue(); | |
101 | } | |
102 | ||
103 | ASSERT_TRUE(q.empty()); | |
11fdf7f2 | 104 | ASSERT_EQ(0u, q.get_size_slow()); |
224ce89b WB |
105 | } |
106 | ||
107 | ||
108 | TEST_F(MClockClientQueueTest, TestEnqueue) { | |
11fdf7f2 TL |
109 | q.enqueue(client1, 12, 1u, create_snaptrim(100, client1)); |
110 | q.enqueue(client2, 12, 1u, create_snaptrim(101, client2)); | |
111 | q.enqueue(client2, 12, 1u, create_snaptrim(102, client2)); | |
112 | q.enqueue(client3, 12, 1u, create_snaptrim(103, client3)); | |
113 | q.enqueue(client1, 12, 1u, create_snaptrim(104, client1)); | |
224ce89b WB |
114 | |
115 | Request r = q.dequeue(); | |
11fdf7f2 | 116 | ASSERT_EQ(100u, r.get_map_epoch()); |
224ce89b WB |
117 | |
118 | r = q.dequeue(); | |
11fdf7f2 | 119 | ASSERT_EQ(101u, r.get_map_epoch()); |
224ce89b WB |
120 | |
121 | r = q.dequeue(); | |
11fdf7f2 | 122 | ASSERT_EQ(103u, r.get_map_epoch()); |
224ce89b WB |
123 | |
124 | r = q.dequeue(); | |
11fdf7f2 TL |
125 | ASSERT_TRUE(r.get_map_epoch() == 102u || |
126 | r.get_map_epoch() == 104u); | |
224ce89b WB |
127 | |
128 | r = q.dequeue(); | |
11fdf7f2 TL |
129 | ASSERT_TRUE(r.get_map_epoch() == 102u || |
130 | r.get_map_epoch() == 104u); | |
224ce89b WB |
131 | } |
132 | ||
133 | ||
134 | TEST_F(MClockClientQueueTest, TestEnqueueStrict) { | |
135 | q.enqueue_strict(client1, 12, create_snaptrim(100, client1)); | |
136 | q.enqueue_strict(client2, 13, create_snaptrim(101, client2)); | |
137 | q.enqueue_strict(client2, 16, create_snaptrim(102, client2)); | |
138 | q.enqueue_strict(client3, 14, create_snaptrim(103, client3)); | |
139 | q.enqueue_strict(client1, 15, create_snaptrim(104, client1)); | |
140 | ||
141 | Request r = q.dequeue(); | |
11fdf7f2 | 142 | ASSERT_EQ(102u, r.get_map_epoch()); |
224ce89b WB |
143 | |
144 | r = q.dequeue(); | |
11fdf7f2 | 145 | ASSERT_EQ(104u, r.get_map_epoch()); |
224ce89b WB |
146 | |
147 | r = q.dequeue(); | |
11fdf7f2 | 148 | ASSERT_EQ(103u, r.get_map_epoch()); |
224ce89b WB |
149 | |
150 | r = q.dequeue(); | |
11fdf7f2 | 151 | ASSERT_EQ(101u, r.get_map_epoch()); |
224ce89b WB |
152 | |
153 | r = q.dequeue(); | |
11fdf7f2 | 154 | ASSERT_EQ(100u, r.get_map_epoch()); |
224ce89b WB |
155 | } |
156 | ||
157 | ||
158 | TEST_F(MClockClientQueueTest, TestRemoveByClass) { | |
11fdf7f2 | 159 | q.enqueue(client1, 12, 1u, create_snaptrim(100, client1)); |
224ce89b | 160 | q.enqueue_strict(client2, 12, create_snaptrim(101, client2)); |
11fdf7f2 | 161 | q.enqueue(client2, 12, 1u, create_snaptrim(102, client2)); |
224ce89b | 162 | q.enqueue_strict(client3, 12, create_snaptrim(103, client3)); |
11fdf7f2 | 163 | q.enqueue(client1, 12, 1u, create_snaptrim(104, client1)); |
224ce89b WB |
164 | |
165 | std::list<Request> filtered_out; | |
166 | q.remove_by_class(client2, &filtered_out); | |
167 | ||
168 | ASSERT_EQ(2u, filtered_out.size()); | |
169 | while (!filtered_out.empty()) { | |
11fdf7f2 | 170 | auto e = filtered_out.front().get_map_epoch() ; |
224ce89b WB |
171 | ASSERT_TRUE(e == 101 || e == 102); |
172 | filtered_out.pop_front(); | |
173 | } | |
174 | ||
11fdf7f2 | 175 | ASSERT_EQ(3u, q.get_size_slow()); |
224ce89b | 176 | Request r = q.dequeue(); |
11fdf7f2 | 177 | ASSERT_EQ(103u, r.get_map_epoch()); |
224ce89b WB |
178 | |
179 | r = q.dequeue(); | |
11fdf7f2 | 180 | ASSERT_EQ(100u, r.get_map_epoch()); |
224ce89b WB |
181 | |
182 | r = q.dequeue(); | |
11fdf7f2 | 183 | ASSERT_EQ(104u, r.get_map_epoch()); |
224ce89b | 184 | } |