]> git-server-git.apps.pok.os.sepia.ceph.com Git - rocksdb.git/commitdiff
Avoid type unique_ptr in LogWriterNumber::writer for Windows build break
authorsdong <siying.d@fb.com>
Thu, 6 Aug 2015 03:51:27 +0000 (20:51 -0700)
committersdong <siying.d@fb.com>
Thu, 6 Aug 2015 17:52:41 +0000 (10:52 -0700)
Summary:
Visual Studio complains about deque<LogWriterNumber> because LogWriterNumber is non-copyable for its unique_ptr member writer. Move away from it, and do explit free.
It is less safe but I can't think of a better way to unblock it.

Test Plan: valgrind check test

Reviewers: anthony, IslamAbdelRahman, kolmike, rven, yhchiang

Reviewed By: yhchiang

Subscribers: leveldb, dhruba

Differential Revision: https://reviews.facebook.net/D43647

db/db_impl.cc
db/db_impl.h

index 10f1d2675dcaa62e5a30213097bb599866440b64..7652a66d616985645ee5a7492d0e6a32eead1901 100644 (file)
@@ -369,6 +369,9 @@ DBImpl::~DBImpl() {
   for (auto l : logs_to_free_) {
     delete l;
   }
+  for (auto& log : logs_) {
+    log.ClearWriter();
+  }
   logs_.clear();
 
   // versions need to be destroyed before table_cache since it can hold
@@ -557,7 +560,7 @@ void DBImpl::FindObsoleteFiles(JobContext* job_context, bool force,
         // logs_ could have changed while we were waiting.
         continue;
       }
-      logs_to_free_.push_back(log.writer.release());
+      logs_to_free_.push_back(log.ReleaseWriter());
       logs_.pop_front();
     }
     // Current log cannot be obsolete.
@@ -1978,7 +1981,7 @@ Status DBImpl::SyncWAL() {
       auto& log = *it;
       assert(!log.getting_synced);
       log.getting_synced = true;
-      logs_to_sync.push_back(log.writer.get());
+      logs_to_sync.push_back(log.writer);
     }
 
     need_log_dir_sync = !log_dir_synced_;
@@ -2015,7 +2018,7 @@ void DBImpl::MarkLogsSynced(
     auto& log = *it;
     assert(log.getting_synced);
     if (status.ok() && logs_.size() > 1) {
-      logs_to_free_.push_back(log.writer.release());
+      logs_to_free_.push_back(log.ReleaseWriter());
       logs_.erase(it++);
     } else {
       log.getting_synced = false;
@@ -3805,7 +3808,7 @@ Status DBImpl::SwitchMemtable(ColumnFamilyData* cfd, WriteContext* context) {
     assert(new_log != nullptr);
     log_empty_ = true;
     log_dir_synced_ = false;
-    logs_.emplace_back(logfile_number_, std::unique_ptr<log::Writer>(new_log));
+    logs_.emplace_back(logfile_number_, new_log);
     alive_log_files_.push_back(LogFileNumberSize(logfile_number_));
     for (auto loop_cfd : *versions_->GetColumnFamilySet()) {
       // all this is just optimization to delete logs that
@@ -4338,10 +4341,8 @@ Status DB::Open(const DBOptions& db_options, const std::string& dbname,
       impl->logfile_number_ = new_log_number;
       unique_ptr<WritableFileWriter> file_writer(
           new WritableFileWriter(std::move(lfile), opt_env_options));
-      impl->logs_.emplace_back(
-          new_log_number,
-          std::unique_ptr<log::Writer>(
-            new log::Writer(std::move(file_writer))));
+      impl->logs_.emplace_back(new_log_number,
+                               new log::Writer(std::move(file_writer)));
 
       // set column family handles
       for (auto cf : column_families) {
index bdec031f7021cbda9d24a6bca50b37cbd86995ad..3dd95f8b2863f75a078fcdf404e18f8e44fc8239 100644 (file)
@@ -532,10 +532,24 @@ class DBImpl : public DB {
     bool getting_flushed = false;
   };
   struct LogWriterNumber {
-    LogWriterNumber(uint64_t _number, std::unique_ptr<log::Writer> _writer)
-        : number(_number), writer(std::move(_writer)) {}
+    // pass ownership of _writer
+    LogWriterNumber(uint64_t _number, log::Writer* _writer)
+        : number(_number), writer(_writer) {}
+
+    log::Writer* ReleaseWriter() {
+      auto* w = writer;
+      writer = nullptr;
+      return w;
+    }
+    void ClearWriter() {
+      delete writer;
+      writer = nullptr;
+    }
+
     uint64_t number;
-    std::unique_ptr<log::Writer> writer;
+    // Visual Studio doesn't support deque's member to be noncopyable because
+    // of a unique_ptr as a member.
+    log::Writer* writer;  // own
     // true for some prefix of logs_
     bool getting_synced = false;
   };