From: Aaron Feldman Date: Tue, 7 Jul 2015 17:49:16 +0000 (-0700) Subject: Initialize threads later in constructor X-Git-Tag: rocksdb-3.12~3 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=718309432bae4416dedc09240b033b442e477181;p=rocksdb.git Initialize threads later in constructor 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) --- diff --git a/utilities/backupable/backupable_db.cc b/utilities/backupable/backupable_db.cc index a450a4a8..0b5d0715 100644 --- a/utilities/backupable/backupable_db.cc +++ b/utilities/backupable/backupable_db.cc @@ -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"); }