Skip to content

Commit c1d3144

Browse files
committed
MB-58649: Check Vbucket::isBucketCreation during RangeScanCreate
Fail a create request if the vbucket is in the "create" state so that the RangeScanCreate won't get system errors if it tries to open a datafile that has yet to be written/created. Change-Id: I7640e15cf23f692aaaa56a729012496ff0ce94c1 Reviewed-on: https://review.couchbase.org/c/kv_engine/+/197134 Reviewed-by: Trond Norbye <[email protected]> Tested-by: Jim Walker <[email protected]>
1 parent 8688b36 commit c1d3144

File tree

2 files changed

+24
-0
lines changed

2 files changed

+24
-0
lines changed

engines/ep/src/ep_vb.cc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1309,7 +1309,11 @@ std::pair<cb::engine_errc, cb::rangescan::Id> EPVBucket::createRangeScan(
13091309
return createRangeScanComplete(std::move(rangeScanCreateToken),
13101310
cookie);
13111311
}
1312+
} else if (isBucketCreation()) {
1313+
// Scan create is racing with vbucket creation
1314+
return {cb::engine_errc::temporary_failure, {}};
13121315
} else {
1316+
13131317
// Create our RangeScanCreateToken, the state will now be Pending
13141318
rangeScanCreateToken = std::make_unique<RangeScanCreateToken>();
13151319
// Place pointer in the cookie so we can get this object back on success

engines/ep/tests/module_tests/range_scan_test.cc

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2015,6 +2015,26 @@ TEST_P(RangeScanTestSimple, limitRangeScans) {
20152015
EXPECT_EQ(0, store->getKVStoreScanTracker().getNumRunningRangeScans());
20162016
}
20172017

2018+
TEST_P(RangeScanTestSimple, beforeFlush) {
2019+
Vbid testvb = Vbid(1);
2020+
setVBucketState(testvb, vbucket_state_active);
2021+
2022+
// The vbucket is in "creating" state, i.e. nothing flushed (for couchstore
2023+
// there is no 1.couch.1 file)
2024+
EXPECT_EQ(cb::engine_errc::temporary_failure,
2025+
store->createRangeScan(
2026+
*cookie,
2027+
std::move(handler),
2028+
cb::rangescan::CreateParameters{testvb,
2029+
CollectionID::Default,
2030+
{"\0"},
2031+
{"\xff"},
2032+
getScanType(),
2033+
{},
2034+
{}})
2035+
.first);
2036+
}
2037+
20182038
// A handler which will execute a callback as part of handleStatus
20192039
class MB_54053Handler : public RangeScanDataHandlerIFace {
20202040
public:

0 commit comments

Comments
 (0)