@@ -382,7 +382,7 @@ void CouchKVStore::initialize() {
382382 DbHolder db (*this );
383383 errorCode = openDB (id, db, COUCHSTORE_OPEN_FLAG_RDONLY);
384384 if (errorCode == COUCHSTORE_SUCCESS) {
385- auto readStatus = readVBState (db, id);
385+ auto readStatus = readVBStateAndUpdateCache (db, id). status ;
386386 if (readStatus == ReadVBStateStatus::Success) {
387387 /* update stat */
388388 ++st.numLoadedVb ;
@@ -1457,17 +1457,12 @@ ScanContext* CouchKVStore::initScanContext(
14571457 return NULL ;
14581458 }
14591459
1460- auto * vbState = getVBucketState (vbid);
1461- if (!vbState) {
1462- if (readVBState (db, vbid) == CouchKVStore::ReadVBStateStatus::Success) {
1463- vbState = getVBucketState (vbid);
1464- }
1465- if (!vbState) {
1466- EP_LOG_WARN (
1467- " CouchKVStore::initScanContext:Failed to obtain vbState for"
1468- " the highCompletedSeqno" );
1469- return NULL ;
1470- }
1460+ auto readVbStateResult = readVBState (db, vbid);
1461+ if (readVbStateResult.status != ReadVBStateStatus::Success) {
1462+ EP_LOG_WARN (
1463+ " CouchKVStore::initScanContext:Failed to obtain vbState for"
1464+ " the highCompletedSeqno" );
1465+ return NULL ;
14711466 }
14721467
14731468 size_t scanId = scanCounter++;
@@ -1479,19 +1474,20 @@ ScanContext* CouchKVStore::initScanContext(
14791474 scans[scanId] = db.releaseDb ();
14801475 }
14811476
1482- ScanContext* sctx = new ScanContext (cb,
1483- cl,
1484- vbid,
1485- scanId,
1486- startSeqno,
1487- info.last_sequence ,
1488- info.purge_seq ,
1489- options,
1490- valOptions,
1491- count,
1492- vbState->highCompletedSeqno ,
1493- configuration,
1494- collectionsManifest);
1477+ ScanContext* sctx =
1478+ new ScanContext (cb,
1479+ cl,
1480+ vbid,
1481+ scanId,
1482+ startSeqno,
1483+ info.last_sequence ,
1484+ info.purge_seq ,
1485+ options,
1486+ valOptions,
1487+ count,
1488+ readVbStateResult.state .highCompletedSeqno ,
1489+ configuration,
1490+ collectionsManifest);
14951491 sctx->logger = &logger;
14961492 return sctx;
14971493}
@@ -2358,7 +2354,7 @@ CouchKVStore::processVbstateSnapshot(Vbid vb,
23582354 return {status, snapStart, snapEnd};
23592355}
23602356
2361- CouchKVStore::ReadVBStateStatus CouchKVStore::readVBState (Db* db, Vbid vbId) {
2357+ CouchKVStore::ReadVBStateResult CouchKVStore::readVBState (Db* db, Vbid vbId) {
23622358 sized_buf id;
23632359 LocalDoc *ldoc = NULL ;
23642360 ReadVBStateStatus status = ReadVBStateStatus::Success;
@@ -2378,7 +2374,7 @@ CouchKVStore::ReadVBStateStatus CouchKVStore::readVBState(Db* db, Vbid vbId) {
23782374 " , {}" ,
23792375 couchstore_strerror (couchStoreStatus),
23802376 vbId);
2381- return ReadVBStateStatus::CouchstoreError;
2377+ return { ReadVBStateStatus::CouchstoreError, {}} ;
23822378 }
23832379
23842380 vbucket_state vbState;
@@ -2399,7 +2395,7 @@ CouchKVStore::ReadVBStateStatus CouchKVStore::readVBState(Db* db, Vbid vbId) {
23992395 " error:{}, {}" ,
24002396 couchstore_strerror (couchStoreStatus),
24012397 vbId);
2402- return ReadVBStateStatus::CouchstoreError;
2398+ return { ReadVBStateStatus::CouchstoreError, {}} ;
24032399 }
24042400
24052401 // Proceed to read/parse the vbstate if success
@@ -2418,7 +2414,7 @@ CouchKVStore::ReadVBStateStatus CouchKVStore::readVBState(Db* db, Vbid vbId) {
24182414 vbId,
24192415 statjson,
24202416 e.what ());
2421- return ReadVBStateStatus::JsonInvalid;
2417+ return { ReadVBStateStatus::JsonInvalid, {}} ;
24222418 }
24232419
24242420 // Merge in the high_seqno & purge_seqno read previously from db info.
@@ -2437,7 +2433,7 @@ CouchKVStore::ReadVBStateStatus CouchKVStore::readVBState(Db* db, Vbid vbId) {
24372433 vbId,
24382434 json.dump (),
24392435 e.what ());
2440- return ReadVBStateStatus::JsonInvalid;
2436+ return { ReadVBStateStatus::JsonInvalid, {}} ;
24412437 }
24422438
24432439 // MB-17517: If the maxCas on disk was invalid then don't use it -
@@ -2465,12 +2461,18 @@ CouchKVStore::ReadVBStateStatus CouchKVStore::readVBState(Db* db, Vbid vbId) {
24652461 couchstore_free_local_document (ldoc);
24662462 }
24672463
2468- if (status == ReadVBStateStatus::Success) {
2464+ return {status, vbState};
2465+ }
2466+
2467+ CouchKVStore::ReadVBStateResult CouchKVStore::readVBStateAndUpdateCache (
2468+ Db* db, Vbid vbid) {
2469+ auto res = readVBState (db, vbid);
2470+ if (res.status == ReadVBStateStatus::Success) {
24692471 // Cannot use make_unique here as it doesn't support
24702472 // brace-initialization until C++20.
2471- cachedVBStates[vbId .get ()].reset (new vbucket_state (vbState ));
2473+ cachedVBStates[vbid .get ()].reset (new vbucket_state (res. state ));
24722474 }
2473- return status ;
2475+ return res ;
24742476}
24752477
24762478couchstore_error_t CouchKVStore::saveVBState (Db *db,
@@ -2876,7 +2878,8 @@ RollbackResult CouchKVStore::rollback(Vbid vbid,
28762878 return RollbackResult (false );
28772879 }
28782880
2879- if (readVBState (newdb, vbid) != ReadVBStateStatus::Success) {
2881+ if (readVBStateAndUpdateCache (newdb, vbid).status !=
2882+ ReadVBStateStatus::Success) {
28802883 return RollbackResult (false );
28812884 }
28822885 cachedDeleteCount[vbid.get ()] = info.deleted_count ;
0 commit comments