]>
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 | ||
7 | #include "global/global_context.h" | |
8 | #include "global/global_init.h" | |
9 | #include "common/common_init.h" | |
10 | ||
11 | #include "osd/mClockOpClassQueue.h" | |
12 | ||
13 | ||
14 | int main(int argc, char **argv) { | |
15 | std::vector<const char*> args(argv, argv+argc); | |
16 | auto cct = global_init(nullptr, args, CEPH_ENTITY_TYPE_OSD, | |
17 | CODE_ENVIRONMENT_UTILITY, | |
18 | CINIT_FLAG_NO_DEFAULT_CONFIG_FILE); | |
19 | common_init_finish(g_ceph_context); | |
20 | ||
21 | ::testing::InitGoogleTest(&argc, argv); | |
22 | return RUN_ALL_TESTS(); | |
23 | } | |
24 | ||
25 | ||
26 | class MClockOpClassQueueTest : public testing::Test { | |
27 | public: | |
28 | mClockOpClassQueue q; | |
29 | ||
11fdf7f2 TL |
30 | uint64_t client1; |
31 | uint64_t client2; | |
32 | uint64_t client3; | |
224ce89b WB |
33 | |
34 | MClockOpClassQueueTest() : | |
35 | q(g_ceph_context), | |
11fdf7f2 TL |
36 | client1(1001), |
37 | client2(9999), | |
38 | client3(100000001) | |
224ce89b WB |
39 | {} |
40 | ||
41 | #if 0 // more work needed here | |
11fdf7f2 TL |
42 | Request create_client_op(epoch_t e, uint64_t owner) { |
43 | return Request(spg_t(), OpQueueItem(OpRequestRef(), e)); | |
224ce89b WB |
44 | } |
45 | #endif | |
46 | ||
11fdf7f2 TL |
47 | Request create_snaptrim(epoch_t e, uint64_t owner) { |
48 | return Request(OpQueueItem(unique_ptr<OpQueueItem::OpQueueable>(new PGSnapTrim(spg_t(), e)), | |
224ce89b WB |
49 | 12, 12, |
50 | utime_t(), owner, e)); | |
51 | } | |
52 | ||
11fdf7f2 TL |
53 | Request create_scrub(epoch_t e, uint64_t owner) { |
54 | return Request(OpQueueItem(unique_ptr<OpQueueItem::OpQueueable>(new PGScrub(spg_t(), e)), | |
224ce89b WB |
55 | 12, 12, |
56 | utime_t(), owner, e)); | |
57 | } | |
58 | ||
11fdf7f2 TL |
59 | Request create_recovery(epoch_t e, uint64_t owner) { |
60 | return Request(OpQueueItem(unique_ptr<OpQueueItem::OpQueueable>(new PGRecovery(spg_t(), e, 64)), | |
224ce89b WB |
61 | 12, 12, |
62 | utime_t(), owner, e)); | |
63 | } | |
64 | }; | |
65 | ||
66 | ||
67 | TEST_F(MClockOpClassQueueTest, TestSize) { | |
68 | ASSERT_TRUE(q.empty()); | |
11fdf7f2 | 69 | ASSERT_EQ(0u, q.get_size_slow()); |
224ce89b | 70 | |
11fdf7f2 | 71 | q.enqueue(client1, 12, 1, create_snaptrim(100, client1)); |
224ce89b | 72 | q.enqueue_strict(client2, 12, create_snaptrim(101, client2)); |
11fdf7f2 | 73 | q.enqueue(client2, 12, 1, create_snaptrim(102, client2)); |
224ce89b | 74 | q.enqueue_strict(client3, 12, create_snaptrim(103, client3)); |
11fdf7f2 | 75 | q.enqueue(client1, 12, 1, create_snaptrim(104, client1)); |
224ce89b WB |
76 | |
77 | ASSERT_FALSE(q.empty()); | |
11fdf7f2 | 78 | ASSERT_EQ(5u, q.get_size_slow()); |
224ce89b WB |
79 | |
80 | std::list<Request> reqs; | |
81 | ||
82 | reqs.push_back(q.dequeue()); | |
83 | reqs.push_back(q.dequeue()); | |
84 | reqs.push_back(q.dequeue()); | |
85 | ||
86 | ASSERT_FALSE(q.empty()); | |
11fdf7f2 | 87 | ASSERT_EQ(2u, q.get_size_slow()); |
224ce89b | 88 | |
11fdf7f2 | 89 | q.enqueue_front(client2, 12, 1, std::move(reqs.back())); |
224ce89b WB |
90 | reqs.pop_back(); |
91 | ||
11fdf7f2 | 92 | q.enqueue_strict_front(client3, 12, std::move(reqs.back())); |
224ce89b WB |
93 | reqs.pop_back(); |
94 | ||
11fdf7f2 | 95 | q.enqueue_strict_front(client2, 12, std::move(reqs.back())); |
224ce89b WB |
96 | reqs.pop_back(); |
97 | ||
98 | ASSERT_FALSE(q.empty()); | |
11fdf7f2 | 99 | ASSERT_EQ(5u, q.get_size_slow()); |
224ce89b WB |
100 | |
101 | for (int i = 0; i < 5; ++i) { | |
102 | (void) q.dequeue(); | |
103 | } | |
104 | ||
105 | ASSERT_TRUE(q.empty()); | |
11fdf7f2 | 106 | ASSERT_EQ(0u, q.get_size_slow()); |
224ce89b WB |
107 | } |
108 | ||
109 | ||
110 | TEST_F(MClockOpClassQueueTest, TestEnqueue) { | |
11fdf7f2 TL |
111 | q.enqueue(client1, 12, 1, create_snaptrim(100, client1)); |
112 | q.enqueue(client2, 12, 1, create_snaptrim(101, client2)); | |
113 | q.enqueue(client2, 12, 1, create_snaptrim(102, client2)); | |
114 | q.enqueue(client3, 12, 1, create_snaptrim(103, client3)); | |
115 | q.enqueue(client1, 12, 1, create_snaptrim(104, client1)); | |
224ce89b WB |
116 | |
117 | Request r = q.dequeue(); | |
11fdf7f2 | 118 | ASSERT_EQ(100u, r.get_map_epoch()); |
224ce89b WB |
119 | |
120 | r = q.dequeue(); | |
11fdf7f2 | 121 | ASSERT_EQ(101u, r.get_map_epoch()); |
224ce89b WB |
122 | |
123 | r = q.dequeue(); | |
11fdf7f2 | 124 | ASSERT_EQ(102u, r.get_map_epoch()); |
224ce89b WB |
125 | |
126 | r = q.dequeue(); | |
11fdf7f2 | 127 | ASSERT_EQ(103u, r.get_map_epoch()); |
224ce89b WB |
128 | |
129 | r = q.dequeue(); | |
11fdf7f2 | 130 | ASSERT_EQ(104u, r.get_map_epoch()); |
224ce89b WB |
131 | } |
132 | ||
133 | ||
134 | TEST_F(MClockOpClassQueueTest, 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(MClockOpClassQueueTest, TestRemoveByClass) { | |
11fdf7f2 | 159 | q.enqueue(client1, 12, 1, create_snaptrim(100, client1)); |
224ce89b | 160 | q.enqueue_strict(client2, 12, create_snaptrim(101, client2)); |
11fdf7f2 | 161 | q.enqueue(client2, 12, 1, create_snaptrim(102, client2)); |
224ce89b | 162 | q.enqueue_strict(client3, 12, create_snaptrim(103, client3)); |
11fdf7f2 | 163 | q.enqueue(client1, 12, 1, 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 | } |