@@ -83,6 +83,46 @@ class ColumnFamilyTest {
83
83
return result;
84
84
}
85
85
86
+ void Compact (int cf, const Slice& start, const Slice& limit) {
87
+ ASSERT_OK (db_->CompactRange (handles_[cf], &start, &limit));
88
+ }
89
+
90
+ int NumTableFilesAtLevel (int cf, int level) {
91
+ string property;
92
+ ASSERT_TRUE (db_->GetProperty (
93
+ handles_[cf], " rocksdb.num-files-at-level" + NumberToString (level),
94
+ &property));
95
+ return atoi (property.c_str ());
96
+ }
97
+
98
+ // Return spread of files per level
99
+ string FilesPerLevel (int cf) {
100
+ string result;
101
+ int last_non_zero_offset = 0 ;
102
+ for (int level = 0 ; level < column_family_options_.num_levels ; level++) {
103
+ int f = NumTableFilesAtLevel (cf, level);
104
+ char buf[100 ];
105
+ snprintf (buf, sizeof (buf), " %s%d" , (level ? " ," : " " ), f);
106
+ result += buf;
107
+ if (f > 0 ) {
108
+ last_non_zero_offset = result.size ();
109
+ }
110
+ }
111
+ result.resize (last_non_zero_offset);
112
+ return result;
113
+ }
114
+
115
+ // Do n memtable flushes, each of which produces an sstable
116
+ // covering the range [small,large].
117
+ void MakeTables (int cf, int n, const string& small,
118
+ const string& large) {
119
+ for (int i = 0 ; i < n; i++) {
120
+ ASSERT_OK (Put (cf, small, " begin" ));
121
+ ASSERT_OK (Put (cf, large, " end" ));
122
+ ASSERT_OK (db_->Flush (FlushOptions (), handles_[cf]));
123
+ }
124
+ }
125
+
86
126
void CopyFile (const string& source, const string& destination,
87
127
uint64_t size = 0 ) {
88
128
const EnvOptions soptions;
@@ -111,7 +151,7 @@ class ColumnFamilyTest {
111
151
ColumnFamilyOptions column_family_options_;
112
152
DBOptions db_options_;
113
153
string dbname_;
114
- DB* db_;
154
+ DB* db_ = nullptr ;
115
155
Env* env_;
116
156
};
117
157
@@ -274,6 +314,52 @@ TEST(ColumnFamilyTest, FlushTest) {
274
314
Close ();
275
315
}
276
316
317
+ // This is the same as DBTest::ManualCompaction, but it does all
318
+ // operations on non-default column family
319
+ TEST (ColumnFamilyTest, ManualCompaction) {
320
+ // iter - 0 with 7 levels
321
+ // iter - 1 with 3 levels
322
+ int cf = 1 ;
323
+ for (int iter = 0 ; iter < 2 ; ++iter) {
324
+ column_family_options_.num_levels = (iter == 0 ) ? 3 : 7 ;
325
+ Destroy ();
326
+ ASSERT_OK (Open ({" default" }));
327
+ CreateColumnFamilies ({" one" });
328
+ Close ();
329
+ ASSERT_OK (Open ({" default" , " one" }));
330
+
331
+ MakeTables (cf, 3 , " p" , " q" );
332
+ ASSERT_EQ (" 1,1,1" , FilesPerLevel (cf));
333
+
334
+ // Compaction range falls before files
335
+ Compact (cf, " " , " c" );
336
+ ASSERT_EQ (" 1,1,1" , FilesPerLevel (cf));
337
+
338
+ // Compaction range falls after files
339
+ Compact (cf, " r" , " z" );
340
+ ASSERT_EQ (" 1,1,1" , FilesPerLevel (cf));
341
+
342
+ // Compaction range overlaps files
343
+ Compact (cf, " p1" , " p9" );
344
+ ASSERT_EQ (" 0,0,1" , FilesPerLevel (cf));
345
+
346
+ // Populate a different range
347
+ MakeTables (cf, 3 , " c" , " e" );
348
+ ASSERT_EQ (" 1,1,2" , FilesPerLevel (cf));
349
+
350
+ // Compact just the new range
351
+ Compact (cf, " b" , " f" );
352
+ ASSERT_EQ (" 0,0,2" , FilesPerLevel (cf));
353
+
354
+ // Compact all
355
+ MakeTables (cf, 1 , " a" , " z" );
356
+ ASSERT_EQ (" 0,1,2" , FilesPerLevel (cf));
357
+ Compact (cf, " " , " zzz" );
358
+ ASSERT_EQ (" 0,0,1" , FilesPerLevel (cf));
359
+ }
360
+ Close ();
361
+ }
362
+
277
363
278
364
} // namespace rocksdb
279
365
0 commit comments