summaryrefslogtreecommitdiff
path: root/utilities
diff options
context:
space:
mode:
authorhasagi <30975629+LIBA-S@users.noreply.github.com>2024-04-03 10:56:30 -0700
committerFacebook GitHub Bot <facebook-github-bot@users.noreply.github.com>2024-04-03 10:56:30 -0700
commit5a86635e1277fa03b6367169e6727f0c25b5db3d (patch)
treecac9195659c56b75422b658ab12e63dbd697df7b /utilities
parent74d419be4da5b7808143b7701d52179bc61ec2e1 (diff)
Fix CreateColumnFamilyWithImport for PessimisticTransactionDB (#12490)
Summary: When we use the CreateColumnFamilyWithImport interface of PessimisticTransactionDB to create column family, the lack of related information may cause subsequent writes to be unable to find the Column Family ID. The issue: (https://github.com/facebook/rocksdb/issues/12493) Pull Request resolved: https://github.com/facebook/rocksdb/pull/12490 Reviewed By: jowlyzhang Differential Revision: D55700343 Pulled By: cbi42 fbshipit-source-id: dc992a3eef433e1193d579cbf58b6ba940fa460d
Diffstat (limited to 'utilities')
-rw-r--r--utilities/transactions/pessimistic_transaction_db.cc21
-rw-r--r--utilities/transactions/pessimistic_transaction_db.h17
-rw-r--r--utilities/transactions/transaction_test.cc73
3 files changed, 111 insertions, 0 deletions
diff --git a/utilities/transactions/pessimistic_transaction_db.cc b/utilities/transactions/pessimistic_transaction_db.cc
index 57c14b5f7..9202a59bc 100644
--- a/utilities/transactions/pessimistic_transaction_db.cc
+++ b/utilities/transactions/pessimistic_transaction_db.cc
@@ -426,6 +426,27 @@ Status PessimisticTransactionDB::CreateColumnFamilies(
return s;
}
+Status PessimisticTransactionDB::CreateColumnFamilyWithImport(
+ const ColumnFamilyOptions& options, const std::string& column_family_name,
+ const ImportColumnFamilyOptions& import_options,
+ const std::vector<const ExportImportFilesMetaData*>& metadatas,
+ ColumnFamilyHandle** handle) {
+ InstrumentedMutexLock l(&column_family_mutex_);
+ Status s = VerifyCFOptions(options);
+ if (!s.ok()) {
+ return s;
+ }
+
+ s = db_->CreateColumnFamilyWithImport(options, column_family_name,
+ import_options, metadatas, handle);
+ if (s.ok()) {
+ lock_manager_->AddColumnFamily(*handle);
+ UpdateCFComparatorMap(*handle);
+ }
+
+ return s;
+}
+
// Let LockManager know that it can deallocate the LockMap for this
// column family.
Status PessimisticTransactionDB::DropColumnFamily(
diff --git a/utilities/transactions/pessimistic_transaction_db.h b/utilities/transactions/pessimistic_transaction_db.h
index a125c6c35..6654aa809 100644
--- a/utilities/transactions/pessimistic_transaction_db.h
+++ b/utilities/transactions/pessimistic_transaction_db.h
@@ -106,6 +106,23 @@ class PessimisticTransactionDB : public TransactionDB {
const std::vector<ColumnFamilyDescriptor>& column_families,
std::vector<ColumnFamilyHandle*>* handles) override;
+ using StackableDB::CreateColumnFamilyWithImport;
+ Status CreateColumnFamilyWithImport(
+ const ColumnFamilyOptions& options, const std::string& column_family_name,
+ const ImportColumnFamilyOptions& import_options,
+ const ExportImportFilesMetaData& metadata,
+ ColumnFamilyHandle** handle) override {
+ const std::vector<const ExportImportFilesMetaData*>& metadatas{&metadata};
+ return CreateColumnFamilyWithImport(options, column_family_name,
+ import_options, metadatas, handle);
+ }
+
+ Status CreateColumnFamilyWithImport(
+ const ColumnFamilyOptions& options, const std::string& column_family_name,
+ const ImportColumnFamilyOptions& import_options,
+ const std::vector<const ExportImportFilesMetaData*>& metadatas,
+ ColumnFamilyHandle** handle) override;
+
using StackableDB::DropColumnFamily;
Status DropColumnFamily(ColumnFamilyHandle* column_family) override;
diff --git a/utilities/transactions/transaction_test.cc b/utilities/transactions/transaction_test.cc
index a2fa9ce05..b3da4807d 100644
--- a/utilities/transactions/transaction_test.cc
+++ b/utilities/transactions/transaction_test.cc
@@ -2981,6 +2981,79 @@ TEST_P(TransactionTest, ColumnFamiliesTest) {
}
}
+TEST_P(TransactionTest, WriteImportedColumnFamilyTest) {
+ WriteOptions write_options;
+ ReadOptions read_options;
+ ColumnFamilyOptions cf_options;
+ ImportColumnFamilyOptions import_options;
+ ExportImportFilesMetaData* metadata_ptr = nullptr;
+ ColumnFamilyHandle* import_cf = nullptr;
+ ColumnFamilyHandle* export_cf = nullptr;
+ std::string export_files_dir = test::PerThreadDBPath(env.get(), "cf_export");
+ std::string value;
+ Status s;
+
+ {
+ // Create a column family to export
+ s = db->CreateColumnFamily(cf_options, "CF_EXPORT", &export_cf);
+ ASSERT_OK(s);
+
+ // Write some data to the db
+ WriteBatch batch;
+ ASSERT_OK(batch.Put(export_cf, "K1", "V1"));
+ ASSERT_OK(batch.Put(export_cf, "K2", "V2"));
+ s = db->Write(write_options, &batch);
+ ASSERT_OK(s);
+
+ Checkpoint* checkpoint = nullptr;
+ s = Checkpoint::Create(db, &checkpoint);
+ ASSERT_OK(s);
+ s = checkpoint->ExportColumnFamily(export_cf, export_files_dir,
+ &metadata_ptr);
+ ASSERT_OK(s);
+ ASSERT_NE(metadata_ptr, nullptr);
+ delete checkpoint;
+
+ s = db->DropColumnFamily(export_cf);
+ ASSERT_OK(s);
+ delete export_cf;
+ }
+
+ {
+ // Create a new column family with import
+ s = db->CreateColumnFamilyWithImport(
+ cf_options, "CF_IMPORT", import_options, *metadata_ptr, &import_cf);
+ ASSERT_OK(s);
+ s = db->Get(read_options, import_cf, "K1", &value);
+ ASSERT_OK(s);
+ ASSERT_EQ(value, "V1");
+ s = db->Get(read_options, import_cf, "K2", &value);
+ ASSERT_OK(s);
+ ASSERT_EQ(value, "V2");
+
+ // Wirte a new key-value pair
+ Transaction* txn = db->BeginTransaction(write_options);
+ ASSERT_TRUE(txn);
+ s = txn->Put(import_cf, "K3", "V3");
+ ASSERT_OK(s);
+ s = txn->Commit();
+ ASSERT_OK(s);
+ delete txn;
+
+ s = db->Get(read_options, import_cf, "K3", &value);
+ ASSERT_OK(s);
+ ASSERT_EQ(value, "V3");
+
+ s = db->DropColumnFamily(import_cf);
+ ASSERT_OK(s);
+ delete import_cf;
+ }
+
+ delete metadata_ptr;
+
+ EXPECT_OK(DestroyDir(env.get(), export_files_dir));
+}
+
TEST_P(TransactionTest, MultiGetBatchedTest) {
WriteOptions write_options;
ReadOptions read_options, snapshot_read_options;