@@ -320,11 +320,12 @@ void SingleThreadedKVBucketTest::createDcpStream(MockDcpProducer& producer,
320320}
321321
322322void SingleThreadedKVBucketTest::runCompaction (uint64_t purgeBeforeTime,
323- uint64_t purgeBeforeSeq) {
323+ uint64_t purgeBeforeSeq,
324+ bool dropDeletes) {
324325 CompactionConfig compactConfig;
325326 compactConfig.purge_before_ts = purgeBeforeTime;
326327 compactConfig.purge_before_seq = purgeBeforeSeq;
327- compactConfig.drop_deletes = false ;
328+ compactConfig.drop_deletes = dropDeletes ;
328329 compactConfig.db_file_id = vbid;
329330 store->scheduleCompaction (vbid, compactConfig, nullptr );
330331 // run the compaction task
@@ -5151,6 +5152,97 @@ TEST_P(STParamPersistentBucketTest, FlushFailureAtPerstingDelete_VBDeletion) {
51515152 testFlushFailureAtPersistDelete (COUCHSTORE_ERROR_WRITE, true );
51525153}
51535154
5155+ TEST_P (STParameterizedBucketTest, DeleteUpdatesPersistedDeletes) {
5156+ store->setVBucketState (vbid, vbucket_state_active);
5157+
5158+ auto vb = store->getVBucket (vbid);
5159+ ASSERT_TRUE (vb);
5160+ EXPECT_EQ (0 , vb->getNumPersistedDeletes ());
5161+
5162+ store_item (vbid,
5163+ makeStoredDocKey (" keyA" ),
5164+ " value" ,
5165+ 0 /* exptime*/ ,
5166+ {cb::engine_errc::success} /* expected*/ ,
5167+ PROTOCOL_BINARY_RAW_BYTES);
5168+ delete_item (vbid, makeStoredDocKey (" keyA" ));
5169+
5170+ flushVBucketToDiskIfPersistent (vbid, 1 );
5171+
5172+ // Before the bug fix the stat would be wrong as we'd read from the RO
5173+ // store but only update the cached value in the RW store.
5174+ EXPECT_EQ (1 , vb->getNumPersistedDeletes ());
5175+ }
5176+
5177+ void STParamPersistentBucketTest::testCompactionPersistedDeletes (
5178+ bool dropDeletes) {
5179+ store->setVBucketState (vbid, vbucket_state_active);
5180+
5181+ flushVBucketToDiskIfPersistent (vbid, 0 );
5182+
5183+ auto vb = store->getVBucket (vbid);
5184+ ASSERT_TRUE (vb);
5185+ ASSERT_NE (0 , vb->getFilterSize ());
5186+
5187+ // Stat should be correct and we should populate the cached value
5188+ EXPECT_EQ (0 , vb->getNumPersistedDeletes ());
5189+
5190+ // Persist first delete
5191+ store_item (vbid,
5192+ makeStoredDocKey (" keyA" ),
5193+ " value" ,
5194+ 0 /* exptime*/ ,
5195+ {cb::engine_errc::success} /* expected*/ ,
5196+ PROTOCOL_BINARY_RAW_BYTES);
5197+ delete_item (vbid, makeStoredDocKey (" keyA" ));
5198+
5199+ store_item (vbid,
5200+ makeStoredDocKey (" keyB" ),
5201+ " value" ,
5202+ 0 /* exptime*/ ,
5203+ {cb::engine_errc::success} /* expected*/ ,
5204+ PROTOCOL_BINARY_RAW_BYTES);
5205+ delete_item (vbid, makeStoredDocKey (" keyB" ));
5206+
5207+ flushVBucketToDiskIfPersistent (vbid, 2 );
5208+
5209+ EXPECT_EQ (2 , vb->getNumPersistedDeletes ());
5210+
5211+ runCompaction (0 , 0 , dropDeletes);
5212+ }
5213+
5214+ TEST_P (STParamPersistentBucketTest, CompactionUpdatesPersistedDeletes) {
5215+ testCompactionPersistedDeletes (true /* dropDeletes*/ );
5216+
5217+ auto vb = store->getVBucket (vbid);
5218+ ASSERT_TRUE (vb);
5219+
5220+ // Before the bug fix the stat would be wrong as we'd read from the RO
5221+ // store but only update the cached value in the RW store. This won't be 0
5222+ // even though we have 2 deletes as we keep the last item during a
5223+ // compaction.
5224+ EXPECT_EQ (1 , vb->getNumPersistedDeletes ());
5225+ }
5226+
5227+ TEST_P (STParamPersistentBucketTest, CompactionUpdatesBloomFilter) {
5228+ engine->getConfiguration ().setBfilterKeyCount (1 );
5229+
5230+ testCompactionPersistedDeletes (false /* dropDeletes*/ );
5231+
5232+ auto vb = store->getVBucket (vbid);
5233+ ASSERT_TRUE (vb);
5234+
5235+ // Before the bug fix the stat would be wrong as we'd read from the RO
5236+ // store but only update the cached value in the RW store.
5237+ EXPECT_EQ (2 , vb->getNumPersistedDeletes ());
5238+
5239+ auto expected = 29 ;
5240+ if (fullEviction ()) {
5241+ expected = 10 ;
5242+ }
5243+ EXPECT_EQ (expected, vb->getFilterSize ());
5244+ }
5245+
51545246TEST_P (STParamPersistentBucketTest, FlusherMarksCleanBySeqno) {
51555247 setVBucketStateAndRunPersistTask (vbid, vbucket_state_active);
51565248
0 commit comments