diff options
author | hasagi <30975629+LIBA-S@users.noreply.github.com> | 2024-04-03 10:56:30 -0700 |
---|---|---|
committer | Facebook GitHub Bot <facebook-github-bot@users.noreply.github.com> | 2024-04-03 10:56:30 -0700 |
commit | 5a86635e1277fa03b6367169e6727f0c25b5db3d (patch) | |
tree | cac9195659c56b75422b658ab12e63dbd697df7b /utilities | |
parent | 74d419be4da5b7808143b7701d52179bc61ec2e1 (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.cc | 21 | ||||
-rw-r--r-- | utilities/transactions/pessimistic_transaction_db.h | 17 | ||||
-rw-r--r-- | utilities/transactions/transaction_test.cc | 73 |
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; |