From e12b403991217c5472135a1e2f8faad1b915d011 Mon Sep 17 00:00:00 2001 From: Aaron Feldman Date: Tue, 7 Jul 2015 10:49:16 -0700 Subject: [PATCH] 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 --- utilities/backupable/backupable_db.cc | 41 ++++++++++++++------------- 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/utilities/backupable/backupable_db.cc b/utilities/backupable/backupable_db.cc index a450a4a82..0b5d07159 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"); }