The LevelDB iterator/DB deallocation order bug is pretty much fixed by having each...
authorKevin James Matzen <kmatzen@cs.cornell.edu>
Mon, 13 Oct 2014 00:43:01 +0000 (20:43 -0400)
committerKevin James Matzen <kmatzen@cs.cornell.edu>
Tue, 14 Oct 2014 23:31:30 +0000 (19:31 -0400)
include/caffe/leveldb_database.hpp
src/caffe/layers/data_layer.cpp
src/caffe/test/test_database.cpp
tools/compute_image_mean.cpp

index e2558ff..2a610a3 100644 (file)
@@ -34,6 +34,14 @@ class LeveldbDatabase : public Database {
           db_(db),
           iter_(iter) { }
 
+    ~LeveldbState() {
+      // This order is very important.
+      // Iterators must be destroyed before their associated DB
+      // is destroyed.
+      iter_.reset();
+      db_.reset();
+    }
+
     shared_ptr<DatabaseState> clone() {
       shared_ptr<leveldb::Iterator> new_iter;
 
index dcba10f..c379d78 100644 (file)
@@ -18,10 +18,6 @@ template <typename Dtype>
 DataLayer<Dtype>::~DataLayer<Dtype>() {
   this->JoinPrefetchThread();
   // clean up the database resources
-
-  // Very important to invalidate iterators before closing the database.
-  // TODO(kmatzen): Figure out a better design to avoid this.
-  iter_ = database_->end();
   database_->close();
 }
 
index 70e1d96..3dd2006 100644 (file)
@@ -172,10 +172,6 @@ TYPED_TEST(DatabaseTest, TestIteratorsPreIncrementLevelDB) {
 
   EXPECT_TRUE(database->end() == iter3);
 
-  iter1 = database->end();
-  iter2 = database->end();
-  iter3 = database->end();
-
   database->close();
 }
 
@@ -214,10 +210,6 @@ TYPED_TEST(DatabaseTest, TestIteratorsPostIncrementLevelDB) {
   EXPECT_TRUE(this->BufferEq(iter3->key, key2));
   EXPECT_TRUE(database->end() == iter1);
 
-  iter1 = database->end();
-  iter2 = database->end();
-  iter3 = database->end();
-
   database->close();
 }
 
@@ -519,10 +511,6 @@ TYPED_TEST(DatabaseTest, TestIteratorsPreIncrementLMDB) {
 
   EXPECT_TRUE(database->end() == iter3);
 
-  iter1 = database->end();
-  iter2 = database->end();
-  iter3 = database->end();
-
   database->close();
 }
 
@@ -561,10 +549,6 @@ TYPED_TEST(DatabaseTest, TestIteratorsPostIncrementLMDB) {
   EXPECT_TRUE(this->BufferEq(iter3->key, key2));
   EXPECT_TRUE(database->end() == iter1);
 
-  iter1 = database->end();
-  iter2 = database->end();
-  iter3 = database->end();
-
   database->close();
 }
 
index b973c52..5f6ea6e 100644 (file)
@@ -38,7 +38,6 @@ int main(int argc, char** argv) {
   Database::const_iterator iter = database->begin();
   const Database::buffer_t& first_blob = iter->value;
   datum.ParseFromArray(first_blob.data(), first_blob.size());
-  iter = database->end();
 
   sum_blob.set_num(1);
   sum_blob.set_channels(datum.channels());