|
11 | 11 | #include "gtest/gtest.h" |
12 | 12 | #include "test/librados/test_cxx.h" |
13 | 13 | #include "global/global_context.h" |
| 14 | +#include "cls/2pc_queue/cls_2pc_queue_const.h" |
14 | 15 |
|
15 | 16 | #include <string> |
16 | 17 | #include <vector> |
@@ -173,6 +174,131 @@ TEST_F(TestCls2PCQueue, Commit) |
173 | 174 | ASSERT_EQ(reservations.size(), 0); |
174 | 175 | } |
175 | 176 |
|
| 177 | +TEST_F(TestCls2PCQueue, Stats) |
| 178 | +{ |
| 179 | + const std::string queue_name = __PRETTY_FUNCTION__; |
| 180 | + const auto max_size = 1024*1024*128; |
| 181 | + const auto number_of_ops = 200U; |
| 182 | + const auto number_of_elements = 23U; |
| 183 | + auto total_committed_elements = 0U; |
| 184 | + librados::ObjectWriteOperation op; |
| 185 | + op.create(true); |
| 186 | + cls_2pc_queue_init(op, queue_name, max_size); |
| 187 | + ASSERT_EQ(0, ioctx.operate(queue_name, &op)); |
| 188 | + |
| 189 | + for (auto i = 0U; i < number_of_ops; ++i) { |
| 190 | + const std::string element_prefix("op-" +to_string(i) + "-element-"); |
| 191 | + auto total_size = 0UL; |
| 192 | + std::vector<bufferlist> data(number_of_elements); |
| 193 | + // create vector of buffer lists |
| 194 | + std::generate(data.begin(), data.end(), [j = 0, &element_prefix, &total_size] () mutable { |
| 195 | + bufferlist bl; |
| 196 | + bl.append(element_prefix + to_string(j++)); |
| 197 | + total_size += bl.length(); |
| 198 | + return bl; |
| 199 | + }); |
| 200 | + |
| 201 | + cls_2pc_reservation::id_t res_id; |
| 202 | + ASSERT_EQ(cls_2pc_queue_reserve(ioctx, queue_name, total_size, number_of_elements, res_id), 0); |
| 203 | + ASSERT_NE(res_id, cls_2pc_reservation::NO_ID); |
| 204 | + cls_2pc_queue_commit(op, data, res_id); |
| 205 | + ASSERT_EQ(0, ioctx.operate(queue_name, &op)); |
| 206 | + |
| 207 | + total_committed_elements += number_of_elements; |
| 208 | + uint32_t committed_entries; |
| 209 | + uint64_t size; |
| 210 | + |
| 211 | + ASSERT_EQ(cls_2pc_queue_get_topic_stats(ioctx, queue_name, committed_entries, size), 0); |
| 212 | + ASSERT_EQ(committed_entries, total_committed_elements); |
| 213 | + } |
| 214 | + cls_2pc_reservations reservations; |
| 215 | + ASSERT_EQ(0, cls_2pc_queue_list_reservations(ioctx, queue_name, reservations)); |
| 216 | + ASSERT_EQ(reservations.size(), 0); |
| 217 | +} |
| 218 | + |
| 219 | +TEST_F(TestCls2PCQueue, UpgradeFromReef) |
| 220 | +{ |
| 221 | + const std::string queue_name = __PRETTY_FUNCTION__; |
| 222 | + const auto max_size = 1024*1024*128; |
| 223 | + const auto number_of_ops = 200U; |
| 224 | + const auto number_of_elements = 23U; |
| 225 | + auto total_committed_elements = 0U; |
| 226 | + librados::ObjectWriteOperation wop; |
| 227 | + wop.create(true); |
| 228 | + cls_2pc_queue_init(wop, queue_name, max_size); |
| 229 | + ASSERT_EQ(0, ioctx.operate(queue_name, &wop)); |
| 230 | + |
| 231 | + for (auto i = 0U; i < number_of_ops; ++i) { |
| 232 | + const std::string element_prefix("wop-" +to_string(i) + "-element-"); |
| 233 | + auto total_size = 0UL; |
| 234 | + std::vector<bufferlist> data(number_of_elements); |
| 235 | + // create vector of buffer lists |
| 236 | + std::generate(data.begin(), data.end(), [j = 0, &element_prefix, &total_size] () mutable { |
| 237 | + bufferlist bl; |
| 238 | + bl.append(element_prefix + to_string(j++)); |
| 239 | + total_size += bl.length(); |
| 240 | + return bl; |
| 241 | + }); |
| 242 | + |
| 243 | + cls_2pc_reservation::id_t res_id; |
| 244 | + ASSERT_EQ(cls_2pc_queue_reserve(ioctx, queue_name, total_size, number_of_elements, res_id), 0); |
| 245 | + ASSERT_NE(res_id, cls_2pc_reservation::NO_ID); |
| 246 | + cls_2pc_queue_commit(wop, data, res_id); |
| 247 | + ASSERT_EQ(0, ioctx.operate(queue_name, &wop)); |
| 248 | + |
| 249 | + total_committed_elements += number_of_elements; |
| 250 | + uint32_t committed_entries; |
| 251 | + uint64_t size; |
| 252 | + |
| 253 | + ASSERT_EQ(cls_2pc_queue_get_topic_stats(ioctx, queue_name, committed_entries, size), 0); |
| 254 | + ASSERT_EQ(committed_entries, total_committed_elements); |
| 255 | + } |
| 256 | + cls_2pc_reservations reservations; |
| 257 | + ASSERT_EQ(0, cls_2pc_queue_list_reservations(ioctx, queue_name, reservations)); |
| 258 | + ASSERT_EQ(reservations.size(), 0); |
| 259 | + |
| 260 | + constexpr auto max_elements = 42U; |
| 261 | + std::string marker; |
| 262 | + std::string end_marker; |
| 263 | + librados::ObjectReadOperation rop; |
| 264 | + auto consume_count = 0U; |
| 265 | + std::vector<cls_queue_entry> entries; |
| 266 | + bool truncated = true; |
| 267 | + |
| 268 | + auto simulate_reef_cls_2pc_queue_remove_entries = [](librados::ObjectWriteOperation& wop, const std::string& end_marker) { |
| 269 | + bufferlist in; |
| 270 | + cls_queue_remove_op rem_op; |
| 271 | + rem_op.end_marker = end_marker; |
| 272 | + encode(rem_op, in); |
| 273 | + wop.exec(TPC_QUEUE_CLASS, TPC_QUEUE_REMOVE_ENTRIES, in); |
| 274 | + }; |
| 275 | + |
| 276 | + while (truncated) { |
| 277 | + bufferlist bl; |
| 278 | + int rc; |
| 279 | + cls_2pc_queue_list_entries(rop, marker, max_elements, &bl, &rc); |
| 280 | + ASSERT_EQ(0, ioctx.operate(queue_name, &rop, nullptr)); |
| 281 | + ASSERT_EQ(rc, 0); |
| 282 | + ASSERT_EQ(cls_2pc_queue_list_entries_result(bl, entries, &truncated, end_marker), 0); |
| 283 | + |
| 284 | + consume_count += entries.size(); |
| 285 | + // simulating reef cls_2pc_queue_remove_entries with cls_queue_remove_op |
| 286 | + simulate_reef_cls_2pc_queue_remove_entries(wop, end_marker); |
| 287 | + marker = end_marker; |
| 288 | + total_committed_elements -= entries.size(); |
| 289 | + } |
| 290 | + |
| 291 | + // execute all delete operations in a batch |
| 292 | + ASSERT_EQ(0, ioctx.operate(queue_name, &wop)); |
| 293 | + ASSERT_EQ(consume_count, number_of_ops*number_of_elements); |
| 294 | + |
| 295 | + uint32_t entries_number; |
| 296 | + uint64_t size; |
| 297 | + ASSERT_EQ(cls_2pc_queue_get_topic_stats(ioctx, queue_name, entries_number, size), 0); |
| 298 | + ASSERT_EQ(total_committed_elements, 0); |
| 299 | + ASSERT_EQ(entries_number, 0); |
| 300 | +} |
| 301 | + |
176 | 302 | TEST_F(TestCls2PCQueue, Abort) |
177 | 303 | { |
178 | 304 | const std::string queue_name = __PRETTY_FUNCTION__; |
|
0 commit comments