summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHans Wennborg <hans@chromium.org>2011-10-31 17:22:06 +0000
committerHans Wennborg <hans@chromium.org>2011-10-31 17:22:06 +0000
commit36a5f8ed7f9fb3373236d5eace4f5fea369856ee (patch)
tree59dd30362b5471d422313b52d561c88b124a2c7a
parent299ccedfeca1fb3497978c288e76008a5c08e899 (diff)
downloadleveldb-36a5f8ed7f9fb3373236d5eace4f5fea369856ee.tar.gz
A number of fixes:
- Replace raw slice comparison with a call to user comparator. Added test for custom comparators. - Fix end of namespace comments. - Fixed bug in picking inputs for a level-0 compaction. When finding overlapping files, the covered range may expand as files are added to the input set. We now correctly expand the range when this happens instead of continuing to use the old range. For example, suppose L0 contains files with the following ranges: F1: a .. d F2: c .. g F3: f .. j and the initial compaction target is F3. We used to search for range f..j which yielded {F2,F3}. However we now expand the range as soon as another file is added. In this case, when F2 is added, we expand the range to c..j and restart the search. That picks up file F1 as well. This change fixes a bug related to deleted keys showing up incorrectly after a compaction as described in Issue 44. (Sync with upstream @25072954)
-rw-r--r--db/builder.cc2
-rw-r--r--db/builder.h2
-rw-r--r--db/corruption_test.cc2
-rw-r--r--db/db_bench.cc4
-rw-r--r--db/db_impl.cc4
-rw-r--r--db/db_impl.h2
-rw-r--r--db/db_iter.cc2
-rw-r--r--db/db_iter.h2
-rw-r--r--db/db_test.cc102
-rw-r--r--db/dbformat.cc2
-rw-r--r--db/dbformat.h4
-rw-r--r--db/dbformat_test.cc2
-rw-r--r--db/filename.cc2
-rw-r--r--db/filename.h2
-rw-r--r--db/filename_test.cc2
-rw-r--r--db/log_format.h4
-rw-r--r--db/log_reader.cc4
-rw-r--r--db/log_reader.h4
-rw-r--r--db/log_test.cc4
-rw-r--r--db/log_writer.cc4
-rw-r--r--db/log_writer.h4
-rw-r--r--db/memtable.cc2
-rw-r--r--db/memtable.h2
-rw-r--r--db/repair.cc4
-rw-r--r--db/skiplist.h2
-rw-r--r--db/skiplist_test.cc2
-rw-r--r--db/snapshot.h2
-rw-r--r--db/table_cache.cc2
-rw-r--r--db/table_cache.h2
-rw-r--r--db/version_edit.cc2
-rw-r--r--db/version_edit.h2
-rw-r--r--db/version_edit_test.cc2
-rw-r--r--db/version_set.cc36
-rw-r--r--db/version_set.h2
-rw-r--r--db/version_set_test.cc2
-rw-r--r--db/write_batch.cc4
-rw-r--r--db/write_batch_internal.h2
-rw-r--r--db/write_batch_test.cc2
-rw-r--r--doc/bench/db_bench_sqlite3.cc4
-rw-r--r--doc/bench/db_bench_tree_db.cc4
-rw-r--r--helpers/memenv/memenv.cc4
-rw-r--r--helpers/memenv/memenv.h2
-rw-r--r--helpers/memenv/memenv_test.cc2
-rw-r--r--include/leveldb/cache.h2
-rw-r--r--include/leveldb/comparator.h2
-rw-r--r--include/leveldb/db.h2
-rw-r--r--include/leveldb/env.h2
-rw-r--r--include/leveldb/iterator.h2
-rw-r--r--include/leveldb/options.h2
-rw-r--r--include/leveldb/slice.h2
-rw-r--r--include/leveldb/status.h2
-rw-r--r--include/leveldb/table.h2
-rw-r--r--include/leveldb/table_builder.h2
-rw-r--r--include/leveldb/write_batch.h2
-rw-r--r--port/atomic_pointer.h4
-rw-r--r--port/port_android.cc4
-rw-r--r--port/port_android.h4
-rw-r--r--port/port_example.h4
-rw-r--r--port/port_posix.cc4
-rw-r--r--table/block.cc2
-rw-r--r--table/block.h2
-rw-r--r--table/block_builder.cc2
-rw-r--r--table/block_builder.h2
-rw-r--r--table/format.cc2
-rw-r--r--table/format.h2
-rw-r--r--table/iterator.cc4
-rw-r--r--table/merger.cc4
-rw-r--r--table/merger.h2
-rw-r--r--table/table.cc2
-rw-r--r--table/table_builder.cc2
-rw-r--r--table/table_test.cc6
-rw-r--r--table/two_level_iterator.cc4
-rw-r--r--table/two_level_iterator.h2
-rw-r--r--util/arena.cc2
-rw-r--r--util/arena.h2
-rw-r--r--util/arena_test.cc2
-rw-r--r--util/cache.cc2
-rw-r--r--util/cache_test.cc2
-rw-r--r--util/coding.cc2
-rw-r--r--util/coding.h2
-rw-r--r--util/coding_test.cc2
-rw-r--r--util/comparator.cc4
-rw-r--r--util/crc32c.cc4
-rw-r--r--util/crc32c.h4
-rw-r--r--util/crc32c_test.cc4
-rw-r--r--util/env.cc2
-rw-r--r--util/env_posix.cc4
-rw-r--r--util/env_test.cc2
-rw-r--r--util/hash.cc2
-rw-r--r--util/histogram.cc2
-rw-r--r--util/histogram.h2
-rw-r--r--util/logging.cc2
-rw-r--r--util/logging.h2
-rw-r--r--util/mutexlock.h2
-rw-r--r--util/options.cc2
-rw-r--r--util/posix_logger.h2
-rw-r--r--util/random.h2
-rw-r--r--util/status.cc2
-rw-r--r--util/testharness.cc4
-rw-r--r--util/testharness.h4
-rw-r--r--util/testutil.cc4
-rw-r--r--util/testutil.h4
102 files changed, 258 insertions, 146 deletions
diff --git a/db/builder.cc b/db/builder.cc
index 34a7b87..f419882 100644
--- a/db/builder.cc
+++ b/db/builder.cc
@@ -85,4 +85,4 @@ Status BuildTable(const std::string& dbname,
return s;
}
-}
+} // namespace leveldb
diff --git a/db/builder.h b/db/builder.h
index b2aeabf..62431fc 100644
--- a/db/builder.h
+++ b/db/builder.h
@@ -29,6 +29,6 @@ extern Status BuildTable(const std::string& dbname,
Iterator* iter,
FileMetaData* meta);
-}
+} // namespace leveldb
#endif // STORAGE_LEVELDB_DB_BUILDER_H_
diff --git a/db/corruption_test.cc b/db/corruption_test.cc
index 1edcd84..31b2d5f 100644
--- a/db/corruption_test.cc
+++ b/db/corruption_test.cc
@@ -352,7 +352,7 @@ TEST(CorruptionTest, UnrelatedKeys) {
ASSERT_EQ(Value(1000, &tmp2).ToString(), v);
}
-}
+} // namespace leveldb
int main(int argc, char** argv) {
return leveldb::test::RunAllTests();
diff --git a/db/db_bench.cc b/db/db_bench.cc
index cf9bb65..bbfd618 100644
--- a/db/db_bench.cc
+++ b/db/db_bench.cc
@@ -288,7 +288,7 @@ struct ThreadState {
}
};
-}
+} // namespace
class Benchmark {
private:
@@ -829,7 +829,7 @@ class Benchmark {
}
};
-}
+} // namespace leveldb
int main(int argc, char** argv) {
FLAGS_write_buffer_size = leveldb::Options().write_buffer_size;
diff --git a/db/db_impl.cc b/db/db_impl.cc
index 56182a0..b4df80d 100644
--- a/db/db_impl.cc
+++ b/db/db_impl.cc
@@ -985,7 +985,7 @@ static void CleanupIteratorState(void* arg1, void* arg2) {
state->mu->Unlock();
delete state;
}
-}
+} // namespace
Iterator* DBImpl::NewInternalIterator(const ReadOptions& options,
SequenceNumber* latest_snapshot) {
@@ -1378,4 +1378,4 @@ Status DestroyDB(const std::string& dbname, const Options& options) {
return result;
}
-}
+} // namespace leveldb
diff --git a/db/db_impl.h b/db/db_impl.h
index ab03181..fc40d1e 100644
--- a/db/db_impl.h
+++ b/db/db_impl.h
@@ -187,6 +187,6 @@ extern Options SanitizeOptions(const std::string& db,
const InternalKeyComparator* icmp,
const Options& src);
-}
+} // namespace leveldb
#endif // STORAGE_LEVELDB_DB_DB_IMPL_H_
diff --git a/db/db_iter.cc b/db/db_iter.cc
index 8849f92..87dca2d 100644
--- a/db/db_iter.cc
+++ b/db/db_iter.cc
@@ -296,4 +296,4 @@ Iterator* NewDBIterator(
return new DBIter(dbname, env, user_key_comparator, internal_iter, sequence);
}
-}
+} // namespace leveldb
diff --git a/db/db_iter.h b/db/db_iter.h
index 195f3d3..d9e1b17 100644
--- a/db/db_iter.h
+++ b/db/db_iter.h
@@ -21,6 +21,6 @@ extern Iterator* NewDBIterator(
Iterator* internal_iter,
const SequenceNumber& sequence);
-}
+} // namespace leveldb
#endif // STORAGE_LEVELDB_DB_DB_ITER_H_
diff --git a/db/db_test.cc b/db/db_test.cc
index ab71c51..f1cb949 100644
--- a/db/db_test.cc
+++ b/db/db_test.cc
@@ -136,6 +136,33 @@ class DBTest {
return result;
}
+ // Return a string that contains all key,value pairs in order,
+ // formatted like "(k1->v1)(k2->v2)".
+ std::string Contents() {
+ std::vector<std::string> forward;
+ std::string result;
+ Iterator* iter = db_->NewIterator(ReadOptions());
+ for (iter->SeekToFirst(); iter->Valid(); iter->Next()) {
+ std::string s = IterStatus(iter);
+ result.push_back('(');
+ result.append(s);
+ result.push_back(')');
+ forward.push_back(s);
+ }
+
+ // Check reverse iteration results are the reverse of forward results
+ int matched = 0;
+ for (iter->SeekToLast(); iter->Valid(); iter->Prev()) {
+ ASSERT_LT(matched, forward.size());
+ ASSERT_EQ(IterStatus(iter), forward[forward.size() - matched - 1]);
+ matched++;
+ }
+ ASSERT_EQ(matched, forward.size());
+
+ delete iter;
+ return result;
+ }
+
std::string AllEntriesFor(const Slice& user_key) {
Iterator* iter = dbfull()->TEST_NewInternalIterator();
InternalKey target(user_key, kMaxSequenceNumber, kTypeValue);
@@ -1048,6 +1075,49 @@ TEST(DBTest, OverlapInLevel0) {
ASSERT_EQ("NOT_FOUND", Get("600"));
}
+TEST(DBTest, L0_CompactionBug_Issue44_a) {
+ Reopen();
+ ASSERT_OK(Put("b", "v"));
+ Reopen();
+ ASSERT_OK(Delete("b"));
+ ASSERT_OK(Delete("a"));
+ Reopen();
+ ASSERT_OK(Delete("a"));
+ Reopen();
+ ASSERT_OK(Put("a", "v"));
+ Reopen();
+ Reopen();
+ ASSERT_EQ("(a->v)", Contents());
+ env_->SleepForMicroseconds(1000000); // Wait for compaction to finish
+ ASSERT_EQ("(a->v)", Contents());
+}
+
+TEST(DBTest, L0_CompactionBug_Issue44_b) {
+ Reopen();
+ Put("","");
+ Reopen();
+ Delete("e");
+ Put("","");
+ Reopen();
+ Put("c", "cv");
+ Reopen();
+ Put("","");
+ Reopen();
+ Put("","");
+ env_->SleepForMicroseconds(1000000); // Wait for compaction to finish
+ Reopen();
+ Put("d","dv");
+ Reopen();
+ Put("","");
+ Reopen();
+ Delete("d");
+ Delete("b");
+ Reopen();
+ ASSERT_EQ("(->)(c->cv)", Contents());
+ env_->SleepForMicroseconds(1000000); // Wait for compaction to finish
+ ASSERT_EQ("(->)(c->cv)", Contents());
+}
+
TEST(DBTest, ComparatorCheck) {
class NewComparator : public Comparator {
public:
@@ -1071,6 +1141,34 @@ TEST(DBTest, ComparatorCheck) {
<< s.ToString();
}
+TEST(DBTest, CustomComparator) {
+ class NumberComparator : public Comparator {
+ public:
+ virtual const char* Name() const { return "test.NumberComparator"; }
+ virtual int Compare(const Slice& a, const Slice& b) const {
+ return (strtol(a.ToString().c_str(), NULL, 0) -
+ strtol(b.ToString().c_str(), NULL, 0));
+ }
+ virtual void FindShortestSeparator(std::string* s, const Slice& l) const {}
+ virtual void FindShortSuccessor(std::string* key) const {}
+ };
+ NumberComparator cmp;
+ Options new_options;
+ new_options.create_if_missing = true;
+ new_options.comparator = &cmp;
+ DestroyAndReopen(&new_options);
+ ASSERT_OK(Put("10", "ten"));
+ ASSERT_OK(Put("0x14", "twenty"));
+ for (int i = 0; i < 2; i++) {
+ ASSERT_EQ("ten", Get("10"));
+ ASSERT_EQ("ten", Get("0xa"));
+ ASSERT_EQ("twenty", Get("20"));
+ ASSERT_EQ("twenty", Get("0x14"));
+ Compact("0", "9999");
+ fprintf(stderr, "ss\n%s\n", DumpSSTableList().c_str());
+ }
+}
+
TEST(DBTest, ManualCompaction) {
ASSERT_EQ(config::kMaxMemCompactLevel, 2)
<< "Need to update this test to match kMaxMemCompactLevel";
@@ -1207,7 +1305,7 @@ static void MTThreadBody(void* arg) {
fprintf(stderr, "... stopping thread %d after %d ops\n", t->id, int(counter));
}
-}
+} // namespace
TEST(DBTest, MultiThreaded) {
// Initialize state
@@ -1525,7 +1623,7 @@ void BM_LogAndApply(int iters, int num_base_files) {
buf, iters, us, ((float)us) / iters);
}
-}
+} // namespace leveldb
int main(int argc, char** argv) {
if (argc > 1 && std::string(argv[1]) == "--benchmark") {
diff --git a/db/dbformat.cc b/db/dbformat.cc
index 4fb3531..4594a57 100644
--- a/db/dbformat.cc
+++ b/db/dbformat.cc
@@ -115,4 +115,4 @@ LookupKey::LookupKey(const Slice& user_key, SequenceNumber s) {
end_ = dst;
}
-}
+} // namespace leveldb
diff --git a/db/dbformat.h b/db/dbformat.h
index d046990..044717d 100644
--- a/db/dbformat.h
+++ b/db/dbformat.h
@@ -37,7 +37,7 @@ static const int kL0_StopWritesTrigger = 12;
// space if the same key space is being repeatedly overwritten.
static const int kMaxMemCompactLevel = 2;
-}
+} // namespace config
class InternalKey;
@@ -210,6 +210,6 @@ inline LookupKey::~LookupKey() {
if (start_ != space_) delete[] start_;
}
-}
+} // namespace leveldb
#endif // STORAGE_LEVELDB_DB_FORMAT_H_
diff --git a/db/dbformat_test.cc b/db/dbformat_test.cc
index 57c5578..5d82f5d 100644
--- a/db/dbformat_test.cc
+++ b/db/dbformat_test.cc
@@ -105,7 +105,7 @@ TEST(FormatTest, InternalKeyShortestSuccessor) {
ShortSuccessor(IKey("\xff\xff", 100, kTypeValue)));
}
-}
+} // namespace leveldb
int main(int argc, char** argv) {
return leveldb::test::RunAllTests();
diff --git a/db/filename.cc b/db/filename.cc
index b3a917c..24fd140 100644
--- a/db/filename.cc
+++ b/db/filename.cc
@@ -132,4 +132,4 @@ Status SetCurrentFile(Env* env, const std::string& dbname,
return s;
}
-}
+} // namespace leveldb
diff --git a/db/filename.h b/db/filename.h
index e9ec8a7..d5d09b1 100644
--- a/db/filename.h
+++ b/db/filename.h
@@ -75,6 +75,6 @@ extern Status SetCurrentFile(Env* env, const std::string& dbname,
uint64_t descriptor_number);
-}
+} // namespace leveldb
#endif // STORAGE_LEVELDB_DB_FILENAME_H_
diff --git a/db/filename_test.cc b/db/filename_test.cc
index 2f61e8d..47353d6 100644
--- a/db/filename_test.cc
+++ b/db/filename_test.cc
@@ -115,7 +115,7 @@ TEST(FileNameTest, Construction) {
ASSERT_EQ(kTempFile, type);
}
-}
+} // namespace leveldb
int main(int argc, char** argv) {
return leveldb::test::RunAllTests();
diff --git a/db/log_format.h b/db/log_format.h
index 353eff8..2690cb9 100644
--- a/db/log_format.h
+++ b/db/log_format.h
@@ -29,7 +29,7 @@ static const int kBlockSize = 32768;
// Header is checksum (4 bytes), type (1 byte), length (2 bytes).
static const int kHeaderSize = 4 + 1 + 2;
-}
-}
+} // namespace log
+} // namespace leveldb
#endif // STORAGE_LEVELDB_DB_LOG_FORMAT_H_
diff --git a/db/log_reader.cc b/db/log_reader.cc
index fcb3aa7..b35f115 100644
--- a/db/log_reader.cc
+++ b/db/log_reader.cc
@@ -255,5 +255,5 @@ unsigned int Reader::ReadPhysicalRecord(Slice* result) {
}
}
-}
-}
+} // namespace log
+} // namespace leveldb
diff --git a/db/log_reader.h b/db/log_reader.h
index 61cc414..82d4bee 100644
--- a/db/log_reader.h
+++ b/db/log_reader.h
@@ -102,7 +102,7 @@ class Reader {
void operator=(const Reader&);
};
-}
-}
+} // namespace log
+} // namespace leveldb
#endif // STORAGE_LEVELDB_DB_LOG_READER_H_
diff --git a/db/log_test.cc b/db/log_test.cc
index 06e0893..4c5cf87 100644
--- a/db/log_test.cc
+++ b/db/log_test.cc
@@ -492,8 +492,8 @@ TEST(LogTest, ReadPastEnd) {
CheckOffsetPastEndReturnsNoRecords(5);
}
-}
-}
+} // namespace log
+} // namespace leveldb
int main(int argc, char** argv) {
return leveldb::test::RunAllTests();
diff --git a/db/log_writer.cc b/db/log_writer.cc
index 0887f6c..2da99ac 100644
--- a/db/log_writer.cc
+++ b/db/log_writer.cc
@@ -99,5 +99,5 @@ Status Writer::EmitPhysicalRecord(RecordType t, const char* ptr, size_t n) {
return s;
}
-}
-}
+} // namespace log
+} // namespace leveldb
diff --git a/db/log_writer.h b/db/log_writer.h
index d3cf27d..a3a954d 100644
--- a/db/log_writer.h
+++ b/db/log_writer.h
@@ -42,7 +42,7 @@ class Writer {
void operator=(const Writer&);
};
-}
-}
+} // namespace log
+} // namespace leveldb
#endif // STORAGE_LEVELDB_DB_LOG_WRITER_H_
diff --git a/db/memtable.cc b/db/memtable.cc
index 4555abb..bfec0a7 100644
--- a/db/memtable.cc
+++ b/db/memtable.cc
@@ -142,4 +142,4 @@ bool MemTable::Get(const LookupKey& key, std::string* value, Status* s) {
return false;
}
-}
+} // namespace leveldb
diff --git a/db/memtable.h b/db/memtable.h
index 1898b5e..92e90bb 100644
--- a/db/memtable.h
+++ b/db/memtable.h
@@ -86,6 +86,6 @@ class MemTable {
void operator=(const MemTable&);
};
-}
+} // namespace leveldb
#endif // STORAGE_LEVELDB_DB_MEMTABLE_H_
diff --git a/db/repair.cc b/db/repair.cc
index 5bcdb56..511c66b 100644
--- a/db/repair.cc
+++ b/db/repair.cc
@@ -377,11 +377,11 @@ class Repairer {
fname.c_str(), s.ToString().c_str());
}
};
-}
+} // namespace
Status RepairDB(const std::string& dbname, const Options& options) {
Repairer repairer(dbname, options);
return repairer.Run();
}
-}
+} // namespace leveldb
diff --git a/db/skiplist.h b/db/skiplist.h
index be39354..0481575 100644
--- a/db/skiplist.h
+++ b/db/skiplist.h
@@ -375,4 +375,4 @@ bool SkipList<Key,Comparator>::Contains(const Key& key) const {
}
}
-}
+} // namespace leveldb
diff --git a/db/skiplist_test.cc b/db/skiplist_test.cc
index 2bd8d22..c78f4b4 100644
--- a/db/skiplist_test.cc
+++ b/db/skiplist_test.cc
@@ -371,7 +371,7 @@ TEST(SkipTest, Concurrent3) { RunConcurrent(3); }
TEST(SkipTest, Concurrent4) { RunConcurrent(4); }
TEST(SkipTest, Concurrent5) { RunConcurrent(5); }
-}
+} // namespace leveldb
int main(int argc, char** argv) {
return leveldb::test::RunAllTests();
diff --git a/db/snapshot.h b/db/snapshot.h
index a08dbd3..e7f8fd2 100644
--- a/db/snapshot.h
+++ b/db/snapshot.h
@@ -61,6 +61,6 @@ class SnapshotList {
SnapshotImpl list_;
};
-}
+} // namespace leveldb
#endif // STORAGE_LEVELDB_DB_SNAPSHOT_H_
diff --git a/db/table_cache.cc b/db/table_cache.cc
index 325d707..cae79bd 100644
--- a/db/table_cache.cc
+++ b/db/table_cache.cc
@@ -92,4 +92,4 @@ void TableCache::Evict(uint64_t file_number) {
cache_->Erase(Slice(buf, sizeof(buf)));
}
-}
+} // namespace leveldb
diff --git a/db/table_cache.h b/db/table_cache.h
index 5376194..0f3c73b 100644
--- a/db/table_cache.h
+++ b/db/table_cache.h
@@ -45,6 +45,6 @@ class TableCache {
Cache* cache_;
};
-}
+} // namespace leveldb
#endif // STORAGE_LEVELDB_DB_TABLE_CACHE_H_
diff --git a/db/version_edit.cc b/db/version_edit.cc
index 9891c32..f10a2d5 100644
--- a/db/version_edit.cc
+++ b/db/version_edit.cc
@@ -263,4 +263,4 @@ std::string VersionEdit::DebugString() const {
return r;
}
-}
+} // namespace leveldb
diff --git a/db/version_edit.h b/db/version_edit.h
index a069893..eaef77b 100644
--- a/db/version_edit.h
+++ b/db/version_edit.h
@@ -102,6 +102,6 @@ class VersionEdit {
std::vector< std::pair<int, FileMetaData> > new_files_;
};
-}
+} // namespace leveldb
#endif // STORAGE_LEVELDB_DB_VERSION_EDIT_H_
diff --git a/db/version_edit_test.cc b/db/version_edit_test.cc
index 67959f7..280310b 100644
--- a/db/version_edit_test.cc
+++ b/db/version_edit_test.cc
@@ -39,7 +39,7 @@ TEST(VersionEditTest, EncodeDecode) {
TestEncodeDecode(edit);
}
-}
+} // namespace leveldb
int main(int argc, char** argv) {
return leveldb::test::RunAllTests();
diff --git a/db/version_set.cc b/db/version_set.cc
index 8b96af0..7cf5197 100644
--- a/db/version_set.cc
+++ b/db/version_set.cc
@@ -61,7 +61,7 @@ std::string IntSetToString(const std::set<uint64_t>& s) {
result += "}";
return result;
}
-}
+} // namespace
Version::~Version() {
assert(refs_ == 0);
@@ -253,7 +253,8 @@ void Version::AddIterators(const ReadOptions& options,
// If "*iter" points at a value or deletion for user_key, store
// either the value, or a NotFound error and return true.
// Else return false.
-static bool GetValue(Iterator* iter, const Slice& user_key,
+static bool GetValue(const Comparator* cmp,
+ Iterator* iter, const Slice& user_key,
std::string* value,
Status* s) {
if (!iter->Valid()) {
@@ -264,7 +265,7 @@ static bool GetValue(Iterator* iter, const Slice& user_key,
*s = Status::Corruption("corrupted key for ", user_key);
return true;
}
- if (parsed_key.user_key != user_key) {
+ if (cmp->Compare(parsed_key.user_key, user_key) != 0) {
return false;
}
switch (parsed_key.type) {
@@ -360,7 +361,7 @@ Status Version::Get(const ReadOptions& options,
f->number,
f->file_size);
iter->Seek(ikey);
- const bool done = GetValue(iter, user_key, value, &s);
+ const bool done = GetValue(ucmp, iter, user_key, value, &s);
if (!iter->status().ok()) {
s = iter->status();
delete iter;
@@ -450,16 +451,29 @@ void Version::GetOverlappingInputs(
user_end = end->user_key();
}
const Comparator* user_cmp = vset_->icmp_.user_comparator();
- for (size_t i = 0; i < files_[level].size(); i++) {
- FileMetaData* f = files_[level][i];
- if (begin != NULL &&
- user_cmp->Compare(f->largest.user_key(), user_begin) < 0) {
+ for (size_t i = 0; i < files_[level].size(); ) {
+ FileMetaData* f = files_[level][i++];
+ const Slice file_start = f->smallest.user_key();
+ const Slice file_limit = f->largest.user_key();
+ if (begin != NULL && user_cmp->Compare(file_limit, user_begin) < 0) {
// "f" is completely before specified range; skip it
- } else if (end != NULL &&
- user_cmp->Compare(f->smallest.user_key(), user_end) > 0) {
+ } else if (end != NULL && user_cmp->Compare(file_start, user_end) > 0) {
// "f" is completely after specified range; skip it
} else {
inputs->push_back(f);
+ if (level == 0) {
+ // Level-0 files may overlap each other. So check if the newly
+ // added file has expanded the range. If so, restart search.
+ if (begin != NULL && user_cmp->Compare(file_start, user_begin) < 0) {
+ user_begin = file_start;
+ inputs->clear();
+ i = 0;
+ } else if (end != NULL && user_cmp->Compare(file_limit, user_end) > 0) {
+ user_end = file_limit;
+ inputs->clear();
+ i = 0;
+ }
+ }
}
}
}
@@ -1369,4 +1383,4 @@ void Compaction::ReleaseInputs() {
}
}
-}
+} // namespace leveldb
diff --git a/db/version_set.h b/db/version_set.h
index b866b2a..572602e 100644
--- a/db/version_set.h
+++ b/db/version_set.h
@@ -365,6 +365,6 @@ class Compaction {
size_t level_ptrs_[config::kNumLevels];
};
-}
+} // namespace leveldb
#endif // STORAGE_LEVELDB_DB_VERSION_SET_H_
diff --git a/db/version_set_test.cc b/db/version_set_test.cc
index 06f8bbd..501e34d 100644
--- a/db/version_set_test.cc
+++ b/db/version_set_test.cc
@@ -172,7 +172,7 @@ TEST(FindFileTest, OverlappingFiles) {
ASSERT_TRUE(Overlaps("600", "700"));
}
-}
+} // namespace leveldb
int main(int argc, char** argv) {
return leveldb::test::RunAllTests();
diff --git a/db/write_batch.cc b/db/write_batch.cc
index 4e1e899..a0e812f 100644
--- a/db/write_batch.cc
+++ b/db/write_batch.cc
@@ -120,7 +120,7 @@ class MemTableInserter : public WriteBatch::Handler {
sequence_++;
}
};
-}
+} // namespace
Status WriteBatchInternal::InsertInto(const WriteBatch* b,
MemTable* memtable) {
@@ -135,4 +135,4 @@ void WriteBatchInternal::SetContents(WriteBatch* b, const Slice& contents) {
b->rep_.assign(contents.data(), contents.size());
}
-}
+} // namespace leveldb
diff --git a/db/write_batch_internal.h b/db/write_batch_internal.h
index 6d65eed..49aeb84 100644
--- a/db/write_batch_internal.h
+++ b/db/write_batch_internal.h
@@ -41,7 +41,7 @@ class WriteBatchInternal {
static Status InsertInto(const WriteBatch* batch, MemTable* memtable);
};
-}
+} // namespace leveldb
#endif // STORAGE_LEVELDB_DB_WRITE_BATCH_INTERNAL_H_
diff --git a/db/write_batch_test.cc b/db/write_batch_test.cc
index 73d68fd..1ee6d7b 100644
--- a/db/write_batch_test.cc
+++ b/db/write_batch_test.cc
@@ -82,7 +82,7 @@ TEST(WriteBatchTest, Corruption) {
PrintContents(&batch));
}
-}
+} // namespace leveldb
int main(int argc, char** argv) {
return leveldb::test::RunAllTests();
diff --git a/doc/bench/db_bench_sqlite3.cc b/doc/bench/db_bench_sqlite3.cc
index e11db52..6951a14 100644
--- a/doc/bench/db_bench_sqlite3.cc
+++ b/doc/bench/db_bench_sqlite3.cc
@@ -155,7 +155,7 @@ static Slice TrimSpace(Slice s) {
return Slice(s.data() + start, limit - start);
}
-}
+} // namespace
class Benchmark {
private:
@@ -652,7 +652,7 @@ class Benchmark {
};
-}
+} // namespace leveldb
int main(int argc, char** argv) {
for (int i = 1; i < argc; i++) {
diff --git a/doc/bench/db_bench_tree_db.cc b/doc/bench/db_bench_tree_db.cc
index d42e306..214d9b7 100644
--- a/doc/bench/db_bench_tree_db.cc
+++ b/doc/bench/db_bench_tree_db.cc
@@ -124,7 +124,7 @@ static Slice TrimSpace(Slice s) {
return Slice(s.data() + start, limit - start);
}
-}
+} // namespace
class Benchmark {
private:
@@ -467,7 +467,7 @@ class Benchmark {
}
};
-}
+} // namespace leveldb
int main(int argc, char** argv) {
for (int i = 1; i < argc; i++) {
diff --git a/helpers/memenv/memenv.cc b/helpers/memenv/memenv.cc
index dab80fe..2082083 100644
--- a/helpers/memenv/memenv.cc
+++ b/helpers/memenv/memenv.cc
@@ -365,10 +365,10 @@ class InMemoryEnv : public EnvWrapper {
FileSystem file_map_; // Protected by mutex_.
};
-}
+} // namespace
Env* NewMemEnv(Env* base_env) {
return new InMemoryEnv(base_env);
}
-}
+} // namespace leveldb
diff --git a/helpers/memenv/memenv.h b/helpers/memenv/memenv.h
index 835b944..03b88de 100644
--- a/helpers/memenv/memenv.h
+++ b/helpers/memenv/memenv.h
@@ -15,6 +15,6 @@ class Env;
// *base_env must remain live while the result is in use.
Env* NewMemEnv(Env* base_env);
-}
+} // namespace leveldb
#endif // STORAGE_LEVELDB_HELPERS_MEMENV_MEMENV_H_
diff --git a/helpers/memenv/memenv_test.cc b/helpers/memenv/memenv_test.cc
index 3791dc3..a44310f 100644
--- a/helpers/memenv/memenv_test.cc
+++ b/helpers/memenv/memenv_test.cc
@@ -225,7 +225,7 @@ TEST(MemEnvTest, DBTest) {
delete db;
}
-}
+} // namespace leveldb
int main(int argc, char** argv) {
return leveldb::test::RunAllTests();
diff --git a/include/leveldb/cache.h b/include/leveldb/cache.h
index 79196d1..5e3b476 100644
--- a/include/leveldb/cache.h
+++ b/include/leveldb/cache.h
@@ -94,6 +94,6 @@ class Cache {
void operator=(const Cache&);
};
-}
+} // namespace leveldb
#endif // STORAGE_LEVELDB_UTIL_CACHE_H_
diff --git a/include/leveldb/comparator.h b/include/leveldb/comparator.h
index c215fac..556b984 100644
--- a/include/leveldb/comparator.h
+++ b/include/leveldb/comparator.h
@@ -58,6 +58,6 @@ class Comparator {
// must not be deleted.
extern const Comparator* BytewiseComparator();
-}
+} // namespace leveldb
#endif // STORAGE_LEVELDB_INCLUDE_COMPARATOR_H_
diff --git a/include/leveldb/db.h b/include/leveldb/db.h
index 7fb2965..c1182b7 100644
--- a/include/leveldb/db.h
+++ b/include/leveldb/db.h
@@ -155,6 +155,6 @@ Status DestroyDB(const std::string& name, const Options& options);
// on a database that contains important information.
Status RepairDB(const std::string& dbname, const Options& options);
-}
+} // namespace leveldb
#endif // STORAGE_LEVELDB_INCLUDE_DB_H_
diff --git a/include/leveldb/env.h b/include/leveldb/env.h
index a39d66f..2720667 100644
--- a/include/leveldb/env.h
+++ b/include/leveldb/env.h
@@ -318,6 +318,6 @@ class EnvWrapper : public Env {
Env* target_;
};
-}
+} // namespace leveldb
#endif // STORAGE_LEVELDB_INCLUDE_ENV_H_
diff --git a/include/leveldb/iterator.h b/include/leveldb/iterator.h
index 6821d85..ad543eb 100644
--- a/include/leveldb/iterator.h
+++ b/include/leveldb/iterator.h
@@ -95,6 +95,6 @@ extern Iterator* NewEmptyIterator();
// Return an empty iterator with the specified status.
extern Iterator* NewErrorIterator(const Status& status);
-}
+} // namespace leveldb
#endif // STORAGE_LEVELDB_INCLUDE_ITERATOR_H_
diff --git a/include/leveldb/options.h b/include/leveldb/options.h
index 84ac7fc..79111a0 100644
--- a/include/leveldb/options.h
+++ b/include/leveldb/options.h
@@ -182,6 +182,6 @@ struct WriteOptions {
}
};
-}
+} // namespace leveldb
#endif // STORAGE_LEVELDB_INCLUDE_OPTIONS_H_
diff --git a/include/leveldb/slice.h b/include/leveldb/slice.h
index 7c66d1b..74ea8fa 100644
--- a/include/leveldb/slice.h
+++ b/include/leveldb/slice.h
@@ -103,7 +103,7 @@ inline int Slice::compare(const Slice& b) const {
return r;
}
-}
+} // namespace leveldb
#endif // STORAGE_LEVELDB_INCLUDE_SLICE_H_
diff --git a/include/leveldb/status.h b/include/leveldb/status.h
index 8fe4442..3355fac 100644
--- a/include/leveldb/status.h
+++ b/include/leveldb/status.h
@@ -95,6 +95,6 @@ inline void Status::operator=(const Status& s) {
}
}
-}
+} // namespace leveldb
#endif // STORAGE_LEVELDB_INCLUDE_STATUS_H_
diff --git a/include/leveldb/table.h b/include/leveldb/table.h
index 35e5d22..0cbdd40 100644
--- a/include/leveldb/table.h
+++ b/include/leveldb/table.h
@@ -65,6 +65,6 @@ class Table {
void operator=(const Table&);
};
-}
+} // namespace leveldb
#endif // STORAGE_LEVELDB_INCLUDE_TABLE_H_
diff --git a/include/leveldb/table_builder.h b/include/leveldb/table_builder.h
index 23851de..9ac0868 100644
--- a/include/leveldb/table_builder.h
+++ b/include/leveldb/table_builder.h
@@ -86,6 +86,6 @@ class TableBuilder {
void operator=(const TableBuilder&);
};
-}
+} // namespace leveldb
#endif // STORAGE_LEVELDB_INCLUDE_TABLE_BUILDER_H_
diff --git a/include/leveldb/write_batch.h b/include/leveldb/write_batch.h
index b4446c2..ee9aab6 100644
--- a/include/leveldb/write_batch.h
+++ b/include/leveldb/write_batch.h
@@ -59,6 +59,6 @@ class WriteBatch {
// Intentionally copyable
};
-}
+} // namespace leveldb
#endif // STORAGE_LEVELDB_INCLUDE_WRITE_BATCH_H_
diff --git a/port/atomic_pointer.h b/port/atomic_pointer.h
index c20b1bd..35ae550 100644
--- a/port/atomic_pointer.h
+++ b/port/atomic_pointer.h
@@ -138,7 +138,7 @@ class AtomicPointer {
#undef ARCH_CPU_X86_FAMILY
#undef ARCH_CPU_ARM_FAMILY
-} // namespace leveldb::port
-} // namespace leveldb
+} // namespace port
+} // namespace leveldb
#endif // PORT_ATOMIC_POINTER_H_
diff --git a/port/port_android.cc b/port/port_android.cc
index 240e9ca..815abf2 100644
--- a/port/port_android.cc
+++ b/port/port_android.cc
@@ -60,5 +60,5 @@ void CondVar::SignalAll() {
PthreadCall("broadcast", pthread_cond_broadcast(&cv_));
}
-}
-}
+} // namespace port
+} // namespace leveldb
diff --git a/port/port_android.h b/port/port_android.h
index d68b6c0..64cdcbf 100644
--- a/port/port_android.h
+++ b/port/port_android.h
@@ -150,7 +150,7 @@ inline bool GetHeapProfile(void (*func)(void*, const char*, int), void* arg) {
return false;
}
-}
-}
+} // namespace port
+} // namespace leveldb
#endif // STORAGE_LEVELDB_PORT_PORT_ANDROID_H_
diff --git a/port/port_example.h b/port/port_example.h
index 6bd9b49..036c7d1 100644
--- a/port/port_example.h
+++ b/port/port_example.h
@@ -119,7 +119,7 @@ extern bool Snappy_Uncompress(const char* input_data, size_t input_length,
// The concatenation of all "data[0,n-1]" fragments is the heap profile.
extern bool GetHeapProfile(void (*func)(void*, const char*, int), void* arg);
-}
-}
+} // namespace port
+} // namespace leveldb
#endif // STORAGE_LEVELDB_PORT_PORT_EXAMPLE_H_
diff --git a/port/port_posix.cc b/port/port_posix.cc
index e75da8b..c44cc99 100644
--- a/port/port_posix.cc
+++ b/port/port_posix.cc
@@ -46,5 +46,5 @@ void CondVar::SignalAll() {
PthreadCall("broadcast", pthread_cond_broadcast(&cv_));
}
-}
-}
+} // namespace port
+} // namespace leveldb
diff --git a/table/block.cc b/table/block.cc
index c20bb38..40aa318 100644
--- a/table/block.cc
+++ b/table/block.cc
@@ -260,4 +260,4 @@ Iterator* Block::NewIterator(const Comparator* cmp) {
}
}
-}
+} // namespace leveldb
diff --git a/table/block.h b/table/block.h
index cdf0598..9eb6f02 100644
--- a/table/block.h
+++ b/table/block.h
@@ -38,6 +38,6 @@ class Block {
class Iter;
};
-}
+} // namespace leveldb
#endif // STORAGE_LEVELDB_TABLE_BLOCK_H_
diff --git a/table/block_builder.cc b/table/block_builder.cc
index d2ffa21..db660cd 100644
--- a/table/block_builder.cc
+++ b/table/block_builder.cc
@@ -106,4 +106,4 @@ void BlockBuilder::Add(const Slice& key, const Slice& value) {
counter_++;
}
-}
+} // namespace leveldb
diff --git a/table/block_builder.h b/table/block_builder.h
index bf92a0f..5b545bd 100644
--- a/table/block_builder.h
+++ b/table/block_builder.h
@@ -52,6 +52,6 @@ class BlockBuilder {
void operator=(const BlockBuilder&);
};
-}
+} // namespace leveldb
#endif // STORAGE_LEVELDB_TABLE_BLOCK_BUILDER_H_
diff --git a/table/format.cc b/table/format.cc
index ba7838c..23728d8 100644
--- a/table/format.cc
+++ b/table/format.cc
@@ -132,4 +132,4 @@ Status ReadBlock(RandomAccessFile* file,
return Status::OK();
}
-}
+} // namespace leveldb
diff --git a/table/format.h b/table/format.h
index a6ab964..2a3e1ac 100644
--- a/table/format.h
+++ b/table/format.h
@@ -98,6 +98,6 @@ inline BlockHandle::BlockHandle()
size_(~static_cast<uint64_t>(0)) {
}
-}
+} // namespace leveldb
#endif // STORAGE_LEVELDB_TABLE_FORMAT_H_
diff --git a/table/iterator.cc b/table/iterator.cc
index 33bc8a2..3d1c87f 100644
--- a/table/iterator.cc
+++ b/table/iterator.cc
@@ -54,7 +54,7 @@ class EmptyIterator : public Iterator {
private:
Status status_;
};
-}
+} // namespace
Iterator* NewEmptyIterator() {
return new EmptyIterator(Status::OK());
@@ -64,4 +64,4 @@ Iterator* NewErrorIterator(const Status& status) {
return new EmptyIterator(status);
}
-}
+} // namespace leveldb
diff --git a/table/merger.cc b/table/merger.cc
index 6ce06bb..2dde4dc 100644
--- a/table/merger.cc
+++ b/table/merger.cc
@@ -181,7 +181,7 @@ void MergingIterator::FindLargest() {
}
current_ = largest;
}
-}
+} // namespace
Iterator* NewMergingIterator(const Comparator* cmp, Iterator** list, int n) {
assert(n >= 0);
@@ -194,4 +194,4 @@ Iterator* NewMergingIterator(const Comparator* cmp, Iterator** list, int n) {
}
}
-}
+} // namespace leveldb
diff --git a/table/merger.h b/table/merger.h
index 71d9dc5..91ddd80 100644
--- a/table/merger.h
+++ b/table/merger.h
@@ -21,6 +21,6 @@ class Iterator;
extern Iterator* NewMergingIterator(
const Comparator* comparator, Iterator** children, int n);
-}
+} // namespace leveldb
#endif // STORAGE_LEVELDB_TABLE_MERGER_H_
diff --git a/table/table.cc b/table/table.cc
index 9820753..5f9238e 100644
--- a/table/table.cc
+++ b/table/table.cc
@@ -172,4 +172,4 @@ uint64_t Table::ApproximateOffsetOf(const Slice& key) const {
return result;
}
-}
+} // namespace leveldb
diff --git a/table/table_builder.cc b/table/table_builder.cc
index 7ec7ad2..682ce5b 100644
--- a/table/table_builder.cc
+++ b/table/table_builder.cc
@@ -224,4 +224,4 @@ uint64_t TableBuilder::FileSize() const {
return rep_->offset;
}
-}
+} // namespace leveldb
diff --git a/table/table_test.cc b/table/table_test.cc
index c69a386..cd85b4b 100644
--- a/table/table_test.cc
+++ b/table/table_test.cc
@@ -60,7 +60,7 @@ class ReverseKeyComparator : public Comparator {
*key = Reverse(s);
}
};
-}
+} // namespace
static ReverseKeyComparator reverse_key_comparator;
static void Increment(const Comparator* cmp, std::string* key) {
@@ -85,7 +85,7 @@ struct STLLessThan {
return cmp->Compare(Slice(a), Slice(b)) < 0;
}
};
-}
+} // namespace
class StringSink: public WritableFile {
public:
@@ -847,7 +847,7 @@ TEST(TableTest, ApproximateOffsetOfCompressed) {
ASSERT_TRUE(Between(c.ApproximateOffsetOf("xyz"), 4000, 6000));
}
-}
+} // namespace leveldb
int main(int argc, char** argv) {
return leveldb::test::RunAllTests();
diff --git a/table/two_level_iterator.cc b/table/two_level_iterator.cc
index 24a1241..7822eba 100644
--- a/table/two_level_iterator.cc
+++ b/table/two_level_iterator.cc
@@ -169,7 +169,7 @@ void TwoLevelIterator::InitDataBlock() {
}
}
-}
+} // namespace
Iterator* NewTwoLevelIterator(
Iterator* index_iter,
@@ -179,4 +179,4 @@ Iterator* NewTwoLevelIterator(
return new TwoLevelIterator(index_iter, block_function, arg, options);
}
-}
+} // namespace leveldb
diff --git a/table/two_level_iterator.h b/table/two_level_iterator.h
index 5909e2b..629ca34 100644
--- a/table/two_level_iterator.h
+++ b/table/two_level_iterator.h
@@ -29,6 +29,6 @@ extern Iterator* NewTwoLevelIterator(
void* arg,
const ReadOptions& options);
-}
+} // namespace leveldb
#endif // STORAGE_LEVELDB_TABLE_TWO_LEVEL_ITERATOR_H_
diff --git a/util/arena.cc b/util/arena.cc
index 40ab99d..9551d6a 100644
--- a/util/arena.cc
+++ b/util/arena.cc
@@ -65,4 +65,4 @@ char* Arena::AllocateNewBlock(size_t block_bytes) {
return result;
}
-}
+} // namespace leveldb
diff --git a/util/arena.h b/util/arena.h
index fcb5d5b..8f7dde2 100644
--- a/util/arena.h
+++ b/util/arena.h
@@ -63,6 +63,6 @@ inline char* Arena::Allocate(size_t bytes) {
return AllocateFallback(bytes);
}
-}
+} // namespace leveldb
#endif // STORAGE_LEVELDB_UTIL_ARENA_H_
diff --git a/util/arena_test.cc b/util/arena_test.cc
index c33b552..63d1778 100644
--- a/util/arena_test.cc
+++ b/util/arena_test.cc
@@ -61,7 +61,7 @@ TEST(ArenaTest, Simple) {
}
}
-}
+} // namespace leveldb
int main(int argc, char** argv) {
return leveldb::test::RunAllTests();
diff --git a/util/cache.cc b/util/cache.cc
index 7d1ebc1..24f1f63 100644
--- a/util/cache.cc
+++ b/util/cache.cc
@@ -325,4 +325,4 @@ Cache* NewLRUCache(size_t capacity) {
return new ShardedLRUCache(capacity);
}
-}
+} // namespace leveldb
diff --git a/util/cache_test.cc b/util/cache_test.cc
index 8a7f1c4..4371671 100644
--- a/util/cache_test.cc
+++ b/util/cache_test.cc
@@ -179,7 +179,7 @@ TEST(CacheTest, NewId) {
ASSERT_NE(a, b);
}
-}
+} // namespace leveldb
int main(int argc, char** argv) {
return leveldb::test::RunAllTests();
diff --git a/util/coding.cc b/util/coding.cc
index 14f21f7..dbd7a65 100644
--- a/util/coding.cc
+++ b/util/coding.cc
@@ -191,4 +191,4 @@ bool GetLengthPrefixedSlice(Slice* input, Slice* result) {
}
}
-}
+} // namespace leveldb
diff --git a/util/coding.h b/util/coding.h
index c47b9d8..3993c4a 100644
--- a/util/coding.h
+++ b/util/coding.h
@@ -99,6 +99,6 @@ inline const char* GetVarint32Ptr(const char* p,
return GetVarint32PtrFallback(p, limit, value);
}
-}
+} // namespace leveldb
#endif // STORAGE_LEVELDB_UTIL_CODING_H_
diff --git a/util/coding_test.cc b/util/coding_test.cc
index a8dba04..4cc856c 100644
--- a/util/coding_test.cc
+++ b/util/coding_test.cc
@@ -166,7 +166,7 @@ TEST(Coding, Strings) {
ASSERT_EQ("", input.ToString());
}
-}
+} // namespace leveldb
int main(int argc, char** argv) {
return leveldb::test::RunAllTests();
diff --git a/util/comparator.cc b/util/comparator.cc
index 2d7544d..cfb49ce 100644
--- a/util/comparator.cc
+++ b/util/comparator.cc
@@ -63,11 +63,11 @@ class BytewiseComparatorImpl : public Comparator {
// *key is a run of 0xffs. Leave it alone.
}
};
-}
+} // namespace
static const BytewiseComparatorImpl bytewise;
const Comparator* BytewiseComparator() {
return &bytewise;
}
-}
+} // namespace leveldb
diff --git a/util/crc32c.cc b/util/crc32c.cc
index 28c2401..6db9e77 100644
--- a/util/crc32c.cc
+++ b/util/crc32c.cc
@@ -328,5 +328,5 @@ uint32_t Extend(uint32_t crc, const char* buf, size_t size) {
return l ^ 0xffffffffu;
}
-}
-}
+} // namespace crc32c
+} // namespace leveldb
diff --git a/util/crc32c.h b/util/crc32c.h
index 938d8ff..1d7e5c0 100644
--- a/util/crc32c.h
+++ b/util/crc32c.h
@@ -39,7 +39,7 @@ inline uint32_t Unmask(uint32_t masked_crc) {
return ((rot >> 17) | (rot << 15));
}
-}
-}
+} // namespace crc32c
+} // namespace leveldb
#endif // STORAGE_LEVELDB_UTIL_CRC32C_H_
diff --git a/util/crc32c_test.cc b/util/crc32c_test.cc
index ba9e804..4b957ee 100644
--- a/util/crc32c_test.cc
+++ b/util/crc32c_test.cc
@@ -64,8 +64,8 @@ TEST(CRC, Mask) {
ASSERT_EQ(crc, Unmask(Unmask(Mask(Mask(crc)))));
}
-}
-}
+} // namespace crc32c
+} // namespace leveldb
int main(int argc, char** argv) {
return leveldb::test::RunAllTests();
diff --git a/util/env.cc b/util/env.cc
index 79e493e..594811b 100644
--- a/util/env.cc
+++ b/util/env.cc
@@ -79,4 +79,4 @@ Status ReadFileToString(Env* env, const std::string& fname, std::string* data) {
EnvWrapper::~EnvWrapper() {
}
-}
+} // namespace leveldb
diff --git a/util/env_posix.cc b/util/env_posix.cc
index 5127c89..cc73348 100644
--- a/util/env_posix.cc
+++ b/util/env_posix.cc
@@ -553,7 +553,7 @@ void PosixEnv::StartThread(void (*function)(void* arg), void* arg) {
pthread_create(&t, NULL, &StartThreadWrapper, state));
}
-}
+} // namespace
static pthread_once_t once = PTHREAD_ONCE_INIT;
static Env* default_env;
@@ -564,4 +564,4 @@ Env* Env::Default() {
return default_env;
}
-}
+} // namespace leveldb
diff --git a/util/env_test.cc b/util/env_test.cc
index 3c253be..3f8a8a2 100644
--- a/util/env_test.cc
+++ b/util/env_test.cc
@@ -95,7 +95,7 @@ TEST(EnvPosixTest, StartThread) {
ASSERT_EQ(state.val, 3);
}
-}
+} // namespace leveldb
int main(int argc, char** argv) {
return leveldb::test::RunAllTests();
diff --git a/util/hash.cc b/util/hash.cc
index d19afd1..ba18180 100644
--- a/util/hash.cc
+++ b/util/hash.cc
@@ -42,4 +42,4 @@ uint32_t Hash(const char* data, size_t n, uint32_t seed) {
}
-}
+} // namespace leveldb
diff --git a/util/histogram.cc b/util/histogram.cc
index 12ec3cf..bb95f58 100644
--- a/util/histogram.cc
+++ b/util/histogram.cc
@@ -136,4 +136,4 @@ std::string Histogram::ToString() const {
return r;
}
-}
+} // namespace leveldb
diff --git a/util/histogram.h b/util/histogram.h
index 32484c0..1ef9f3c 100644
--- a/util/histogram.h
+++ b/util/histogram.h
@@ -37,6 +37,6 @@ class Histogram {
double StandardDeviation() const;
};
-}
+} // namespace leveldb
#endif // STORAGE_LEVELDB_UTIL_HISTOGRAM_H_
diff --git a/util/logging.cc b/util/logging.cc
index 760d335..22cf278 100644
--- a/util/logging.cc
+++ b/util/logging.cc
@@ -78,4 +78,4 @@ bool ConsumeDecimalNumber(Slice* in, uint64_t* val) {
return (digits > 0);
}
-}
+} // namespace leveldb
diff --git a/util/logging.h b/util/logging.h
index 1cd0a4b..b0c5da8 100644
--- a/util/logging.h
+++ b/util/logging.h
@@ -42,6 +42,6 @@ extern bool ConsumeChar(Slice* in, char c);
// unspecified state.
extern bool ConsumeDecimalNumber(Slice* in, uint64_t* val);
-}
+} // namespace leveldb
#endif // STORAGE_LEVELDB_UTIL_LOGGING_H_
diff --git a/util/mutexlock.h b/util/mutexlock.h
index 05fe279..c3f3306 100644
--- a/util/mutexlock.h
+++ b/util/mutexlock.h
@@ -33,7 +33,7 @@ class MutexLock {
void operator=(const MutexLock&);
};
-}
+} // namespace leveldb
#endif // STORAGE_LEVELDB_UTIL_MUTEXLOCK_H_
diff --git a/util/options.cc b/util/options.cc
index 0ea5c98..bb97838 100644
--- a/util/options.cc
+++ b/util/options.cc
@@ -25,4 +25,4 @@ Options::Options()
}
-}
+} // namespace leveldb
diff --git a/util/posix_logger.h b/util/posix_logger.h
index 55428e5..9741b1a 100644
--- a/util/posix_logger.h
+++ b/util/posix_logger.h
@@ -93,6 +93,6 @@ class PosixLogger : public Logger {
}
};
-}
+} // namespace leveldb
#endif // STORAGE_LEVELDB_UTIL_POSIX_LOGGER_H_
diff --git a/util/random.h b/util/random.h
index d886b4e..0753824 100644
--- a/util/random.h
+++ b/util/random.h
@@ -54,6 +54,6 @@ class Random {
}
};
-}
+} // namespace leveldb
#endif // STORAGE_LEVELDB_UTIL_RANDOM_H_
diff --git a/util/status.cc b/util/status.cc
index 02051a9..a44f35b 100644
--- a/util/status.cc
+++ b/util/status.cc
@@ -72,4 +72,4 @@ std::string Status::ToString() const {
}
}
-}
+} // namespace leveldb
diff --git a/util/testharness.cc b/util/testharness.cc
index 6f42700..eb1bdd5 100644
--- a/util/testharness.cc
+++ b/util/testharness.cc
@@ -73,5 +73,5 @@ int RandomSeed() {
return result;
}
-}
-}
+} // namespace test
+} // namespace leveldb
diff --git a/util/testharness.h b/util/testharness.h
index 6f1a9c3..da4fe68 100644
--- a/util/testharness.h
+++ b/util/testharness.h
@@ -132,7 +132,7 @@ void TCONCAT(_Test_,name)::_Run()
extern bool RegisterTest(const char* base, const char* name, void (*func)());
-}
-}
+} // namespace test
+} // namespace leveldb
#endif // STORAGE_LEVELDB_UTIL_TESTHARNESS_H_
diff --git a/util/testutil.cc b/util/testutil.cc
index 8d6cf3c..538d095 100644
--- a/util/testutil.cc
+++ b/util/testutil.cc
@@ -47,5 +47,5 @@ extern Slice CompressibleString(Random* rnd, double compressed_fraction,
return Slice(*dst);
}
-}
-}
+} // namespace test
+} // namespace leveldb
diff --git a/util/testutil.h b/util/testutil.h
index a150c1a..824e655 100644
--- a/util/testutil.h
+++ b/util/testutil.h
@@ -47,7 +47,7 @@ class ErrorEnv : public EnvWrapper {
}
};
-}
-}
+} // namespace test
+} // namespace leveldb
#endif // STORAGE_LEVELDB_UTIL_TESTUTIL_H_