]> git-server-git.apps.pok.os.sepia.ceph.com Git - rocksdb.git/commitdiff
Initialize threads later in constructor
authorAaron Feldman <agf@fb.com>
Tue, 7 Jul 2015 17:49:16 +0000 (10:49 -0700)
committeragiardullo <agiardullo@fb.com>
Tue, 7 Jul 2015 19:35:58 +0000 (12:35 -0700)
Summary: This addresses a test failure where an exception occured in the constructor's call to CreateDirIfMissing(). The existence of unjoined threads prevented this exception from propogating properly. See http://stackoverflow.com/questions/7381757/c-terminate-called-without-an-active-exception

Test Plan: Re-run tests from task #7626266

Reviewers: sdong, anthony, igor

Reviewed By: igor

Subscribers: dhruba

Differential Revision: https://reviews.facebook.net/D41313
(cherry picked from commit e12b403991217c5472135a1e2f8faad1b915d011)

utilities/backupable/backupable_db.cc

index a450a4a82cfd7cb6dbc040cfbfac87bc4ba462df..0b5d07159f814b2ac5c027e5b97d7389edd8e3a9 100644 (file)
@@ -442,26 +442,6 @@ BackupEngineImpl::BackupEngineImpl(Env* db_env,
       copy_file_buffer_size_(kDefaultCopyFileBufferSize),
       read_only_(read_only) {
 
-  // set up threads perform copies from files_to_copy_ in the background
-  for (int t = 0; t < options_.max_background_operations; t++) {
-    threads_.emplace_back([&]() {
-      CopyWorkItem work_item;
-      while (files_to_copy_.read(work_item)) {
-        CopyResult result;
-        result.status = CopyFile(work_item.src_path,
-                                 work_item.dst_path,
-                                 work_item.src_env,
-                                 work_item.dst_env,
-                                 work_item.sync,
-                                 work_item.rate_limiter,
-                                 &result.size,
-                                 &result.checksum_value,
-                                 work_item.size_limit);
-        work_item.result.set_value(std::move(result));
-      }
-    });
-  }
-
   if (read_only_) {
     Log(options_.info_log, "Starting read_only backup engine");
   }
@@ -581,6 +561,27 @@ BackupEngineImpl::BackupEngineImpl(Env* db_env,
   if (!read_only_) {
     PutLatestBackupFileContents(latest_backup_id_);  // Ignore errors
   }
+
+  // set up threads perform copies from files_to_copy_ in the background
+  for (int t = 0; t < options_.max_background_operations; t++) {
+    threads_.emplace_back([&]() {
+      CopyWorkItem work_item;
+      while (files_to_copy_.read(work_item)) {
+        CopyResult result;
+        result.status = CopyFile(work_item.src_path,
+                                 work_item.dst_path,
+                                 work_item.src_env,
+                                 work_item.dst_env,
+                                 work_item.sync,
+                                 work_item.rate_limiter,
+                                 &result.size,
+                                 &result.checksum_value,
+                                 work_item.size_limit);
+        work_item.result.set_value(std::move(result));
+      }
+    });
+  }
+
   Log(options_.info_log, "Initialized BackupEngine");
 }