diff options
author | Jay Huh <jewoongh@meta.com> | 2023-11-13 14:30:04 -0800 |
---|---|---|
committer | Facebook GitHub Bot <facebook-github-bot@users.noreply.github.com> | 2023-11-13 14:30:04 -0800 |
commit | 8b8f6c63ef7a0c3ce4fe987e91f79380202a110c (patch) | |
tree | 16c2715db401a17aa66f77e90289e4bb1d61e16a /db/wide | |
parent | b3ffca0e298225631ed131805acb8b1335130413 (diff) |
ColumnFamilyHandle Nullcheck in GetEntity and MultiGetEntity (#12057)
Summary:
- Add missing null check for ColumnFamilyHandle in `GetEntity()`
- `FailIfCfHasTs()` now returns `Status::InvalidArgument()` if `column_family` is null. `MultiGetEntity()` can rely on this for cfh null check.
- Added `DeleteRange` API using Default Column Family to be consistent with other major APIs (This was also causing Java Test failure after the `FailIfCfHasTs()` change)
Pull Request resolved: https://github.com/facebook/rocksdb/pull/12057
Test Plan:
- Updated `DBWideBasicTest::GetEntityAsPinnableAttributeGroups` to include null CF case
- Updated `DBWideBasicTest::MultiCFMultiGetEntityAsPinnableAttributeGroups` to include null CF case
Reviewed By: jowlyzhang
Differential Revision: D51167445
Pulled By: jaykorean
fbshipit-source-id: 1c1e44fd7b7df4d2dc3bb2d7d251da85bad7d664
Diffstat (limited to 'db/wide')
-rw-r--r-- | db/wide/db_wide_basic_test.cc | 58 |
1 files changed, 54 insertions, 4 deletions
diff --git a/db/wide/db_wide_basic_test.cc b/db/wide/db_wide_basic_test.cc index 413bfc19f..2280a3ed2 100644 --- a/db/wide/db_wide_basic_test.cc +++ b/db/wide/db_wide_basic_test.cc @@ -277,6 +277,9 @@ TEST_F(DBWideBasicTest, GetEntityAsPinnableAttributeGroups) { {handles_[kDefaultCfHandleIndex], handles_[kHotCfHandleIndex]}}; std::vector<ColumnFamilyHandle*> hot_and_cold_cfs{ {handles_[kHotCfHandleIndex], handles_[kColdCfHandleIndex]}}; + std::vector<ColumnFamilyHandle*> default_null_and_hot_cfs{ + handles_[kDefaultCfHandleIndex], nullptr, handles_[kHotCfHandleIndex], + nullptr}; auto create_result = [](const std::vector<ColumnFamilyHandle*>& column_families) -> PinnableAttributeGroups { @@ -286,9 +289,29 @@ TEST_F(DBWideBasicTest, GetEntityAsPinnableAttributeGroups) { } return result; }; - { - // Case 1. Get first key from default cf and hot_cf and second key from + // Case 1. Invalid Argument (passing in null CF) + AttributeGroups ag{ + AttributeGroup(nullptr, first_default_columns), + AttributeGroup(handles_[kHotCfHandleIndex], first_hot_columns)}; + ASSERT_NOK(db_->PutEntity(WriteOptions(), first_key, ag)); + + PinnableAttributeGroups result = create_result(default_null_and_hot_cfs); + Status s = db_->GetEntity(ReadOptions(), first_key, &result); + ASSERT_NOK(s); + ASSERT_TRUE(s.IsInvalidArgument()); + // Valid CF, but failed with Incomplete status due to other attribute groups + ASSERT_TRUE(result[0].status().IsIncomplete()); + // Null CF + ASSERT_TRUE(result[1].status().IsInvalidArgument()); + // Valid CF, but failed with Incomplete status due to other attribute groups + ASSERT_TRUE(result[2].status().IsIncomplete()); + // Null CF, but failed with Incomplete status because the nullcheck break + // out early in the loop + ASSERT_TRUE(result[3].status().IsIncomplete()); + } + { + // Case 2. Get first key from default cf and hot_cf and second key from // hot_cf and cold_cf constexpr size_t num_column_families = 2; PinnableAttributeGroups first_key_result = @@ -318,7 +341,7 @@ TEST_F(DBWideBasicTest, GetEntityAsPinnableAttributeGroups) { ASSERT_EQ(second_cold_columns, second_key_result[1].columns()); } { - // Case 2. Get first key and second key from all cfs. For the second key, we + // Case 3. Get first key and second key from all cfs. For the second key, we // don't expect to get columns from default cf. constexpr size_t num_column_families = 3; PinnableAttributeGroups first_key_result = create_result(all_cfs); @@ -428,6 +451,8 @@ TEST_F(DBWideBasicTest, MultiCFMultiGetEntityAsPinnableAttributeGroups) { {handles_[kDefaultCfHandleIndex], handles_[kHotCfHandleIndex]}}; std::vector<ColumnFamilyHandle*> hot_and_cold_cfs{ {handles_[kHotCfHandleIndex], handles_[kColdCfHandleIndex]}}; + std::vector<ColumnFamilyHandle*> null_and_hot_cfs{ + nullptr, handles_[kHotCfHandleIndex], nullptr}; auto create_result = [](const std::vector<ColumnFamilyHandle*>& column_families) -> PinnableAttributeGroups { @@ -438,7 +463,7 @@ TEST_F(DBWideBasicTest, MultiCFMultiGetEntityAsPinnableAttributeGroups) { return result; }; { - // Check for invalid argument + // Check for invalid read option argument ReadOptions read_options; read_options.io_activity = Env::IOActivity::kGetEntity; std::vector<PinnableAttributeGroups> results; @@ -452,6 +477,31 @@ TEST_F(DBWideBasicTest, MultiCFMultiGetEntityAsPinnableAttributeGroups) { ASSERT_TRUE(results[i][j].status().IsInvalidArgument()); } } + // Check for invalid column family in Attribute Group result + results.clear(); + results.emplace_back(create_result(null_and_hot_cfs)); + results.emplace_back(create_result(all_cfs)); + db_->MultiGetEntity(ReadOptions(), num_keys, keys.data(), results.data()); + + // First one failed due to null CFs in the AttributeGroup + // Null CF + ASSERT_NOK(results[0][0].status()); + ASSERT_TRUE(results[0][0].status().IsInvalidArgument()); + // Valid CF, but failed with incomplete status because of other attribute + // groups + ASSERT_NOK(results[0][1].status()); + ASSERT_TRUE(results[0][1].status().IsIncomplete()); + // Null CF + ASSERT_NOK(results[0][2].status()); + ASSERT_TRUE(results[0][2].status().IsInvalidArgument()); + + // Second one failed with Incomplete because first one failed + ASSERT_NOK(results[1][0].status()); + ASSERT_TRUE(results[1][0].status().IsIncomplete()); + ASSERT_NOK(results[1][1].status()); + ASSERT_TRUE(results[1][1].status().IsIncomplete()); + ASSERT_NOK(results[1][2].status()); + ASSERT_TRUE(results[1][2].status().IsIncomplete()); } { // Case 1. Get first key from default cf and hot_cf and second key from |