leveldb 0.1.4 → 0.1.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8ac9eef1bb10dc5b82a7ea8cc6f4c2d64cc5d04c
4
- data.tar.gz: 04748952f04ef49c0c5622712ade7f4b3fc211e8
3
+ metadata.gz: 39f09bcd9ed833797306c673c09e81482afedfe8
4
+ data.tar.gz: 08c71c65dcf4ac2ec68c62bf6173467ed3e07301
5
5
  SHA512:
6
- metadata.gz: 06f097cb8df8f2f5679dfced115ee73236caa4770aea85302d54c58dbf9d451982356e404cd3050ed8413df1bd7e4bd6379e5a7789ef2f5b81db48f216f40346
7
- data.tar.gz: 2f846938f51b43632a5c9629ea618eccbcdabc42ccba33f63fe0e8a6ade6dbf026485c9461b8b99ab7cce1400135e15d1ba29311c58496963d90b99a9337dbf8
6
+ metadata.gz: affebf16615c3dcba550d756c44254641b1efc1f21c0f035754079b4ae5e4e5a7fd5ec496c1bb5b36199bedac54ee9dff0388ce0a5fd34140897e50949842359
7
+ data.tar.gz: 333c4c2eaf9e834c65849e5d46f10126d1b74944a24a799b4c0038ecf45e77d9c1b55c31f9506bc898fe887a02d56067510ff0fa749b321850f9166d5a45c0e4
data/ext/leveldb/Makefile CHANGED
@@ -44,6 +44,7 @@ TESTS = \
44
44
  filename_test \
45
45
  filter_block_test \
46
46
  issue178_test \
47
+ issue200_test \
47
48
  log_test \
48
49
  memenv_test \
49
50
  skiplist_test \
@@ -71,7 +72,7 @@ SHARED = $(SHARED1)
71
72
  else
72
73
  # Update db.h if you change these.
73
74
  SHARED_MAJOR = 1
74
- SHARED_MINOR = 13
75
+ SHARED_MINOR = 14
75
76
  SHARED1 = libleveldb.$(PLATFORM_SHARED_EXT)
76
77
  SHARED2 = $(SHARED1).$(SHARED_MAJOR)
77
78
  SHARED3 = $(SHARED1).$(SHARED_MAJOR).$(SHARED_MINOR)
@@ -154,6 +155,9 @@ filter_block_test: table/filter_block_test.o $(LIBOBJECTS) $(TESTHARNESS)
154
155
  issue178_test: issues/issue178_test.o $(LIBOBJECTS) $(TESTHARNESS)
155
156
  $(CXX) $(LDFLAGS) issues/issue178_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ $(LIBS)
156
157
 
158
+ issue200_test: issues/issue200_test.o $(LIBOBJECTS) $(TESTHARNESS)
159
+ $(CXX) $(LDFLAGS) issues/issue200_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ $(LIBS)
160
+
157
161
  log_test: db/log_test.o $(LIBOBJECTS) $(TESTHARNESS)
158
162
  $(CXX) $(LDFLAGS) db/log_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ $(LIBS)
159
163
 
