@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.
- package/deps/rocksdb/rocksdb/CMakeLists.txt +2 -1
- package/deps/rocksdb/rocksdb/Makefile +2 -2
- package/deps/rocksdb/rocksdb/TARGETS +4 -2
- package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +0 -5
- package/deps/rocksdb/rocksdb/cache/cache_test.cc +8 -29
- package/deps/rocksdb/rocksdb/cache/clock_cache.cc +146 -0
- package/deps/rocksdb/rocksdb/cache/clock_cache.h +13 -1
- package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +20 -146
- package/deps/rocksdb/rocksdb/cache/secondary_cache.cc +32 -0
- package/deps/rocksdb/rocksdb/db/blob/blob_counting_iterator.h +11 -0
- package/deps/rocksdb/rocksdb/db/column_family.cc +11 -9
- package/deps/rocksdb/rocksdb/db/column_family.h +20 -0
- package/deps/rocksdb/rocksdb/db/compaction/clipping_iterator.h +5 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +13 -33
- package/deps/rocksdb/rocksdb/db/compaction/compaction.h +5 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +27 -8
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +17 -1
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +2 -1
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +4 -2
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +8 -6
- package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +65 -7
- package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +5 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +10 -32
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.h +28 -47
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +28 -22
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.h +8 -14
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +8 -8
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.h +5 -4
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +170 -140
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +5 -1
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.h +5 -4
- package/deps/rocksdb/rocksdb/db/compaction/compaction_service_job.cc +8 -2
- package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.h +8 -0
- package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +266 -138
- package/deps/rocksdb/rocksdb/db/corruption_test.cc +86 -1
- package/deps/rocksdb/rocksdb/db/db_basic_test.cc +72 -5
- package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +119 -10
- package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +585 -264
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +46 -18
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +5 -1
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +6 -15
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +1 -1
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_experimental.cc +1 -1
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +3 -0
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +8 -8
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +10 -0
- package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +250 -2
- package/deps/rocksdb/rocksdb/db/db_test.cc +3 -0
- package/deps/rocksdb/rocksdb/db/db_test2.cc +307 -8
- package/deps/rocksdb/rocksdb/db/db_wal_test.cc +129 -0
- package/deps/rocksdb/rocksdb/db/db_with_timestamp_compaction_test.cc +21 -0
- package/deps/rocksdb/rocksdb/db/dbformat.cc +25 -0
- package/deps/rocksdb/rocksdb/db/dbformat.h +2 -0
- package/deps/rocksdb/rocksdb/db/experimental.cc +1 -1
- package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +5 -2
- package/deps/rocksdb/rocksdb/db/flush_job.cc +5 -2
- package/deps/rocksdb/rocksdb/db/history_trimming_iterator.h +4 -0
- package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +56 -53
- package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +3 -4
- package/deps/rocksdb/rocksdb/db/merge_helper.cc +4 -0
- package/deps/rocksdb/rocksdb/db/periodic_task_scheduler_test.cc +10 -10
- package/deps/rocksdb/rocksdb/db/repair.cc +64 -22
- package/deps/rocksdb/rocksdb/db/repair_test.cc +54 -0
- package/deps/rocksdb/rocksdb/db/seqno_time_test.cc +26 -26
- package/deps/rocksdb/rocksdb/db/table_cache.cc +2 -0
- package/deps/rocksdb/rocksdb/db/table_properties_collector.h +3 -1
- package/deps/rocksdb/rocksdb/db/version_builder.cc +90 -43
- package/deps/rocksdb/rocksdb/db/version_builder.h +20 -0
- package/deps/rocksdb/rocksdb/db/version_builder_test.cc +190 -67
- package/deps/rocksdb/rocksdb/db/version_edit.cc +15 -1
- package/deps/rocksdb/rocksdb/db/version_edit.h +16 -4
- package/deps/rocksdb/rocksdb/db/version_edit_handler.cc +41 -11
- package/deps/rocksdb/rocksdb/db/version_edit_handler.h +27 -12
- package/deps/rocksdb/rocksdb/db/version_edit_test.cc +18 -16
- package/deps/rocksdb/rocksdb/db/version_set.cc +212 -35
- package/deps/rocksdb/rocksdb/db/version_set.h +34 -4
- package/deps/rocksdb/rocksdb/db/version_set_test.cc +45 -25
- package/deps/rocksdb/rocksdb/db/write_thread.cc +5 -2
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +0 -1
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +0 -4
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +12 -17
- package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +6 -4
- package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +1 -0
- package/deps/rocksdb/rocksdb/file/prefetch_test.cc +0 -48
- package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +8 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +196 -171
- package/deps/rocksdb/rocksdb/include/rocksdb/db.h +6 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/metadata.h +9 -3
- package/deps/rocksdb/rocksdb/include/rocksdb/options.h +25 -18
- package/deps/rocksdb/rocksdb/include/rocksdb/secondary_cache.h +27 -5
- package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +5 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/status.h +3 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/version.h +1 -1
- package/deps/rocksdb/rocksdb/logging/logging.h +13 -19
- package/deps/rocksdb/rocksdb/memory/arena.cc +4 -3
- package/deps/rocksdb/rocksdb/memory/arena_test.cc +30 -0
- package/deps/rocksdb/rocksdb/monitoring/statistics.cc +3 -1
- package/deps/rocksdb/rocksdb/monitoring/stats_history_test.cc +26 -26
- package/deps/rocksdb/rocksdb/src.mk +2 -1
- package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.cc +3 -2
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +3 -2
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +1 -1
- package/deps/rocksdb/rocksdb/table/block_fetcher_test.cc +3 -3
- package/deps/rocksdb/rocksdb/table/compaction_merging_iterator.cc +142 -0
- package/deps/rocksdb/rocksdb/table/compaction_merging_iterator.h +241 -0
- package/deps/rocksdb/rocksdb/table/format.cc +24 -20
- package/deps/rocksdb/rocksdb/table/format.h +5 -2
- package/deps/rocksdb/rocksdb/table/merging_iterator.cc +97 -115
- package/deps/rocksdb/rocksdb/table/merging_iterator.h +82 -1
- package/deps/rocksdb/rocksdb/table/meta_blocks.cc +2 -2
- package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +1 -1
- package/deps/rocksdb/rocksdb/table/table_test.cc +7 -6
- package/deps/rocksdb/rocksdb/test_util/testutil.h +10 -0
- package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +0 -6
- package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer.h +2 -2
- package/deps/rocksdb/rocksdb/util/bloom_test.cc +1 -1
- package/deps/rocksdb/rocksdb/util/status.cc +7 -0
- package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +5 -0
- package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +4 -0
- package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.cc +7 -67
- package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.h +1 -3
- package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_impl.cc +1 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +59 -0
- package/deps/rocksdb/rocksdb.gyp +2 -1
- package/package.json +1 -1
- package/prebuilds/darwin-arm64/node.napi.node +0 -0
- package/prebuilds/linux-x64/node.napi.node +0 -0
- package/deps/rocksdb/rocksdb/cache/fast_lru_cache.cc +0 -580
- 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,
|
|
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,
|
|
4810
|
-
file_size,
|
|
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()
|
|
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
|
-
|
|
294
|
-
Slice(static_cast<char*>(dump_unit.value), dump_unit.value_len)
|
|
295
|
-
|
|
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) {
|
package/deps/rocksdb/rocksdb.gyp
CHANGED
|
@@ -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
|
Binary file
|
|
Binary file
|