@nxtedition/rocksdb 8.0.1 → 8.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (129) hide show
  1. package/deps/rocksdb/rocksdb/CMakeLists.txt +2 -1
  2. package/deps/rocksdb/rocksdb/Makefile +2 -2
  3. package/deps/rocksdb/rocksdb/TARGETS +4 -2
  4. package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +0 -5
  5. package/deps/rocksdb/rocksdb/cache/cache_test.cc +8 -29
  6. package/deps/rocksdb/rocksdb/cache/clock_cache.cc +146 -0
  7. package/deps/rocksdb/rocksdb/cache/clock_cache.h +13 -1
  8. package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +20 -146
  9. package/deps/rocksdb/rocksdb/cache/secondary_cache.cc +32 -0
  10. package/deps/rocksdb/rocksdb/db/blob/blob_counting_iterator.h +11 -0
  11. package/deps/rocksdb/rocksdb/db/column_family.cc +11 -9
  12. package/deps/rocksdb/rocksdb/db/column_family.h +20 -0
  13. package/deps/rocksdb/rocksdb/db/compaction/clipping_iterator.h +5 -0
  14. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +13 -33
  15. package/deps/rocksdb/rocksdb/db/compaction/compaction.h +5 -0
  16. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +27 -8
  17. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +17 -1
  18. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +2 -1
  19. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +4 -2
  20. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +8 -6
  21. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +65 -7
  22. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +5 -0
  23. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +10 -32
  24. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.h +28 -47
  25. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +28 -22
  26. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.h +8 -14
  27. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +8 -8
  28. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.h +5 -4
  29. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +170 -140
  30. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +5 -1
  31. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.h +5 -4
  32. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_job.cc +8 -2
  33. package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.h +8 -0
  34. package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +266 -138
  35. package/deps/rocksdb/rocksdb/db/corruption_test.cc +86 -1
  36. package/deps/rocksdb/rocksdb/db/db_basic_test.cc +72 -5
  37. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +119 -10
  38. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +585 -264
  39. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +46 -18
  40. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +5 -1
  41. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +6 -15
  42. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +1 -1
  43. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_experimental.cc +1 -1
  44. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +3 -0
  45. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +8 -8
  46. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +10 -0
  47. package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +250 -2
  48. package/deps/rocksdb/rocksdb/db/db_test.cc +3 -0
  49. package/deps/rocksdb/rocksdb/db/db_test2.cc +307 -8
  50. package/deps/rocksdb/rocksdb/db/db_wal_test.cc +129 -0
  51. package/deps/rocksdb/rocksdb/db/db_with_timestamp_compaction_test.cc +21 -0
  52. package/deps/rocksdb/rocksdb/db/dbformat.cc +25 -0
  53. package/deps/rocksdb/rocksdb/db/dbformat.h +2 -0
  54. package/deps/rocksdb/rocksdb/db/experimental.cc +1 -1
  55. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +5 -2
  56. package/deps/rocksdb/rocksdb/db/flush_job.cc +5 -2
  57. package/deps/rocksdb/rocksdb/db/history_trimming_iterator.h +4 -0
  58. package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +56 -53
  59. package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +3 -4
  60. package/deps/rocksdb/rocksdb/db/merge_helper.cc +4 -0
  61. package/deps/rocksdb/rocksdb/db/periodic_task_scheduler_test.cc +10 -10
  62. package/deps/rocksdb/rocksdb/db/repair.cc +64 -22
  63. package/deps/rocksdb/rocksdb/db/repair_test.cc +54 -0
  64. package/deps/rocksdb/rocksdb/db/seqno_time_test.cc +26 -26
  65. package/deps/rocksdb/rocksdb/db/table_cache.cc +2 -0
  66. package/deps/rocksdb/rocksdb/db/table_properties_collector.h +3 -1
  67. package/deps/rocksdb/rocksdb/db/version_builder.cc +90 -43
  68. package/deps/rocksdb/rocksdb/db/version_builder.h +20 -0
  69. package/deps/rocksdb/rocksdb/db/version_builder_test.cc +190 -67
  70. package/deps/rocksdb/rocksdb/db/version_edit.cc +15 -1
  71. package/deps/rocksdb/rocksdb/db/version_edit.h +16 -4
  72. package/deps/rocksdb/rocksdb/db/version_edit_handler.cc +41 -11
  73. package/deps/rocksdb/rocksdb/db/version_edit_handler.h +27 -12
  74. package/deps/rocksdb/rocksdb/db/version_edit_test.cc +18 -16
  75. package/deps/rocksdb/rocksdb/db/version_set.cc +212 -35
  76. package/deps/rocksdb/rocksdb/db/version_set.h +34 -4
  77. package/deps/rocksdb/rocksdb/db/version_set_test.cc +45 -25
  78. package/deps/rocksdb/rocksdb/db/write_thread.cc +5 -2
  79. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +0 -1
  80. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +0 -4
  81. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +12 -17
  82. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +6 -4
  83. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +1 -0
  84. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +0 -48
  85. package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +8 -0
  86. package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +196 -171
  87. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +6 -0
  88. package/deps/rocksdb/rocksdb/include/rocksdb/metadata.h +9 -3
  89. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +25 -18
  90. package/deps/rocksdb/rocksdb/include/rocksdb/secondary_cache.h +27 -5
  91. package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +5 -0
  92. package/deps/rocksdb/rocksdb/include/rocksdb/status.h +3 -0
  93. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +1 -1
  94. package/deps/rocksdb/rocksdb/logging/logging.h +13 -19
  95. package/deps/rocksdb/rocksdb/memory/arena.cc +4 -3
  96. package/deps/rocksdb/rocksdb/memory/arena_test.cc +30 -0
  97. package/deps/rocksdb/rocksdb/monitoring/statistics.cc +3 -1
  98. package/deps/rocksdb/rocksdb/monitoring/stats_history_test.cc +26 -26
  99. package/deps/rocksdb/rocksdb/src.mk +2 -1
  100. package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.cc +3 -2
  101. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +3 -2
  102. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +1 -1
  103. package/deps/rocksdb/rocksdb/table/block_fetcher_test.cc +3 -3
  104. package/deps/rocksdb/rocksdb/table/compaction_merging_iterator.cc +142 -0
  105. package/deps/rocksdb/rocksdb/table/compaction_merging_iterator.h +241 -0
  106. package/deps/rocksdb/rocksdb/table/format.cc +24 -20
  107. package/deps/rocksdb/rocksdb/table/format.h +5 -2
  108. package/deps/rocksdb/rocksdb/table/merging_iterator.cc +97 -115
  109. package/deps/rocksdb/rocksdb/table/merging_iterator.h +82 -1
  110. package/deps/rocksdb/rocksdb/table/meta_blocks.cc +2 -2
  111. package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +1 -1
  112. package/deps/rocksdb/rocksdb/table/table_test.cc +7 -6
  113. package/deps/rocksdb/rocksdb/test_util/testutil.h +10 -0
  114. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +0 -6
  115. package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer.h +2 -2
  116. package/deps/rocksdb/rocksdb/util/bloom_test.cc +1 -1
  117. package/deps/rocksdb/rocksdb/util/status.cc +7 -0
  118. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +5 -0
  119. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +4 -0
  120. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.cc +7 -67
  121. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.h +1 -3
  122. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_impl.cc +1 -0
  123. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +59 -0
  124. package/deps/rocksdb/rocksdb.gyp +2 -1
  125. package/package.json +1 -1
  126. package/prebuilds/darwin-arm64/node.napi.node +0 -0
  127. package/prebuilds/linux-x64/node.napi.node +0 -0
  128. package/deps/rocksdb/rocksdb/cache/fast_lru_cache.cc +0 -580
  129. package/deps/rocksdb/rocksdb/cache/fast_lru_cache.h +0 -476
