@@ -2206,6 +2206,92 @@ TEST(DBTest, NumImmutableMemTable) {
2206
2206
} while (ChangeCompactOptions ());
2207
2207
}
2208
2208
2209
+ class SleepingBackgroundTask {
2210
+ public:
2211
+ SleepingBackgroundTask () : bg_cv_(&mutex_), should_sleep_(true ) {}
2212
+ void DoSleep () {
2213
+ MutexLock l (&mutex_);
2214
+ while (should_sleep_) {
2215
+ bg_cv_.Wait ();
2216
+ }
2217
+ }
2218
+ void WakeUp () {
2219
+ MutexLock l (&mutex_);
2220
+ should_sleep_ = false ;
2221
+ bg_cv_.SignalAll ();
2222
+ }
2223
+
2224
+ static void DoSleepTask (void * arg) {
2225
+ reinterpret_cast <SleepingBackgroundTask*>(arg)->DoSleep ();
2226
+ }
2227
+
2228
+ private:
2229
+ port::Mutex mutex_;
2230
+ port::CondVar bg_cv_; // Signalled when background work finishes
2231
+ bool should_sleep_;
2232
+ };
2233
+
2234
+ TEST (DBTest, GetProperty) {
2235
+ // Set sizes to both background thread pool to be 1 and block them.
2236
+ env_->SetBackgroundThreads (1 , Env::HIGH);
2237
+ env_->SetBackgroundThreads (1 , Env::LOW);
2238
+ SleepingBackgroundTask sleeping_task_low;
2239
+ env_->Schedule (&SleepingBackgroundTask::DoSleepTask, &sleeping_task_low,
2240
+ Env::Priority::LOW);
2241
+ SleepingBackgroundTask sleeping_task_high;
2242
+ env_->Schedule (&SleepingBackgroundTask::DoSleepTask, &sleeping_task_high,
2243
+ Env::Priority::HIGH);
2244
+
2245
+ Options options = CurrentOptions ();
2246
+ WriteOptions writeOpt = WriteOptions ();
2247
+ writeOpt.disableWAL = true ;
2248
+ options.compaction_style = kCompactionStyleUniversal ;
2249
+ options.level0_file_num_compaction_trigger = 1 ;
2250
+ options.compaction_options_universal .size_ratio = 50 ;
2251
+ options.max_background_compactions = 1 ;
2252
+ options.max_background_flushes = 1 ;
2253
+ options.max_write_buffer_number = 10 ;
2254
+ options.min_write_buffer_number_to_merge = 1 ;
2255
+ options.write_buffer_size = 1000000 ;
2256
+ Reopen (&options);
2257
+
2258
+ std::string big_value (1000000 * 2 , ' x' );
2259
+ std::string num;
2260
+ SetPerfLevel (kEnableTime );
2261
+
2262
+ ASSERT_OK (dbfull ()->Put (writeOpt, " k1" , big_value));
2263
+ ASSERT_TRUE (dbfull ()->GetProperty (" rocksdb.num-immutable-mem-table" , &num));
2264
+ ASSERT_EQ (num, " 0" );
2265
+ ASSERT_TRUE (dbfull ()->GetProperty (" rocksdb.mem-table-flush-pending" , &num));
2266
+ ASSERT_EQ (num, " 0" );
2267
+ ASSERT_TRUE (dbfull ()->GetProperty (" rocksdb.compaction-pending" , &num));
2268
+ ASSERT_EQ (num, " 0" );
2269
+ perf_context.Reset ();
2270
+
2271
+ ASSERT_OK (dbfull ()->Put (writeOpt, " k2" , big_value));
2272
+ ASSERT_TRUE (dbfull ()->GetProperty (" rocksdb.num-immutable-mem-table" , &num));
2273
+ ASSERT_EQ (num, " 1" );
2274
+ ASSERT_OK (dbfull ()->Put (writeOpt, " k3" , big_value));
2275
+ ASSERT_TRUE (dbfull ()->GetProperty (" rocksdb.num-immutable-mem-table" , &num));
2276
+ ASSERT_EQ (num, " 2" );
2277
+ ASSERT_TRUE (dbfull ()->GetProperty (" rocksdb.mem-table-flush-pending" , &num));
2278
+ ASSERT_EQ (num, " 1" );
2279
+ ASSERT_TRUE (dbfull ()->GetProperty (" rocksdb.compaction-pending" , &num));
2280
+ ASSERT_EQ (num, " 0" );
2281
+
2282
+ sleeping_task_high.WakeUp ();
2283
+ dbfull ()->TEST_WaitForFlushMemTable ();
2284
+
2285
+ ASSERT_OK (dbfull ()->Put (writeOpt, " k4" , big_value));
2286
+ ASSERT_OK (dbfull ()->Put (writeOpt, " k5" , big_value));
2287
+ dbfull ()->TEST_WaitForFlushMemTable ();
2288
+ ASSERT_TRUE (dbfull ()->GetProperty (" rocksdb.mem-table-flush-pending" , &num));
2289
+ ASSERT_EQ (num, " 0" );
2290
+ ASSERT_TRUE (dbfull ()->GetProperty (" rocksdb.compaction-pending" , &num));
2291
+ ASSERT_EQ (num, " 1" );
2292
+ sleeping_task_low.WakeUp ();
2293
+ }
2294
+
2209
2295
TEST (DBTest, FLUSH) {
2210
2296
do {
2211
2297
CreateAndReopenWithCF ({" pikachu" });
@@ -4286,6 +4372,11 @@ TEST(DBTest, NoSpace) {
4286
4372
dbfull ()->TEST_CompactRange (level, nullptr , nullptr );
4287
4373
}
4288
4374
}
4375
+
4376
+ std::string property_value;
4377
+ ASSERT_TRUE (db_->GetProperty (" rocksdb.background-errors" , &property_value));
4378
+ ASSERT_EQ (" 5" , property_value);
4379
+
4289
4380
env_->no_space_ .Release_Store (nullptr );
4290
4381
ASSERT_LT (CountFiles (), num_files + 3 );
4291
4382
@@ -4294,6 +4385,43 @@ TEST(DBTest, NoSpace) {
4294
4385
} while (ChangeCompactOptions ());
4295
4386
}
4296
4387
4388
+ // Check background error counter bumped on flush failures.
4389
+ TEST (DBTest, NoSpaceFlush) {
4390
+ do {
4391
+ Options options = CurrentOptions ();
4392
+ options.env = env_;
4393
+ options.max_background_flushes = 1 ;
4394
+ Reopen (&options);
4395
+
4396
+ ASSERT_OK (Put (" foo" , " v1" ));
4397
+ env_->no_space_ .Release_Store (env_); // Force out-of-space errors
4398
+
4399
+ std::string property_value;
4400
+ // Background error count is 0 now.
4401
+ ASSERT_TRUE (db_->GetProperty (" rocksdb.background-errors" , &property_value));
4402
+ ASSERT_EQ (" 0" , property_value);
4403
+
4404
+ dbfull ()->TEST_FlushMemTable (false );
4405
+
4406
+ // Wait 300 milliseconds or background-errors turned 1 from 0.
4407
+ int time_to_sleep_limit = 300000 ;
4408
+ while (time_to_sleep_limit > 0 ) {
4409
+ int to_sleep = (time_to_sleep_limit > 1000 ) ? 1000 : time_to_sleep_limit;
4410
+ time_to_sleep_limit -= to_sleep;
4411
+ env_->SleepForMicroseconds (to_sleep);
4412
+
4413
+ ASSERT_TRUE (
4414
+ db_->GetProperty (" rocksdb.background-errors" , &property_value));
4415
+ if (property_value == " 1" ) {
4416
+ break ;
4417
+ }
4418
+ }
4419
+ ASSERT_EQ (" 1" , property_value);
4420
+
4421
+ env_->no_space_ .Release_Store (nullptr );
4422
+ } while (ChangeCompactOptions ());
4423
+ }
4424
+
4297
4425
TEST (DBTest, NonWritableFileSystem) {
4298
4426
do {
4299
4427
Options options = CurrentOptions ();
0 commit comments