diff -ur leveldb-1.9.0.orig/db/db_test.cc leveldb-1.9.0/db/db_test.cc --- leveldb-1.9.0.orig/db/db_test.cc 2013-01-07 21:07:29.000000000 +0000 +++ leveldb-1.9.0/db/db_test.cc 2014-03-28 22:58:59.000000000 +0000 @@ -139,7 +139,7 @@ Status s = target()->NewWritableFile(f, r); if (s.ok()) { - if (strstr(f.c_str(), ".sst") != NULL) { + if (strstr(f.c_str(), ".sst") != NULL || strstr(f.c_str(), ".ldb") != NULL) { *r = new SSTableFile(this, *r); } else if (strstr(f.c_str(), "MANIFEST") != NULL) { *r = new ManifestFile(this, *r); diff -ur leveldb-1.9.0.orig/db/filename.cc leveldb-1.9.0/db/filename.cc --- leveldb-1.9.0.orig/db/filename.cc 2013-01-07 21:07:29.000000000 +0000 +++ leveldb-1.9.0/db/filename.cc 2014-03-28 23:07:48.000000000 +0000 @@ -34,6 +34,11 @@ return MakeFileName(name, number, "sst"); } +std::string LDBTableFileName(const std::string& name, uint64_t number) { + assert(number > 0); + return MakeFileName(name, number, "ldb"); +} + std::string DescriptorFileName(const std::string& dbname, uint64_t number) { assert(number > 0); char buf[100]; @@ -106,7 +111,7 @@ Slice suffix = rest; if (suffix == Slice(".log")) { *type = kLogFile; - } else if (suffix == Slice(".sst")) { + } else if (suffix == Slice(".sst") || suffix == Slice(".ldb")) { *type = kTableFile; } else if (suffix == Slice(".dbtmp")) { *type = kTempFile; diff -ur leveldb-1.9.0.orig/db/filename.h leveldb-1.9.0/db/filename.h --- leveldb-1.9.0.orig/db/filename.h 2013-01-07 21:07:29.000000000 +0000 +++ leveldb-1.9.0/db/filename.h 2014-03-28 23:07:43.000000000 +0000 @@ -36,6 +36,7 @@ // in the db named by "dbname". The result will be prefixed with // "dbname". extern std::string TableFileName(const std::string& dbname, uint64_t number); +extern std::string LDBTableFileName(const std::string& dbname, uint64_t number); // Return the name of the descriptor file for the db named by // "dbname" and the specified incarnation number. The result will be diff -ur leveldb-1.9.0.orig/db/repair.cc leveldb-1.9.0/db/repair.cc --- leveldb-1.9.0.orig/db/repair.cc 2013-01-07 21:07:29.000000000 +0000 +++ leveldb-1.9.0/db/repair.cc 2014-03-28 23:13:28.000000000 +0000 @@ -263,6 +263,14 @@ std::string fname = TableFileName(dbname_, t->meta.number); int counter = 0; Status status = env_->GetFileSize(fname, &t->meta.file_size); + if (!status.ok()) { + // Try alternate file name. + fname = LDBTableFileName(dbname_, t->meta.number); + Status s2 = env_->GetFileSize(fname, &t->meta.file_size); + if (s2.ok()) { + status = Status::OK(); + } + } if (status.ok()) { Iterator* iter = table_cache_->NewIterator( ReadOptions(), t->meta.number, t->meta.file_size); diff -ur leveldb-1.9.0.orig/db/table_cache.cc leveldb-1.9.0/db/table_cache.cc --- leveldb-1.9.0.orig/db/table_cache.cc 2013-01-07 21:07:29.000000000 +0000 +++ leveldb-1.9.0/db/table_cache.cc 2014-03-28 23:12:39.000000000 +0000 @@ -54,6 +54,12 @@ RandomAccessFile* file = NULL; Table* table = NULL; s = env_->NewRandomAccessFile(fname, &file); + if (!s.ok()) { + std::string ldb_fname = LDBTableFileName(dbname_, file_number); + if (env_->NewRandomAccessFile(ldb_fname, &file).ok()) { + s = Status::OK(); + } + } if (s.ok()) { s = Table::Open(*options_, file, file_size, &table); }