@@ -191,14 +195,14 @@ IOSVERSION=$(shell defaults read $(PLATFORMSROOT)/iPhoneOS.platform/version CFBu
191
195
  mkdir -p ios-x86/$(dir $@)
192
196
  $(CXX) $(CXXFLAGS) -isysroot $(SIMULATORROOT)/SDKs/iPhoneSimulator$(IOSVERSION).sdk -arch i686 -c $< -o ios-x86/$@
193
197
  mkdir -p ios-arm/$(dir $@)
194
- $(DEVICEROOT)/usr/bin/$(CXX) $(CXXFLAGS) -isysroot $(DEVICEROOT)/SDKs/iPhoneOS$(IOSVERSION).sdk -arch armv6 -arch armv7 -c $< -o ios-arm/$@
198
+ xcrun -sdk iphoneos $(CXX) $(CXXFLAGS) -isysroot $(DEVICEROOT)/SDKs/iPhoneOS$(IOSVERSION).sdk -arch armv6 -arch armv7 -c $< -o ios-arm/$@
195
199
  lipo ios-x86/$@ ios-arm/$@ -create -output $@
196
200
 
197
201
  .c.o:
198
202
  mkdir -p ios-x86/$(dir $@)
199
203
  $(CC) $(CFLAGS) -isysroot $(SIMULATORROOT)/SDKs/iPhoneSimulator$(IOSVERSION).sdk -arch i686 -c $< -o ios-x86/$@
200
204
  mkdir -p ios-arm/$(dir $@)
201
- $(DEVICEROOT)/usr/bin/$(CC) $(CFLAGS) -isysroot $(DEVICEROOT)/SDKs/iPhoneOS$(IOSVERSION).sdk -arch armv6 -arch armv7 -c $< -o ios-arm/$@
205
+ xcrun -sdk iphoneos $(CC) $(CFLAGS) -isysroot $(DEVICEROOT)/SDKs/iPhoneOS$(IOSVERSION).sdk -arch armv6 -arch armv7 -c $< -o ios-arm/$@
202
206
  lipo ios-x86/$@ ios-arm/$@ -create -output $@
203
207
 
204
208
  else
@@ -161,12 +161,13 @@ void DBIter::Next() {
161
161
  saved_key_.clear();
162
162
  return;
163
163
  }
164
+ // saved_key_ already contains the key to skip past.
165
+ } else {
166
+ // Store in saved_key_ the current key so we skip it below.
167
+ SaveKey(ExtractUserKey(iter_->key()), &saved_key_);
164
168
  }
165
169
 
166
- // Temporarily use saved_key_ as storage for key to skip.
167
- std::string* skip = &saved_key_;
168
- SaveKey(ExtractUserKey(iter_->key()), skip);
169
- FindNextUserEntry(true, skip);
170
+ FindNextUserEntry(true, &saved_key_);
170
171
  }
171
172
 