@@ -12,6 +12,7 @@
12
12
  #include "db/range_del_aggregator.h"
13
13
  #include "rocksdb/slice.h"
14
14
  #include "rocksdb/types.h"
15
+ #include "table/iterator_wrapper.h"
15
16
 
16
17
  namespace ROCKSDB_NAMESPACE {
17
18
 
@@ -45,7 +46,8 @@ class MergeIteratorBuilder {
45
46
  // comparator: the comparator used in merging comparator
46
47
  // arena: where the merging iterator needs to be allocated from.
47
48
  explicit MergeIteratorBuilder(const InternalKeyComparator* comparator,
48
- Arena* arena, bool prefix_seek_mode = false);
49
+ Arena* arena, bool prefix_seek_mode = false,
50
+ const Slice* iterate_upper_bound = nullptr);
49
51
  ~MergeIteratorBuilder();
50
52
 
51
53
  // Add iter to the merging iterator.
@@ -88,4 +90,83 @@ class MergeIteratorBuilder {
88
90
  range_del_iter_ptrs_;
89
91
  };
90
92
 
93
+ // For merging iterator to process range tombstones, we treat the start and end
94
+ // keys of a range tombstone as point keys and put them into the minHeap/maxHeap
95
+ // used in merging iterator. Take minHeap for example, we are able to keep track
96
+ // of currently "active" range tombstones (the ones whose start keys are popped
97
+ // but end keys are still in the heap) in `active_`. This `active_` set of range
98
+ // tombstones is then used to quickly determine whether the point key at heap
99
+ // top is deleted (by heap property, the point key at heap top must be within
100
+ // internal key range of active range tombstones).
101
+ //
102
+ // The HeapItem struct represents 3 types of elements in the minHeap/maxHeap:
103
+ // point key and the start and end keys of a range tombstone.
104
+ struct HeapItem {
105
+ HeapItem() = default;
106
+
107
+ enum Type { ITERATOR, DELETE_RANGE_START, DELETE_RANGE_END };
108
+ IteratorWrapper iter;
109
+ size_t level = 0;
110
+ ParsedInternalKey parsed_ikey;
111
+ std::string range_tombstone_key;
112
+ // Will be overwritten before use, initialize here so compiler does not
113
+ // complain.
114
+ Type type = ITERATOR;
115
+
116
+ explicit HeapItem(size_t _level, InternalIteratorBase<Slice>* _iter)
117
+ : level(_level), type(Type::ITERATOR) {
118
+ iter.Set(_iter);
119
+ }
120
+
121
+ void SetTombstoneKey(ParsedInternalKey&& pik) {
122
+ // op_type is already initialized in MergingIterator::Finish().
123
+ parsed_ikey.user_key = pik.user_key;
124
+ parsed_ikey.sequence = pik.sequence;
125
+ }
126
+
127
+ void SetTombstoneForCompaction(const ParsedInternalKey&& pik) {
128
+ range_tombstone_key.clear();
129
+ AppendInternalKey(&range_tombstone_key, pik);
130
+ }
131
+
132
+ Slice key() const {
133
+ if (LIKELY(type == ITERATOR)) {
134
+ return iter.key();
135
+ }
136
+ return range_tombstone_key;
137
+ }
138
+
139
+ bool IsDeleteRangeSentinelKey() const {
140
+ if (LIKELY(type == ITERATOR)) {
141
+ return iter.IsDeleteRangeSentinelKey();
142
+ }
143
+ return false;
144
+ }
145
+ };
146
+
147
+ class MinHeapItemComparator {
148
+ public:
149
+ explicit MinHeapItemComparator(const InternalKeyComparator* comparator)
150
+ : comparator_(comparator) {}
151
+ bool operator()(HeapItem* a, HeapItem* b) const {
152
+ if (LIKELY(a->type == HeapItem::ITERATOR)) {
153
+ if (LIKELY(b->type == HeapItem::ITERATOR)) {
154
+ return comparator_->Compare(a->iter.key(), b->iter.key()) > 0;
155
+ } else {
156
+ return comparator_->Compare(a->iter.key(), b->parsed_ikey) > 0;
157
+ }
158
+ } else {
159
+ if (LIKELY(b->type == HeapItem::ITERATOR)) {
160
+ return comparator_->Compare(a->parsed_ikey, b->iter.key()) > 0;
161
+ } else {
162
+ return comparator_->Compare(a->parsed_ikey, b->parsed_ikey) > 0;
163
+ }
164
+ }
165
+ }
166
+
167
+ private:
168
+ const InternalKeyComparator* comparator_;
169
+ };
170
+
171
+ using MergerMinIterHeap = BinaryHeap<HeapItem*, MinHeapItemComparator>;
91
172
  } // namespace ROCKSDB_NAMESPACE
