diff options
author | cmumford <cmumford@google.com> | 2017-10-17 13:05:47 -0700 |
---|---|---|
committer | Victor Costan <pwnall@chromium.org> | 2017-11-03 15:03:20 -0700 |
commit | 0509414f858ae7c7225e29f3659a709afb324355 (patch) | |
tree | 3d5a69be50a6298d40d3bc6537c687baf11b1118 /db/db_test.cc | |
parent | 23162ca1c6d891a9c5fe0e0fab1193cd54ed1b4f (diff) | |
download | leveldb-0509414f858ae7c7225e29f3659a709afb324355.tar.gz |
leveldb::DestroyDB will now delete empty directories.
Env's that filtered out dot files ("." and "..") would return an
empty vector of children causing DestroyDB to do nothing. This fixes
https://github.com/google/leveldb/issues/215
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=172501335
Diffstat (limited to 'db/db_test.cc')
-rw-r--r-- | db/db_test.cc | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/db/db_test.cc b/db/db_test.cc index edc3916..c818113 100644 --- a/db/db_test.cc +++ b/db/db_test.cc @@ -61,6 +61,36 @@ void DelayMilliseconds(int millis) { } } +// Test Env to override default Env behavior for testing. +class TestEnv : public EnvWrapper { + public: + explicit TestEnv(Env* base) : EnvWrapper(base), ignore_dot_files_(false) {} + + void SetIgnoreDotFiles(bool ignored) { ignore_dot_files_ = ignored; } + + Status GetChildren(const std::string& dir, + std::vector<std::string>* result) override { + Status s = target()->GetChildren(dir, result); + if (!s.ok() || !ignore_dot_files_) { + return s; + } + + std::vector<std::string>::iterator it = result->begin(); + while (it != result->end()) { + if ((*it == ".") || (*it == "..")) { + it = result->erase(it); + } else { + ++it; + } + } + + return s; + } + + private: + bool ignore_dot_files_; +}; + // Special Env used to delay background operations class SpecialEnv : public EnvWrapper { public: @@ -1561,6 +1591,58 @@ TEST(DBTest, DBOpen_Options) { db = NULL; } +TEST(DBTest, DestroyEmptyDir) { + std::string dbname = test::TmpDir() + "/db_empty_dir"; + TestEnv env(Env::Default()); + env.DeleteDir(dbname); + ASSERT_TRUE(!env.FileExists(dbname)); + + Options opts; + opts.env = &env; + + ASSERT_OK(env.CreateDir(dbname)); + ASSERT_TRUE(env.FileExists(dbname)); + std::vector<std::string> children; + ASSERT_OK(env.GetChildren(dbname, &children)); + // The POSIX env does not filter out '.' and '..' special files. + ASSERT_EQ(2, children.size()); + ASSERT_OK(DestroyDB(dbname, opts)); + ASSERT_TRUE(!env.FileExists(dbname)); + + // Should also be destroyed if Env is filtering out dot files. + env.SetIgnoreDotFiles(true); + ASSERT_OK(env.CreateDir(dbname)); + ASSERT_TRUE(env.FileExists(dbname)); + ASSERT_OK(env.GetChildren(dbname, &children)); + ASSERT_EQ(0, children.size()); + ASSERT_OK(DestroyDB(dbname, opts)); + ASSERT_TRUE(!env.FileExists(dbname)); +} + +TEST(DBTest, DestroyOpenDB) { + std::string dbname = test::TmpDir() + "/open_db_dir"; + env_->DeleteDir(dbname); + ASSERT_TRUE(!env_->FileExists(dbname)); + + Options opts; + opts.create_if_missing = true; + DB* db = NULL; + ASSERT_OK(DB::Open(opts, dbname, &db)); + ASSERT_TRUE(db != NULL); + + // Must fail to destroy an open db. + ASSERT_TRUE(env_->FileExists(dbname)); + ASSERT_TRUE(!DestroyDB(dbname, Options()).ok()); + ASSERT_TRUE(env_->FileExists(dbname)); + + delete db; + db = NULL; + + // Should succeed destroying a closed db. + ASSERT_OK(DestroyDB(dbname, Options())); + ASSERT_TRUE(!env_->FileExists(dbname)); +} + TEST(DBTest, Locking) { DB* db2 = NULL; Status s = DB::Open(CurrentOptions(), dbname_, &db2); |