@@ -47,7 +47,7 @@ class DBMergeOperandTest : public DBTestBase {
47
47
: DBTestBase(" db_merge_operand_test" , /* env_do_fsync=*/ true ) {}
48
48
};
49
49
50
- TEST_F (DBMergeOperandTest, MergeOperandReadAfterFreeBug ) {
50
+ TEST_F (DBMergeOperandTest, CacheEvictedMergeOperandReadAfterFreeBug ) {
51
51
// There was a bug of reading merge operands after they are mistakely freed
52
52
// in DB::GetMergeOperands, which is surfaced by cache full.
53
53
// See PR#9507 for more.
@@ -86,6 +86,41 @@ TEST_F(DBMergeOperandTest, MergeOperandReadAfterFreeBug) {
86
86
ASSERT_EQ (values[3 ].ToString (), " v4" );
87
87
}
88
88
89
+ TEST_F (DBMergeOperandTest, FlushedMergeOperandReadAfterFreeBug) {
90
+ // Repro for a bug where a memtable containing a merge operand could be
91
+ // deleted before the merge operand was saved to the result.
92
+ auto options = CurrentOptions ();
93
+ options.merge_operator = MergeOperators::CreateStringAppendOperator ();
94
+ Reopen (options);
95
+
96
+ ASSERT_OK (Merge (" key" , " value" ));
97
+
98
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance ()->LoadDependency (
99
+ {{" DBImpl::GetImpl:PostMemTableGet:0" ,
100
+ " DBMergeOperandTest::FlushedMergeOperandReadAfterFreeBug:PreFlush" },
101
+ {" DBMergeOperandTest::FlushedMergeOperandReadAfterFreeBug:PostFlush" ,
102
+ " DBImpl::GetImpl:PostMemTableGet:1" }});
103
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance ()->EnableProcessing ();
104
+
105
+ auto flush_thread = port::Thread ([&]() {
106
+ TEST_SYNC_POINT (
107
+ " DBMergeOperandTest::FlushedMergeOperandReadAfterFreeBug:PreFlush" );
108
+ ASSERT_OK (Flush ());
109
+ TEST_SYNC_POINT (
110
+ " DBMergeOperandTest::FlushedMergeOperandReadAfterFreeBug:PostFlush" );
111
+ });
112
+
113
+ PinnableSlice value;
114
+ GetMergeOperandsOptions merge_operands_info;
115
+ merge_operands_info.expected_max_number_of_operands = 1 ;
116
+ int number_of_operands;
117
+ ASSERT_OK (db_->GetMergeOperands (ReadOptions (), db_->DefaultColumnFamily (),
118
+ " key" , &value, &merge_operands_info,
119
+ &number_of_operands));
120
+
121
+ flush_thread.join ();
122
+ }
123
+
89
124
TEST_F (DBMergeOperandTest, GetMergeOperandsBasic) {
90
125
Options options;
91
126
options.create_if_missing = true ;
0 commit comments