*ctx.transaction, cid, dest_cid, bits);
return _split_collection(ctx, cid, bits);
}
+ case Transaction::OP_MERGE_COLLECTION:
+ {
+ uint32_t bits = op->split_bits;
+ coll_t cid = i.get_cid(op->cid);
+ coll_t dest_cid = i.get_cid(op->dest_cid);
+ DEBUGT("op OP_MERGE_COLLECTION, cid={}, dest_cid={}, bits={}",
+ *ctx.transaction, cid, dest_cid, bits);
+ return _merge_collection(ctx, cid, dest_cid, bits);
+ }
}
using onode_iertr = OnodeManager::get_onode_iertr::extend<
);
}
+SeaStore::Shard::tm_ret
+SeaStore::Shard::_merge_collection(
+ internal_context_t &ctx,
+ coll_t cid,
+ coll_t dest_cid,
+ int bits)
+{
+ auto cmroot = co_await transaction_manager->read_collection_root(
+ *ctx.transaction);
+ co_await collection_manager->update(cmroot, *ctx.transaction, dest_cid, bits)
+ .handle_error_interruptible(
+ tm_iertr::pass_further{},
+ crimson::ct_error::assert_all{"unexpected error from update in _merge_collection"});
+ co_await collection_manager->remove(cmroot, *ctx.transaction, cid)
+ .handle_error_interruptible(
+ tm_iertr::pass_further{},
+ crimson::ct_error::assert_all{"unexpected error from remove in _merge_collection"});
+}
+
SeaStore::Shard::tm_ret
SeaStore::Shard::_create_collection(
internal_context_t &ctx,
});
}
+TEST_P(seastore_test_t, collection_merge)
+{
+ run_async([this] {
+ coll_t src_coll{spg_t{pg_t{17, 0}}};
+ coll_t dest_coll{spg_t{pg_t{1, 0}}};
+
+ sharded_seastore->create_new_collection(dest_coll).get();
+ {
+ CTransaction t;
+ t.create_collection(dest_coll, 5);
+ do_transaction(std::move(t));
+ }
+ sharded_seastore->create_new_collection(src_coll).get();
+ {
+ CTransaction t;
+ t.create_collection(src_coll, 5);
+ do_transaction(std::move(t));
+ }
+
+ {
+ CTransaction t;
+ t.merge_collection(src_coll, dest_coll, 4);
+ do_transaction(std::move(t));
+ }
+
+ auto raw = seastore->list_collections().get();
+ std::vector<coll_t> colls;
+ colls.reserve(raw.size());
+ std::ranges::transform(raw, std::back_inserter(colls),
+ [](const auto& p) { return p.first; });
+ EXPECT_EQ(colls.size(), 2u);
+ EXPECT_TRUE(contains(colls, coll_name));
+ EXPECT_TRUE(contains(colls, dest_coll));
+ EXPECT_FALSE(contains(colls, src_coll));
+ });
+}
+
TEST_P(seastore_test_t, meta) {
run_async([this] {
set_meta("key1", "value1");