@@ -479,8 +479,8 @@ Status ReadMetaIndexBlockInFile(RandomAccessFileReader* file,
479
479
  Footer* footer_out) {
480
480
  Footer footer;
481
481
  IOOptions opts;
482
- auto s = ReadFooterFromFile(opts, file, prefetch_buffer, file_size, &footer,
483
- table_magic_number);
482
+ auto s = ReadFooterFromFile(opts, file, *ioptions.fs, prefetch_buffer,
483
+ file_size, &footer, table_magic_number);
484
484
  if (!s.ok()) {
485
485
  return s;
486
486
  }
@@ -113,7 +113,7 @@ Status SstFileDumper::GetTableReader(const std::string& file_path) {
113
113
  static_cast<size_t>(prefetch_size),
114
114
  Env::IO_TOTAL /* rate_limiter_priority */);
115
115
 
116
- s = ReadFooterFromFile(opts, file_.get(), &prefetch_buffer, file_size,
116
+ s = ReadFooterFromFile(opts, file_.get(), *fs, &prefetch_buffer, file_size,
117
117
  &footer);
118
118
  }
119
119
  if (s.ok()) {
@@ -2256,8 +2256,9 @@ TEST_P(BlockBasedTableTest, BadChecksumType) {
2256
2256
  const MutableCFOptions new_moptions(options);
2257
2257
  Status s = c.Reopen(new_ioptions, new_moptions);
2258
2258
  ASSERT_NOK(s);
2259
+ // "test" is file name
2259
2260
  ASSERT_EQ(s.ToString(),
2260
- "Corruption: Corrupt or unsupported checksum type: 123");
2261
+ "Corruption: Corrupt or unsupported checksum type: 123 in test");
2261
2262
  }
2262
2263
 
2263
2264
  namespace {
@@ -4806,9 +4807,9 @@ TEST_P(BlockBasedTableTest, PropertiesBlockRestartPointTest) {
4806
4807
 
4807
4808
  Footer footer;
4808
4809
  IOOptions opts;
4809
- ASSERT_OK(ReadFooterFromFile(opts, file, nullptr /* prefetch_buffer */,
4810
- file_size, &footer,
4811
- kBlockBasedTableMagicNumber));
4810
+ ASSERT_OK(ReadFooterFromFile(opts, file, *FileSystem::Default(),
4811
+ nullptr /* prefetch_buffer */, file_size,
4812
+ &footer, kBlockBasedTableMagicNumber));
4812
4813
 
4813
4814
  auto BlockFetchHelper = [&](const BlockHandle& handle, BlockType block_type,
4814
4815
  BlockContents* contents) {
@@ -4892,7 +4893,7 @@ TEST_P(BlockBasedTableTest, PropertiesMetaBlockLast) {
4892
4893
  // read footer
4893
4894
  Footer footer;
4894
4895
  IOOptions opts;
4895
- ASSERT_OK(ReadFooterFromFile(opts, table_reader.get(),
4896
+ ASSERT_OK(ReadFooterFromFile(opts, table_reader.get(), *FileSystem::Default(),
4896
4897
  nullptr /* prefetch_buffer */, table_size,
4897
4898
  &footer, kBlockBasedTableMagicNumber));
4898
4899
 
@@ -4970,7 +4971,7 @@ TEST_P(BlockBasedTableTest, SeekMetaBlocks) {
4970
4971
  // read footer
4971
4972
  Footer footer;
4972
4973
  IOOptions opts;
4973
- ASSERT_OK(ReadFooterFromFile(opts, table_reader.get(),
4974
+ ASSERT_OK(ReadFooterFromFile(opts, table_reader.get(), *FileSystem::Default(),
4974
4975
  nullptr /* prefetch_buffer */, table_size,
4975
4976
  &footer, kBlockBasedTableMagicNumber));
4976
4977
 
@@ -363,6 +363,16 @@ class SleepingBackgroundTask {
363
363
  done_with_sleep_(false),
364
364
  sleeping_(false) {}
365
365
 
366
+ ~SleepingBackgroundTask() {
367
+ MutexLock l(&mutex_);
368
+ should_sleep_ = false;
369
+ while (sleeping_) {
370
+ assert(!should_sleep_);
371
+ bg_cv_.SignalAll();
372
+ bg_cv_.Wait();
373
+ }
374
+ }
375
+
366
376
  bool IsSleeping() {
367
377
  MutexLock l(&mutex_);
368
378
  return sleeping_;
@@ -37,7 +37,6 @@
37
37
  #include <thread>
38
38
  #include <unordered_map>
39
39
 
40
- #include "cache/fast_lru_cache.h"
41
40
  #include "db/db_impl/db_impl.h"
42
41
  #include "db/malloc_stats.h"
43
42
  #include "db/version_set.h"
@@ -3055,11 +3054,6 @@ class Benchmark {
3055
3054
  FLAGS_block_size /*estimated_entry_charge*/,
3056
3055
  FLAGS_cache_numshardbits)
3057
3056
  .MakeSharedCache();
3058
- } else if (FLAGS_cache_type == "fast_lru_cache") {
3059
- return NewFastLRUCache(static_cast<size_t>(capacity), FLAGS_block_size,
3060
- FLAGS_cache_numshardbits,
3061
- false /*strict_capacity_limit*/,
3062
- kDefaultCacheMetadataChargePolicy);
3063
3057
  } else if (FLAGS_cache_type == "lru_cache") {
3064
3058
  LRUCacheOptions opts(
3065
3059
  static_cast<size_t>(capacity), FLAGS_cache_numshardbits,
@@ -129,11 +129,11 @@ class BlockCacheTraceWriterImpl : public BlockCacheTraceWriter {
129
129
  // Pass Slice references to avoid copy.
130
130
  Status WriteBlockAccess(const BlockCacheTraceRecord& record,
131
131
  const Slice& block_key, const Slice& cf_name,
132
- const Slice& referenced_key);
132
+ const Slice& referenced_key) override;
133
133
 
134
134
  // Write a trace header at the beginning, typically on initiating a trace,
135
135
  // with some metadata like a magic number and RocksDB version.
136
- Status WriteHeader();
136
+ Status WriteHeader() override;
137
137
 
138
138
  private:
139
139
  SystemClock* clock_;
@@ -806,7 +806,7 @@ TEST_P(FullBloomTest, Schema) {
806
806
  struct RawFilterTester {
807
807
  // Buffer, from which we always return a tail Slice, so the
808
808
  // last five bytes are always the metadata bytes.
809
- std::array<char, 3000> data_;
809
+ std::array<char, 3000> data_{};
810
810
  // Points five bytes from the end
811
811
  char* metadata_ptr_;
812
812
 
@@ -69,6 +69,13 @@ Status::Status(Code _code, SubCode _subcode, const Slice& msg,
69
69
  state_.reset(result);
70
70
  }
71
71
 
72
+ Status Status::CopyAppendMessage(const Status& s, const Slice& delim,
73
+ const Slice& msg) {
74
+ // (No attempt at efficiency)
75
+ return Status(s.code(), s.subcode(), s.severity(),
76
+ std::string(s.getState()) + delim.ToString() + msg.ToString());
77
+ }
78
+
72
79
  std::string Status::ToString() const {
73
80
  #ifdef ROCKSDB_ASSERT_STATUS_CHECKED
74
81
  checked_ = true;
@@ -1635,6 +1635,11 @@ IOStatus BackupEngineImpl::DeleteBackupNoGC(BackupID backup_id) {
1635
1635
  return io_s;
1636
1636
  }
1637
1637
  backups_.erase(backup);
1638
+ if (backups_.empty()) {
1639
+ latest_valid_backup_id_ = 0;
1640
+ } else {
1641
+ latest_valid_backup_id_ = backups_.rbegin()->first;
1642
+ }
1638
1643
  } else {
1639
1644
  auto corrupt = corrupt_backups_.find(backup_id);
1640
1645
  if (corrupt == corrupt_backups_.end()) {
@@ -1213,6 +1213,10 @@ TEST_P(BackupEngineTestWithParam, OnlineIntegrationTest) {
1213
1213
  // check backup 5
1214
1214
  AssertBackupConsistency(5, 0, max_key);
1215
1215
 
1216
+ // check that "latest backup" still works after deleting latest
1217
+ ASSERT_OK(backup_engine_->DeleteBackup(5));
1218
+ AssertBackupConsistency(0, 0, 3 * keys_iteration, max_key);
1219
+
1216
1220
  CloseBackupEngine();
1217
1221
  }
1218
1222
  #endif // !defined(ROCKSDB_VALGRIND_RUN) || defined(ROCKSDB_FULL_VALGRIND_RUN)
@@ -280,7 +280,7 @@ IOStatus CacheDumpedLoaderImpl::RestoreCacheEntriesToSecondaryCache() {
280
280
 
281
281
  // Step 3: read out the rest of the blocks from the reader. The loop will stop
282
282
  // either I/O status is not ok or we reach to the the end.
283
- while (io_s.ok() && dump_unit.type != CacheDumpUnitType::kFooter) {
283
+ while (io_s.ok()) {
284
284
  dump_unit.reset();
285
285
  data.clear();
286
286
  // read the content and store in the dump_unit
@@ -288,74 +288,14 @@ IOStatus CacheDumpedLoaderImpl::RestoreCacheEntriesToSecondaryCache() {
288
288
  if (!io_s.ok()) {
289
289
  break;
290
290
  }
291
+ if (dump_unit.type == CacheDumpUnitType::kFooter) {
292
+ break;
293
+ }
291
294
  // Create the uncompressed_block based on the information in the dump_unit
292
295
  // (There is no block trailer here compatible with block-based SST file.)
293
- BlockContents uncompressed_block(
294
- Slice(static_cast<char*>(dump_unit.value), dump_unit.value_len));
295
- Cache::CacheItemHelper* helper = nullptr;
296
- Statistics* statistics = nullptr;
297
- Status s = Status::OK();
298
- // according to the block type, get the helper callback function and create
299
- // the corresponding block
300
- switch (dump_unit.type) {
301
- case CacheDumpUnitType::kFilter: {
302
- helper = BlocklikeTraits<ParsedFullFilterBlock>::GetCacheItemHelper(
303
- BlockType::kFilter);
304
- std::unique_ptr<ParsedFullFilterBlock> block_holder;
305
- block_holder.reset(BlocklikeTraits<ParsedFullFilterBlock>::Create(
306
- std::move(uncompressed_block), toptions_.read_amp_bytes_per_bit,
307
- statistics, false, toptions_.filter_policy.get()));
308
- if (helper != nullptr) {
309
- s = secondary_cache_->Insert(dump_unit.key,
310
- (void*)(block_holder.get()), helper);
311
- }
312
- break;
313
- }
314
- case CacheDumpUnitType::kData: {
315
- helper = BlocklikeTraits<Block>::GetCacheItemHelper(BlockType::kData);
316
- std::unique_ptr<Block> block_holder;
317
- block_holder.reset(BlocklikeTraits<Block>::Create(
318
- std::move(uncompressed_block), toptions_.read_amp_bytes_per_bit,
319
- statistics, false, toptions_.filter_policy.get()));
320
- if (helper != nullptr) {
321
- s = secondary_cache_->Insert(dump_unit.key,
322
- (void*)(block_holder.get()), helper);
323
- }
324
- break;
325
- }
326
- case CacheDumpUnitType::kIndex: {
327
- helper = BlocklikeTraits<Block>::GetCacheItemHelper(BlockType::kIndex);
328
- std::unique_ptr<Block> block_holder;
329
- block_holder.reset(BlocklikeTraits<Block>::Create(
330
- std::move(uncompressed_block), 0, statistics, false,
331
- toptions_.filter_policy.get()));
332
- if (helper != nullptr) {
333
- s = secondary_cache_->Insert(dump_unit.key,
334
- (void*)(block_holder.get()), helper);
335
- }
336
- break;
337
- }
338
- case CacheDumpUnitType::kFilterMetaBlock: {
339
- helper = BlocklikeTraits<Block>::GetCacheItemHelper(
340
- BlockType::kFilterPartitionIndex);
341
- std::unique_ptr<Block> block_holder;
342
- block_holder.reset(BlocklikeTraits<Block>::Create(
343
- std::move(uncompressed_block), toptions_.read_amp_bytes_per_bit,
344
- statistics, false, toptions_.filter_policy.get()));
345
- if (helper != nullptr) {
346
- s = secondary_cache_->Insert(dump_unit.key,
347
- (void*)(block_holder.get()), helper);
348
- }
349
- break;
350
- }
351
- case CacheDumpUnitType::kFooter:
352
- break;
353
- case CacheDumpUnitType::kDeprecatedFilterBlock:
354
- // Obsolete
355
- break;
356
- default:
357
- continue;
358
- }
296
+ Slice content =
297
+ Slice(static_cast<char*>(dump_unit.value), dump_unit.value_len);
298
+ Status s = secondary_cache_->InsertSaved(dump_unit.key, content);
359
299
  if (!s.ok()) {
360
300
  io_s = status_to_io_status(std::move(s));
361
301
  }
@@ -128,11 +128,10 @@ class CacheDumperImpl : public CacheDumper {
128
128
  class CacheDumpedLoaderImpl : public CacheDumpedLoader {
129
129
  public:
130
130
  CacheDumpedLoaderImpl(const CacheDumpOptions& dump_options,
131
- const BlockBasedTableOptions& toptions,
131
+ const BlockBasedTableOptions& /*toptions*/,
132
132
  const std::shared_ptr<SecondaryCache>& secondary_cache,
133
133
  std::unique_ptr<CacheDumpReader>&& reader)
134
134
  : options_(dump_options),
135
- toptions_(toptions),
136
135
  secondary_cache_(secondary_cache),
137
136
  reader_(std::move(reader)) {}
138
137
  ~CacheDumpedLoaderImpl() {}
@@ -145,7 +144,6 @@ class CacheDumpedLoaderImpl : public CacheDumpedLoader {
145
144
  IOStatus ReadCacheBlock(std::string* data, DumpUnit* dump_unit);
146
145
 
147
146
  CacheDumpOptions options_;
148
- const BlockBasedTableOptions& toptions_;
149
147
  std::shared_ptr<SecondaryCache> secondary_cache_;
150
148
  std::unique_ptr<CacheDumpReader> reader_;
151
149
  UnorderedMap<Cache::DeleterFn, CacheEntryRole> role_map_;
@@ -382,6 +382,7 @@ Status CheckpointImpl::ExportColumnFamily(
382
382
  live_file_metadata.largestkey = std::move(file_metadata.largestkey);
383
383
  live_file_metadata.oldest_blob_file_number =
384
384
  file_metadata.oldest_blob_file_number;
385
+ live_file_metadata.epoch_number = file_metadata.epoch_number;
385
386
  live_file_metadata.level = level_metadata.level;
386
387
  result_metadata->files.push_back(live_file_metadata);
387
388
  }
@@ -6530,6 +6530,65 @@ TEST_P(TransactionTest, WriteWithBulkCreatedColumnFamilies) {
6530
6530
  cf_handles.clear();
6531
6531
  }
6532
6532
 
6533
+ TEST_P(TransactionTest, LockWal) {
6534
+ const TxnDBWritePolicy write_policy = std::get<2>(GetParam());
6535
+ if (TxnDBWritePolicy::WRITE_COMMITTED != write_policy) {
6536
+ ROCKSDB_GTEST_BYPASS("Test only write-committed for now");
6537
+ return;
6538
+ }
6539
+ ASSERT_OK(ReOpen());
6540
+
6541
+ SyncPoint::GetInstance()->DisableProcessing();
6542
+ SyncPoint::GetInstance()->LoadDependency(
6543
+ {{"TransactionTest::LockWal:AfterLockWal",
6544
+ "TransactionTest::LockWal:BeforePrepareTxn2"}});
6545
+ SyncPoint::GetInstance()->EnableProcessing();
6546
+
6547
+ std::unique_ptr<Transaction> txn0;
6548
+ WriteOptions wopts;
6549
+ wopts.no_slowdown = true;
6550
+ txn0.reset(db->BeginTransaction(wopts, TransactionOptions()));
6551
+ ASSERT_OK(txn0->SetName("txn0"));
6552
+ ASSERT_OK(txn0->Put("foo", "v0"));
6553
+
6554
+ std::unique_ptr<Transaction> txn1;
6555
+ txn1.reset(db->BeginTransaction(wopts, TransactionOptions()));
6556
+ ASSERT_OK(txn1->SetName("txn1"));
6557
+ ASSERT_OK(txn1->Put("dummy", "v0"));
6558
+ ASSERT_OK(txn1->Prepare());
6559
+
6560
+ std::unique_ptr<Transaction> txn2;
6561
+ port::Thread worker([&]() {
6562
+ txn2.reset(db->BeginTransaction(WriteOptions(), TransactionOptions()));
6563
+ ASSERT_OK(txn2->SetName("txn2"));
6564
+ ASSERT_OK(txn2->Put("bar", "v0"));
6565
+ TEST_SYNC_POINT("TransactionTest::LockWal:BeforePrepareTxn2");
6566
+ ASSERT_OK(txn2->Prepare());
6567
+ ASSERT_OK(txn2->Commit());
6568
+ });
6569
+ ASSERT_OK(db->LockWAL());
6570
+ // txn0 cannot prepare
6571
+ Status s = txn0->Prepare();
6572
+ ASSERT_TRUE(s.IsIncomplete());
6573
+ // txn1 cannot commit
6574
+ s = txn1->Commit();
6575
+ ASSERT_TRUE(s.IsIncomplete());
6576
+
6577
+ TEST_SYNC_POINT("TransactionTest::LockWal:AfterLockWal");
6578
+
6579
+ ASSERT_OK(db->UnlockWAL());
6580
+ txn0.reset();
6581
+
6582
+ txn0.reset(db->BeginTransaction(wopts, TransactionOptions()));
6583
+ ASSERT_OK(txn0->SetName("txn0_1"));
6584
+ ASSERT_OK(txn0->Put("foo", "v1"));
6585
+ ASSERT_OK(txn0->Prepare());
6586
+ ASSERT_OK(txn0->Commit());
6587
+ worker.join();
6588
+
6589
+ SyncPoint::GetInstance()->DisableProcessing();
6590
+ }
6591
+
6533
6592
  } // namespace ROCKSDB_NAMESPACE
6534
6593
 
6535
6594
  int main(int argc, char** argv) {
@@ -168,8 +168,8 @@
168
168
  "rocksdb/cache/charged_cache.cc",
169
169
  "rocksdb/cache/clock_cache.cc",
170
170
  "rocksdb/cache/compressed_secondary_cache.cc",
171
- "rocksdb/cache/fast_lru_cache.cc",
172
171
  "rocksdb/cache/lru_cache.cc",
172
+ "rocksdb/cache/secondary_cache.cc",
173
173
  "rocksdb/cache/sharded_cache.cc",
174
174
  "rocksdb/db/arena_wrapped_db_iter.cc",
175
175
  "rocksdb/db/blob/blob_contents.cc",
@@ -339,6 +339,7 @@
339
339
  "rocksdb/table/block_based/reader_common.cc",
340
340
  "rocksdb/table/block_based/uncompression_dict_reader.cc",
341
341
  "rocksdb/table/block_fetcher.cc",
342
+ "rocksdb/table/compaction_merging_iterator.cc",
342
343
  "rocksdb/table/cuckoo/cuckoo_table_builder.cc",
343
344
  "rocksdb/table/cuckoo/cuckoo_table_factory.cc",
344
345
  "rocksdb/table/cuckoo/cuckoo_table_reader.cc",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nxtedition/rocksdb",
3
- "version": "8.0.1",
3
+ "version": "8.0.2",
4
4
  "description": "A low-level Node.js RocksDB binding",
5
5
  "license": "MIT",
6
6
  "main": "index.js",
Binary file