From: Kevin James Matzen Date: Mon, 13 Oct 2014 00:43:01 +0000 (-0400) Subject: The LevelDB iterator/DB deallocation order bug is pretty much fixed by having each... X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=2200a7a4b1f7fa7ac5fac7a2463552e8fe0ca9c2;p=platform%2Fupstream%2Fcaffe.git The LevelDB iterator/DB deallocation order bug is pretty much fixed by having each iterator hold a shared pointer to the DB. I manually specified a deconstructor for the LeveldbState to make it clear what order these two things need to be deallocated in. --- diff --git a/include/caffe/leveldb_database.hpp b/include/caffe/leveldb_database.hpp index e2558ff..2a610a3 100644 --- a/include/caffe/leveldb_database.hpp +++ b/include/caffe/leveldb_database.hpp @@ -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 clone() { shared_ptr new_iter; diff --git a/src/caffe/layers/data_layer.cpp b/src/caffe/layers/data_layer.cpp index dcba10f..c379d78 100644 --- a/src/caffe/layers/data_layer.cpp +++ b/src/caffe/layers/data_layer.cpp @@ -18,10 +18,6 @@ template DataLayer::~DataLayer() { 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(); } diff --git a/src/caffe/test/test_database.cpp b/src/caffe/test/test_database.cpp index 70e1d96..3dd2006 100644 --- a/src/caffe/test/test_database.cpp +++ b/src/caffe/test/test_database.cpp @@ -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(); } diff --git a/tools/compute_image_mean.cpp b/tools/compute_image_mean.cpp index b973c52..5f6ea6e 100644 --- a/tools/compute_image_mean.cpp +++ b/tools/compute_image_mean.cpp @@ -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());