84d6d69fc6
a02ddf9 Added GNU/kFreeBSD kernel name (TARGET_OS) 8487468 CondVar::SignalAll was broken, leading to deadlocks on Windows builds. http://code.google.com/p/leveldb/issues/detail?id=149 f6d84d1 Allow files to be opened for reading multiple times cb8e3f7 Checking whether closing succeeds d5317e8 Print actual Win32 error that occurred on file creation failure. 907f308 Port leveldb to MinGW32 9def2bf Mingw support for Windows LevelDB port 0a7b074 Pre-Vista leveldb::port::InitOnce implementation 31a2b09 Native Windows LevelDB port 058a035 Remove Snappy support 5bd76dc Release leveldb 1.12 7b094f1 Release leveldb 1.11 28dad91 Release leveldb 1.10 514c943 Make DB::Open fail if sst files are missing. d84c825 Fix corruption bug found and analyzed by dhruba@gmail.com ea2e919 added utility to dump leveldb files REVERT: ae6c262 Merge branch 'leveldb' into ripple-fork REVERT: 28fa222 Looks like a bit more delay is needed to smooth the latency. REVERT: a18f3e6 Tidy up JobQueue, add ripple_core module REVERT: ab82e57 Release leveldb 1.12 REVERT: 02c6259 Release leveldb 1.11 REVERT: 5bbb544 Rate limit compactions with a 25ms pause after each complete file. REVERT: 8c29c47 LevelDB issue 178 fix: cannot resize a level 0 compaction set REVERT: 18b245c Added GNU/kFreeBSD kernel name (TARGET_OS) REVERT: 8be9d12 CondVar::SignalAll was broken, leading to deadlocks on Windows builds. http://code.google.com/p/leveldb/issues/detail?id=149 REVERT: c9fc070 Upgrade LevelDB to 1.10.0, mostly for better write stall logging. REVERT: 8215b15 Tweak to variable name to support unity build REVERT: aca1ffc Allow files to be opened for reading multiple times REVERT: 693a70c Checking whether closing succeeds REVERT: 0144d04 Print actual Win32 error that occurred on file creation failure. REVERT: 43ed517 Fix corruption bug found and analyzed by dhruba@gmail.com REVERT: 413c74c added utility to dump leveldb files REVERT: 96eda85 Port leveldb to MinGW32 REVERT: 0967260 Mingw support for Windows LevelDB port REVERT: ee3f9bd Pre-Vista leveldb::port::InitOnce implementation REVERT: f5d0a41 Native Windows LevelDB port REVERT: 28b35f1 Remove Snappy support git-subtree-dir: src/leveldb git-subtree-split: a02ddf9b14d145e88185ee209ab8b01d8826663a
93 lines
2.5 KiB
C++
93 lines
2.5 KiB
C++
// Copyright (c) 2013 The LevelDB Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file. See the AUTHORS file for names of contributors.
|
|
|
|
// Test for issue 178: a manual compaction causes deleted data to reappear.
|
|
#include <iostream>
|
|
#include <sstream>
|
|
#include <cstdlib>
|
|
|
|
#include "leveldb/db.h"
|
|
#include "leveldb/write_batch.h"
|
|
#include "util/testharness.h"
|
|
|
|
namespace {
|
|
|
|
const int kNumKeys = 1100000;
|
|
|
|
std::string Key1(int i) {
|
|
char buf[100];
|
|
snprintf(buf, sizeof(buf), "my_key_%d", i);
|
|
return buf;
|
|
}
|
|
|
|
std::string Key2(int i) {
|
|
return Key1(i) + "_xxx";
|
|
}
|
|
|
|
class Issue178 { };
|
|
|
|
TEST(Issue178, Test) {
|
|
// Get rid of any state from an old run.
|
|
std::string dbpath = leveldb::test::TmpDir() + "/leveldb_cbug_test";
|
|
DestroyDB(dbpath, leveldb::Options());
|
|
|
|
// Open database. Disable compression since it affects the creation
|
|
// of layers and the code below is trying to test against a very
|
|
// specific scenario.
|
|
leveldb::DB* db;
|
|
leveldb::Options db_options;
|
|
db_options.create_if_missing = true;
|
|
db_options.compression = leveldb::kNoCompression;
|
|
ASSERT_OK(leveldb::DB::Open(db_options, dbpath, &db));
|
|
|
|
// create first key range
|
|
leveldb::WriteBatch batch;
|
|
for (size_t i = 0; i < kNumKeys; i++) {
|
|
batch.Put(Key1(i), "value for range 1 key");
|
|
}
|
|
ASSERT_OK(db->Write(leveldb::WriteOptions(), &batch));
|
|
|
|
// create second key range
|
|
batch.Clear();
|
|
for (size_t i = 0; i < kNumKeys; i++) {
|
|
batch.Put(Key2(i), "value for range 2 key");
|
|
}
|
|
ASSERT_OK(db->Write(leveldb::WriteOptions(), &batch));
|
|
|
|
// delete second key range
|
|
batch.Clear();
|
|
for (size_t i = 0; i < kNumKeys; i++) {
|
|
batch.Delete(Key2(i));
|
|
}
|
|
ASSERT_OK(db->Write(leveldb::WriteOptions(), &batch));
|
|
|
|
// compact database
|
|
std::string start_key = Key1(0);
|
|
std::string end_key = Key1(kNumKeys - 1);
|
|
leveldb::Slice least(start_key.data(), start_key.size());
|
|
leveldb::Slice greatest(end_key.data(), end_key.size());
|
|
|
|
// commenting out the line below causes the example to work correctly
|
|
db->CompactRange(&least, &greatest);
|
|
|
|
// count the keys
|
|
leveldb::Iterator* iter = db->NewIterator(leveldb::ReadOptions());
|
|
size_t num_keys = 0;
|
|
for (iter->SeekToFirst(); iter->Valid(); iter->Next()) {
|
|
num_keys++;
|
|
}
|
|
delete iter;
|
|
ASSERT_EQ(kNumKeys, num_keys) << "Bad number of keys";
|
|
|
|
// close database
|
|
delete db;
|
|
DestroyDB(dbpath, leveldb::Options());
|
|
}
|
|
|
|
} // anonymous namespace
|
|
|
|
int main(int argc, char** argv) {
|
|
return leveldb::test::RunAllTests();
|
|
}
|