172
173
  void DBIter::FindNextUserEntry(bool skipping, std::string* skip) {
@@ -147,7 +147,7 @@ class SpecialEnv : public EnvWrapper {
147
147
 
148
148
  Status s = target()->NewWritableFile(f, r);
149
149
  if (s.ok()) {
150
- if (strstr(f.c_str(), ".sst") != NULL) {
150
+ if (strstr(f.c_str(), ".ldb") != NULL) {
151
151
  *r = new SSTableFile(this, *r);
152
152
  } else if (strstr(f.c_str(), "MANIFEST") != NULL) {
153
153
  *r = new ManifestFile(this, *r);
@@ -484,6 +484,24 @@ class DBTest {
484
484
  }
485
485
  return false;
486
486
  }
487
+
488
+ // Returns number of files renamed.
489
+ int RenameLDBToSST() {
490
+ std::vector<std::string> filenames;
491
+ ASSERT_OK(env_->GetChildren(dbname_, &filenames));
492
+ uint64_t number;
493
+ FileType type;
494
+ int files_renamed = 0;
495
+ for (size_t i = 0; i < filenames.size(); i++) {
496
+ if (ParseFileName(filenames[i], &number, &type) && type == kTableFile) {
497
+ const std::string from = TableFileName(dbname_, number);
498
+ const std::string to = SSTTableFileName(dbname_, number);
499
+ ASSERT_OK(env_->RenameFile(from, to));
500
+ files_renamed++;
501
+ }
502
+ }
503
+ return files_renamed;
504
+ }
487
505
  };
488
506
 
489
507
  TEST(DBTest, Empty) {
@@ -1632,6 +1650,22 @@ TEST(DBTest, MissingSSTFile) {
1632
1650
  << s.ToString();
1633
1651
  }
1634
1652
 
1653
+ TEST(DBTest, StillReadSST) {
1654
+ ASSERT_OK(Put("foo", "bar"));
1655
+ ASSERT_EQ("bar", Get("foo"));
1656
+
1657
+ // Dump the memtable to disk.
1658
+ dbfull()->TEST_CompactMemTable();
1659
+ ASSERT_EQ("bar", Get("foo"));
1660
+ Close();
1661
+ ASSERT_GT(RenameLDBToSST(), 0);
1662
+ Options options = CurrentOptions();
1663
+ options.paranoid_checks = true;
1664
+ Status s = TryReopen(&options);
1665
+ ASSERT_TRUE(s.ok());
1666
+ ASSERT_EQ("bar", Get("foo"));
1667
+ }
1668
+
1635
1669
  TEST(DBTest, FilesDeletedAfterCompaction) {
1636
1670
  ASSERT_OK(Put("foo", "v2"));
1637
1671
  Compact("a", "z");
@@ -30,6 +30,11 @@ std::string LogFileName(const std::string& name, uint64_t number) {
30
30
  }
31
31
 
32
32
  std::string TableFileName(const std::string& name, uint64_t number) {
33
+ assert(number > 0);
34
+ return MakeFileName(name, number, "ldb");
35
+ }
36
+
37
+ std::string SSTTableFileName(const std::string& name, uint64_t number) {
33
38
  assert(number > 0);
34
39
  return MakeFileName(name, number, "sst");
35
40
  }
@@ -71,7 +76,7 @@ std::string OldInfoLogFileName(const std::string& dbname) {
71
76
  // dbname/LOG
72
77
  // dbname/LOG.old
73
78
  // dbname/MANIFEST-[0-9]+
74
- // dbname/[0-9]+.(log|sst)
79
+ // dbname/[0-9]+.(log|sst|ldb)
75
80
  bool ParseFileName(const std::string& fname,
76
81
  uint64_t* number,
77
82
  FileType* type) {
@@ -106,7 +111,7 @@ bool ParseFileName(const std::string& fname,
106
111
  Slice suffix = rest;
107
112
  if (suffix == Slice(".log")) {
108
113
  *type = kLogFile;
109
- } else if (suffix == Slice(".sst")) {
114
+ } else if (suffix == Slice(".sst") || suffix == Slice(".ldb")) {
110
115
  *type = kTableFile;
111
116
  } else if (suffix == Slice(".dbtmp")) {
112
117
  *type = kTempFile;
@@ -37,6 +37,11 @@ extern std::string LogFileName(const std::string& dbname, uint64_t number);
37
37
  // "dbname".
38
38
  extern std::string TableFileName(const std::string& dbname, uint64_t number);
39
39
 
40
+ // Return the legacy file name for an sstable with the specified number
41
+ // in the db named by "dbname". The result will be prefixed with
42
+ // "dbname".
43
+ extern std::string SSTTableFileName(const std::string& dbname, uint64_t number);
44
+
40
45
  // Return the name of the descriptor file for the db named by
41
46
  // "dbname" and the specified incarnation number. The result will be
42
47
  // prefixed with "dbname".
@@ -27,6 +27,7 @@ TEST(FileNameTest, Parse) {
27
27
  { "100.log", 100, kLogFile },
28
28
  { "0.log", 0, kLogFile },
29
29
  { "0.sst", 0, kTableFile },
30
+ { "0.ldb", 0, kTableFile },
30
31
  { "CURRENT", 0, kCurrentFile },
31
32
  { "LOCK", 0, kDBLockFile },
32
33
  { "MANIFEST-2", 2, kDescriptorFile },
@@ -263,6 +263,12 @@ class Repairer {
263
263
  std::string fname = TableFileName(dbname_, t->meta.number);
264
264
  int counter = 0;
265
265
  Status status = env_->GetFileSize(fname, &t->meta.file_size);
266
+ if (!status.ok()) {
267
+ fname = SSTTableFileName(dbname_, t->meta.number);
268
+ Status s2 = env_->GetFileSize(fname, &t->meta.file_size);
269
+ if (s2.ok())
270
+ status = Status::OK();
271
+ }
266
272
  if (status.ok()) {
267
273
  Iterator* iter = table_cache_->NewIterator(
268
274
  ReadOptions(), t->meta.number, t->meta.file_size);
@@ -293,6 +299,8 @@ class Repairer {
293
299
  }
294
300
  delete iter;
295
301
  }
302
+ // If there was trouble opening an .sst file this will report that the .ldb
303
+ // file was not found, which is kind of lame but shouldn't happen often.
296
304
  Log(options_.info_log, "Table #%llu: %d entries %s",
297
305
  (unsigned long long) t->meta.number,
298
306
  counter,
@@ -54,6 +54,12 @@ Status TableCache::FindTable(uint64_t file_number, uint64_t file_size,
54
54
  RandomAccessFile* file = NULL;
55
55
  Table* table = NULL;
56
56
  s = env_->NewRandomAccessFile(fname, &file);
57
+ if (!s.ok()) {
58
+ std::string old_fname = SSTTableFileName(dbname_, file_number);
59
+ if (env_->NewRandomAccessFile(old_fname, &file).ok()) {
60
+ s = Status::OK();
61
+ }
62
+ }
57
63
  if (s.ok()) {
58
64
  s = Table::Open(*options_, file, file_size, &table);
59
65
  }
@@ -14,7 +14,7 @@ namespace leveldb {
14
14
 
15
15
  // Update Makefile if you change these
16
16
  static const int kMajorVersion = 1;
17
- static const int kMinorVersion = 13;
17
+ static const int kMinorVersion = 14;
18
18
 
19
19
  struct Options;
20
20
  struct ReadOptions;
@@ -0,0 +1,59 @@
1
+ // Copyright (c) 2013 The LevelDB Authors. All rights reserved.
2
+ // Use of this source code is governed by a BSD-style license that can be
3
+ // found in the LICENSE file. See the AUTHORS file for names of contributors.
4
+
5
+ // Test for issue 200: when iterator switches direction from backward
6
+ // to forward, the current key can be yielded unexpectedly if a new
7
+ // mutation has been added just before the current key.
8
+
9
+ #include "leveldb/db.h"
10
+ #include "util/testharness.h"
11
+
12
+ namespace leveldb {
13
+
14
+ class Issue200 { };
15
+
16
+ TEST(Issue200, Test) {
17
+ // Get rid of any state from an old run.
18
+ std::string dbpath = test::TmpDir() + "/leveldb_issue200_test";
19
+ DestroyDB(dbpath, Options());
20
+
21
+ DB *db;
22
+ Options options;
23
+ options.create_if_missing = true;
24
+ ASSERT_OK(DB::Open(options, dbpath, &db));
25
+
26
+ WriteOptions write_options;
27
+ ASSERT_OK(db->Put(write_options, "1", "b"));
28
+ ASSERT_OK(db->Put(write_options, "2", "c"));
29
+ ASSERT_OK(db->Put(write_options, "3", "d"));
30
+ ASSERT_OK(db->Put(write_options, "4", "e"));
31
+ ASSERT_OK(db->Put(write_options, "5", "f"));
32
+
33
+ ReadOptions read_options;
34
+ Iterator *iter = db->NewIterator(read_options);
35
+
36
+ // Add an element that should not be reflected in the iterator.
37
+ ASSERT_OK(db->Put(write_options, "25", "cd"));
38
+
39
+ iter->Seek("5");
40
+ ASSERT_EQ(iter->key().ToString(), "5");
41
+ iter->Prev();
42
+ ASSERT_EQ(iter->key().ToString(), "4");
43
+ iter->Prev();
44
+ ASSERT_EQ(iter->key().ToString(), "3");
45
+ iter->Next();
46
+ ASSERT_EQ(iter->key().ToString(), "4");
47
+ iter->Next();
48
+ ASSERT_EQ(iter->key().ToString(), "5");
49
+
50
+ delete iter;
51
+ delete db;
52
+ DestroyDB(dbpath, options);
53
+ }
54
+
55
+ } // namespace leveldb
56
+
57
+ int main(int argc, char** argv) {
58
+ return leveldb::test::RunAllTests();
59
+ }
@@ -40,7 +40,7 @@ char* Arena::AllocateFallback(size_t bytes) {
40
40
  }
41
41
 
42
42
  char* Arena::AllocateAligned(size_t bytes) {
43
- const int align = sizeof(void*); // We'll align to pointer size
43
+ const int align = (sizeof(void*) > 8) ? sizeof(void*) : 8;
44
44
  assert((align & (align-1)) == 0); // Pointer size should be a power of 2
45
45
  size_t current_mod = reinterpret_cast<uintptr_t>(alloc_ptr_) & (align-1);
46
46
  size_t slop = (current_mod == 0 ? 0 : align - current_mod);
@@ -1,3 +1,3 @@
1
1
  module LevelDB
2
- VERSION = '0.1.4'
2
+ VERSION = '0.1.5'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: leveldb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.1.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - DAddYE
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-09-18 00:00:00.000000000 Z
11
+ date: 2013-09-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: fiddler-rb
@@ -121,6 +121,7 @@ files:
121
121
  - ext/leveldb/helpers/memenv/memenv.cc
122
122
  - ext/leveldb/helpers/memenv/memenv_test.cc
123
123
  - ext/leveldb/issues/issue178_test.cc
124
+ - ext/leveldb/issues/issue200_test.cc
124
125
  - ext/leveldb/port/port_posix.cc
125
126
  - ext/leveldb/table/block.cc
126
127
  - ext/leveldb/table/block_builder.cc
@@ -208,7 +209,6 @@ files:
208
209
  - ext/leveldb/util/random.h
209
210
  - ext/leveldb/util/testharness.h
210
211
  - ext/leveldb/util/testutil.h
211
- - ext/leveldb/build_config.mk
212
212
  - ext/leveldb/LICENSE
213
213
  - ext/leveldb/Makefile
214
214
  - lib/leveldb/batch.rb
@@ -1,13 +0,0 @@
1
- SOURCES=db/builder.cc db/c.cc db/db_impl.cc db/db_iter.cc db/dbformat.cc db/filename.cc db/log_reader.cc db/log_writer.cc db/memtable.cc db/repair.cc db/table_cache.cc db/version_edit.cc db/version_set.cc db/write_batch.cc table/block.cc table/block_builder.cc table/filter_block.cc table/format.cc table/iterator.cc table/merger.cc table/table.cc table/table_builder.cc table/two_level_iterator.cc util/arena.cc util/bloom.cc util/cache.cc util/coding.cc util/comparator.cc util/crc32c.cc util/env.cc util/env_posix.cc util/filter_policy.cc util/hash.cc util/histogram.cc util/logging.cc util/options.cc util/status.cc port/port_posix.cc
2
- MEMENV_SOURCES=helpers/memenv/memenv.cc
3
- CC=cc
4
- CXX=c++
5
- PLATFORM=OS_MACOSX
6
- PLATFORM_LDFLAGS=
7
- PLATFORM_LIBS= -lsnappy
8
- PLATFORM_CCFLAGS= -DOS_MACOSX -DLEVELDB_PLATFORM_POSIX -DSNAPPY
9
- PLATFORM_CXXFLAGS= -DOS_MACOSX -DLEVELDB_PLATFORM_POSIX -DSNAPPY
10
- PLATFORM_SHARED_CFLAGS=-fPIC
11
- PLATFORM_SHARED_EXT=dylib
12
- PLATFORM_SHARED_LDFLAGS=-dynamiclib -install_name /usr/src/extras/leveldb/ext/leveldb/
13
- PLATFORM_SHARED_VERSIONED=true