@nxtedition/rocksdb 7.0.12 → 7.0.13
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 +1 -0
- package/deps/rocksdb/rocksdb/Makefile +3 -0
- package/deps/rocksdb/rocksdb/TARGETS +6 -0
- package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +12 -7
- package/deps/rocksdb/rocksdb/cache/cache_key.h +2 -0
- package/deps/rocksdb/rocksdb/cache/fast_lru_cache.cc +18 -6
- package/deps/rocksdb/rocksdb/cache/fast_lru_cache.h +13 -5
- package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +89 -0
- package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.cc +18 -28
- package/deps/rocksdb/rocksdb/db/blob/blob_source.cc +147 -2
- package/deps/rocksdb/rocksdb/db/blob/blob_source.h +30 -0
- package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +403 -30
- package/deps/rocksdb/rocksdb/db/c.cc +159 -5
- package/deps/rocksdb/rocksdb/db/c_test.c +108 -0
- package/deps/rocksdb/rocksdb/db/column_family.cc +2 -1
- package/deps/rocksdb/rocksdb/db/column_family.h +7 -5
- package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +22 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction.h +8 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +6 -3
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +15 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +35 -2
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +55 -0
- package/deps/rocksdb/rocksdb/db/db_basic_test.cc +21 -19
- package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +60 -1
- package/deps/rocksdb/rocksdb/db/db_flush_test.cc +247 -6
- package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.h +10 -0
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +6 -33
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +10 -2
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +7 -15
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +17 -3
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +10 -4
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.h +9 -0
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.h +8 -0
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +32 -0
- package/deps/rocksdb/rocksdb/db/db_inplace_update_test.cc +54 -0
- package/deps/rocksdb/rocksdb/db/db_iter.cc +50 -2
- package/deps/rocksdb/rocksdb/db/db_iter.h +2 -0
- package/deps/rocksdb/rocksdb/db/db_kv_checksum_test.cc +56 -25
- package/deps/rocksdb/rocksdb/db/db_options_test.cc +1 -1
- package/deps/rocksdb/rocksdb/db/db_test.cc +9 -0
- package/deps/rocksdb/rocksdb/db/flush_job.cc +17 -8
- package/deps/rocksdb/rocksdb/db/flush_job.h +1 -1
- package/deps/rocksdb/rocksdb/db/log_writer.h +1 -1
- package/deps/rocksdb/rocksdb/db/memtable.cc +103 -93
- package/deps/rocksdb/rocksdb/db/memtable.h +3 -3
- package/deps/rocksdb/rocksdb/db/merge_helper.cc +7 -2
- package/deps/rocksdb/rocksdb/db/version_edit.h +1 -1
- package/deps/rocksdb/rocksdb/db/version_set.cc +13 -5
- package/deps/rocksdb/rocksdb/db/version_set_sync_and_async.h +5 -0
- package/deps/rocksdb/rocksdb/db/wide/db_wide_basic_test.cc +213 -0
- package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.cc +6 -7
- package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization_test.cc +16 -0
- package/deps/rocksdb/rocksdb/db/write_batch.cc +154 -2
- package/deps/rocksdb/rocksdb/db/write_batch_internal.h +3 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +4 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_compaction_filter.h +8 -3
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +21 -1
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +31 -4
- package/deps/rocksdb/rocksdb/env/env_test.cc +2 -2
- package/deps/rocksdb/rocksdb/env/fs_remap.cc +4 -0
- package/deps/rocksdb/rocksdb/file/random_access_file_reader.h +1 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +17 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/c.h +136 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/db.h +6 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/env.h +1 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +1 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/options.h +23 -23
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/stackable_db.h +7 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/write_batch_with_index.h +11 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/write_batch.h +14 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/write_batch_base.h +5 -0
- package/deps/rocksdb/rocksdb/options/cf_options.cc +7 -0
- package/deps/rocksdb/rocksdb/options/cf_options.h +19 -0
- package/deps/rocksdb/rocksdb/options/db_options.cc +1 -6
- package/deps/rocksdb/rocksdb/options/db_options.h +0 -1
- package/deps/rocksdb/rocksdb/options/options.cc +4 -1
- package/deps/rocksdb/rocksdb/options/options_helper.cc +2 -0
- package/deps/rocksdb/rocksdb/options/options_settable_test.cc +1 -0
- package/deps/rocksdb/rocksdb/options/options_test.cc +4 -4
- package/deps/rocksdb/rocksdb/port/win/env_win.cc +1 -1
- package/deps/rocksdb/rocksdb/src.mk +1 -0
- package/deps/rocksdb/rocksdb/table/block_based/block.cc +5 -3
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +2 -2
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +16 -9
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +4 -2
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +1 -1
- package/deps/rocksdb/rocksdb/table/block_based/filter_block.h +13 -7
- package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.cc +7 -3
- package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.h +4 -2
- package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.cc +28 -17
- package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.h +15 -9
- package/deps/rocksdb/rocksdb/table/block_based/full_filter_block_test.cc +32 -16
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +28 -18
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.h +15 -6
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +16 -7
- package/deps/rocksdb/rocksdb/table/block_fetcher.cc +1 -1
- package/deps/rocksdb/rocksdb/table/get_context.cc +27 -6
- package/deps/rocksdb/rocksdb/table/get_context.h +2 -0
- package/deps/rocksdb/rocksdb/table/table_test.cc +5 -5
- package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +46 -0
- package/deps/rocksdb/rocksdb/util/filter_bench.cc +3 -1
- package/deps/rocksdb/rocksdb/util/mutexlock.h +1 -1
- package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +1 -1
- package/package.json +1 -1
- package/prebuilds/linux-x64/node.napi.node +0 -0
|
@@ -124,13 +124,16 @@ FullFilterBlockReader::FullFilterBlockReader(
|
|
|
124
124
|
: FilterBlockReaderCommon(t, std::move(filter_block)) {
|
|
125
125
|
}
|
|
126
126
|
|
|
127
|
-
bool FullFilterBlockReader::KeyMayMatch(
|
|
128
|
-
|
|
129
|
-
|
|
127
|
+
bool FullFilterBlockReader::KeyMayMatch(const Slice& key, const bool no_io,
|
|
128
|
+
const Slice* const /*const_ikey_ptr*/,
|
|
129
|
+
GetContext* get_context,
|
|
130
|
+
BlockCacheLookupContext* lookup_context,
|
|
131
|
+
Env::IOPriority rate_limiter_priority) {
|
|
130
132
|
if (!whole_key_filtering()) {
|
|
131
133
|
return true;
|
|
132
134
|
}
|
|
133
|
-
return MayMatch(key, no_io, get_context, lookup_context
|
|
135
|
+
return MayMatch(key, no_io, get_context, lookup_context,
|
|
136
|
+
rate_limiter_priority);
|
|
134
137
|
}
|
|
135
138
|
|
|
136
139
|
std::unique_ptr<FilterBlockReader> FullFilterBlockReader::Create(
|
|
@@ -163,17 +166,21 @@ std::unique_ptr<FilterBlockReader> FullFilterBlockReader::Create(
|
|
|
163
166
|
bool FullFilterBlockReader::PrefixMayMatch(
|
|
164
167
|
const Slice& prefix, const bool no_io,
|
|
165
168
|
const Slice* const /*const_ikey_ptr*/, GetContext* get_context,
|
|
166
|
-
BlockCacheLookupContext* lookup_context
|
|
167
|
-
|
|
169
|
+
BlockCacheLookupContext* lookup_context,
|
|
170
|
+
Env::IOPriority rate_limiter_priority) {
|
|
171
|
+
return MayMatch(prefix, no_io, get_context, lookup_context,
|
|
172
|
+
rate_limiter_priority);
|
|
168
173
|
}
|
|
169
174
|
|
|
170
175
|
bool FullFilterBlockReader::MayMatch(
|
|
171
176
|
const Slice& entry, bool no_io, GetContext* get_context,
|
|
172
|
-
BlockCacheLookupContext* lookup_context
|
|
177
|
+
BlockCacheLookupContext* lookup_context,
|
|
178
|
+
Env::IOPriority rate_limiter_priority) const {
|
|
173
179
|
CachableEntry<ParsedFullFilterBlock> filter_block;
|
|
174
180
|
|
|
175
|
-
const Status s =
|
|
176
|
-
|
|
181
|
+
const Status s =
|
|
182
|
+
GetOrReadFilterBlock(no_io, get_context, lookup_context, &filter_block,
|
|
183
|
+
BlockType::kFilter, rate_limiter_priority);
|
|
177
184
|
if (!s.ok()) {
|
|
178
185
|
IGNORE_STATUS_IF_ERROR(s);
|
|
179
186
|
return true;
|
|
@@ -198,29 +205,33 @@ bool FullFilterBlockReader::MayMatch(
|
|
|
198
205
|
|
|
199
206
|
void FullFilterBlockReader::KeysMayMatch(
|
|
200
207
|
MultiGetRange* range, const bool no_io,
|
|
201
|
-
BlockCacheLookupContext* lookup_context
|
|
208
|
+
BlockCacheLookupContext* lookup_context,
|
|
209
|
+
Env::IOPriority rate_limiter_priority) {
|
|
202
210
|
if (!whole_key_filtering()) {
|
|
203
211
|
// Simply return. Don't skip any key - consider all keys as likely to be
|
|
204
212
|
// present
|
|
205
213
|
return;
|
|
206
214
|
}
|
|
207
|
-
MayMatch(range, no_io, nullptr, lookup_context);
|
|
215
|
+
MayMatch(range, no_io, nullptr, lookup_context, rate_limiter_priority);
|
|
208
216
|
}
|
|
209
217
|
|
|
210
218
|
void FullFilterBlockReader::PrefixesMayMatch(
|
|
211
219
|
MultiGetRange* range, const SliceTransform* prefix_extractor,
|
|
212
|
-
const bool no_io, BlockCacheLookupContext* lookup_context
|
|
213
|
-
|
|
220
|
+
const bool no_io, BlockCacheLookupContext* lookup_context,
|
|
221
|
+
Env::IOPriority rate_limiter_priority) {
|
|
222
|
+
MayMatch(range, no_io, prefix_extractor, lookup_context,
|
|
223
|
+
rate_limiter_priority);
|
|
214
224
|
}
|
|
215
225
|
|
|
216
226
|
void FullFilterBlockReader::MayMatch(
|
|
217
227
|
MultiGetRange* range, bool no_io, const SliceTransform* prefix_extractor,
|
|
218
|
-
BlockCacheLookupContext* lookup_context
|
|
228
|
+
BlockCacheLookupContext* lookup_context,
|
|
229
|
+
Env::IOPriority rate_limiter_priority) const {
|
|
219
230
|
CachableEntry<ParsedFullFilterBlock> filter_block;
|
|
220
231
|
|
|
221
|
-
const Status s =
|
|
222
|
-
|
|
223
|
-
|
|
232
|
+
const Status s = GetOrReadFilterBlock(
|
|
233
|
+
no_io, range->begin()->get_context, lookup_context, &filter_block,
|
|
234
|
+
BlockType::kFilter, rate_limiter_priority);
|
|
224
235
|
if (!s.ok()) {
|
|
225
236
|
IGNORE_STATUS_IF_ERROR(s);
|
|
226
237
|
return;
|
|
@@ -107,34 +107,40 @@ class FullFilterBlockReader
|
|
|
107
107
|
|
|
108
108
|
bool KeyMayMatch(const Slice& key, const bool no_io,
|
|
109
109
|
const Slice* const const_ikey_ptr, GetContext* get_context,
|
|
110
|
-
BlockCacheLookupContext* lookup_context
|
|
110
|
+
BlockCacheLookupContext* lookup_context,
|
|
111
|
+
Env::IOPriority rate_limiter_priority) override;
|
|
111
112
|
|
|
112
113
|
bool PrefixMayMatch(const Slice& prefix, const bool no_io,
|
|
113
114
|
const Slice* const const_ikey_ptr,
|
|
114
115
|
GetContext* get_context,
|
|
115
|
-
BlockCacheLookupContext* lookup_context
|
|
116
|
+
BlockCacheLookupContext* lookup_context,
|
|
117
|
+
Env::IOPriority rate_limiter_priority) override;
|
|
116
118
|
|
|
117
119
|
void KeysMayMatch(MultiGetRange* range, const bool no_io,
|
|
118
|
-
BlockCacheLookupContext* lookup_context
|
|
120
|
+
BlockCacheLookupContext* lookup_context,
|
|
121
|
+
Env::IOPriority rate_limiter_priority) override;
|
|
119
122
|
// Used in partitioned filter code
|
|
120
123
|
void KeysMayMatch2(MultiGetRange* range,
|
|
121
124
|
const SliceTransform* /*prefix_extractor*/,
|
|
122
|
-
const bool no_io,
|
|
123
|
-
|
|
124
|
-
KeysMayMatch(range, no_io, lookup_context);
|
|
125
|
+
const bool no_io, BlockCacheLookupContext* lookup_context,
|
|
126
|
+
Env::IOPriority rate_limiter_priority) {
|
|
127
|
+
KeysMayMatch(range, no_io, lookup_context, rate_limiter_priority);
|
|
125
128
|
}
|
|
126
129
|
|
|
127
130
|
void PrefixesMayMatch(MultiGetRange* range,
|
|
128
131
|
const SliceTransform* prefix_extractor,
|
|
129
132
|
const bool no_io,
|
|
130
|
-
BlockCacheLookupContext* lookup_context
|
|
133
|
+
BlockCacheLookupContext* lookup_context,
|
|
134
|
+
Env::IOPriority rate_limiter_priority) override;
|
|
131
135
|
size_t ApproximateMemoryUsage() const override;
|
|
132
136
|
private:
|
|
133
137
|
bool MayMatch(const Slice& entry, bool no_io, GetContext* get_context,
|
|
134
|
-
BlockCacheLookupContext* lookup_context
|
|
138
|
+
BlockCacheLookupContext* lookup_context,
|
|
139
|
+
Env::IOPriority rate_limiter_priority) const;
|
|
135
140
|
void MayMatch(MultiGetRange* range, bool no_io,
|
|
136
141
|
const SliceTransform* prefix_extractor,
|
|
137
|
-
BlockCacheLookupContext* lookup_context
|
|
142
|
+
BlockCacheLookupContext* lookup_context,
|
|
143
|
+
Env::IOPriority rate_limiter_priority) const;
|
|
138
144
|
};
|
|
139
145
|
|
|
140
146
|
} // namespace ROCKSDB_NAMESPACE
|
|
@@ -118,7 +118,7 @@ TEST_F(PluginFullFilterBlockTest, PluginEmptyBuilder) {
|
|
|
118
118
|
ASSERT_TRUE(reader.KeyMayMatch("foo",
|
|
119
119
|
/*no_io=*/false, /*const_ikey_ptr=*/nullptr,
|
|
120
120
|
/*get_context=*/nullptr,
|
|
121
|
-
/*lookup_context=*/nullptr));
|
|
121
|
+
/*lookup_context=*/nullptr, Env::IO_TOTAL));
|
|
122
122
|
}
|
|
123
123
|
|
|
124
124
|
TEST_F(PluginFullFilterBlockTest, PluginSingleChunk) {
|
|
@@ -136,34 +136,42 @@ TEST_F(PluginFullFilterBlockTest, PluginSingleChunk) {
|
|
|
136
136
|
nullptr /* cache */, nullptr /* cache_handle */, true /* own_value */);
|
|
137
137
|
|
|
138
138
|
FullFilterBlockReader reader(table_.get(), std::move(block));
|
|
139
|
+
Env::IOPriority rate_limiter_priority = Env::IO_TOTAL;
|
|
139
140
|
ASSERT_TRUE(reader.KeyMayMatch("foo",
|
|
140
141
|
/*no_io=*/false, /*const_ikey_ptr=*/nullptr,
|
|
141
142
|
/*get_context=*/nullptr,
|
|
142
|
-
/*lookup_context=*/nullptr
|
|
143
|
+
/*lookup_context=*/nullptr,
|
|
144
|
+
rate_limiter_priority));
|
|
143
145
|
ASSERT_TRUE(reader.KeyMayMatch("bar",
|
|
144
146
|
/*no_io=*/false, /*const_ikey_ptr=*/nullptr,
|
|
145
147
|
/*get_context=*/nullptr,
|
|
146
|
-
/*lookup_context=*/nullptr
|
|
148
|
+
/*lookup_context=*/nullptr,
|
|
149
|
+
rate_limiter_priority));
|
|
147
150
|
ASSERT_TRUE(reader.KeyMayMatch("box",
|
|
148
151
|
/*no_io=*/false, /*const_ikey_ptr=*/nullptr,
|
|
149
152
|
/*get_context=*/nullptr,
|
|
150
|
-
/*lookup_context=*/nullptr
|
|
153
|
+
/*lookup_context=*/nullptr,
|
|
154
|
+
rate_limiter_priority));
|
|
151
155
|
ASSERT_TRUE(reader.KeyMayMatch("hello",
|
|
152
156
|
/*no_io=*/false, /*const_ikey_ptr=*/nullptr,
|
|
153
157
|
/*get_context=*/nullptr,
|
|
154
|
-
/*lookup_context=*/nullptr
|
|
158
|
+
/*lookup_context=*/nullptr,
|
|
159
|
+
rate_limiter_priority));
|
|
155
160
|
ASSERT_TRUE(reader.KeyMayMatch("foo",
|
|
156
161
|
/*no_io=*/false, /*const_ikey_ptr=*/nullptr,
|
|
157
162
|
/*get_context=*/nullptr,
|
|
158
|
-
/*lookup_context=*/nullptr
|
|
163
|
+
/*lookup_context=*/nullptr,
|
|
164
|
+
rate_limiter_priority));
|
|
159
165
|
ASSERT_TRUE(!reader.KeyMayMatch("missing",
|
|
160
166
|
/*no_io=*/false, /*const_ikey_ptr=*/nullptr,
|
|
161
167
|
/*get_context=*/nullptr,
|
|
162
|
-
/*lookup_context=*/nullptr
|
|
168
|
+
/*lookup_context=*/nullptr,
|
|
169
|
+
rate_limiter_priority));
|
|
163
170
|
ASSERT_TRUE(!reader.KeyMayMatch("other",
|
|
164
171
|
/*no_io=*/false, /*const_ikey_ptr=*/nullptr,
|
|
165
172
|
/*get_context=*/nullptr,
|
|
166
|
-
/*lookup_context=*/nullptr
|
|
173
|
+
/*lookup_context=*/nullptr,
|
|
174
|
+
rate_limiter_priority));
|
|
167
175
|
}
|
|
168
176
|
|
|
169
177
|
class FullFilterBlockTest : public mock::MockBlockBasedTableTester,
|
|
@@ -188,7 +196,7 @@ TEST_F(FullFilterBlockTest, EmptyBuilder) {
|
|
|
188
196
|
ASSERT_TRUE(reader.KeyMayMatch("foo",
|
|
189
197
|
/*no_io=*/false, /*const_ikey_ptr=*/nullptr,
|
|
190
198
|
/*get_context=*/nullptr,
|
|
191
|
-
/*lookup_context=*/nullptr));
|
|
199
|
+
/*lookup_context=*/nullptr, Env::IO_TOTAL));
|
|
192
200
|
}
|
|
193
201
|
|
|
194
202
|
class CountUniqueFilterBitsBuilderWrapper : public FilterBitsBuilder {
|
|
@@ -285,34 +293,42 @@ TEST_F(FullFilterBlockTest, SingleChunk) {
|
|
|
285
293
|
nullptr /* cache */, nullptr /* cache_handle */, true /* own_value */);
|
|
286
294
|
|
|
287
295
|
FullFilterBlockReader reader(table_.get(), std::move(block));
|
|
296
|
+
Env::IOPriority rate_limiter_priority = Env::IO_TOTAL;
|
|
288
297
|
ASSERT_TRUE(reader.KeyMayMatch("foo",
|
|
289
298
|
/*no_io=*/false, /*const_ikey_ptr=*/nullptr,
|
|
290
299
|
/*get_context=*/nullptr,
|
|
291
|
-
/*lookup_context=*/nullptr
|
|
300
|
+
/*lookup_context=*/nullptr,
|
|
301
|
+
rate_limiter_priority));
|
|
292
302
|
ASSERT_TRUE(reader.KeyMayMatch("bar",
|
|
293
303
|
/*no_io=*/false, /*const_ikey_ptr=*/nullptr,
|
|
294
304
|
/*get_context=*/nullptr,
|
|
295
|
-
/*lookup_context=*/nullptr
|
|
305
|
+
/*lookup_context=*/nullptr,
|
|
306
|
+
rate_limiter_priority));
|
|
296
307
|
ASSERT_TRUE(reader.KeyMayMatch("box",
|
|
297
308
|
/*no_io=*/false, /*const_ikey_ptr=*/nullptr,
|
|
298
309
|
/*get_context=*/nullptr,
|
|
299
|
-
/*lookup_context=*/nullptr
|
|
310
|
+
/*lookup_context=*/nullptr,
|
|
311
|
+
rate_limiter_priority));
|
|
300
312
|
ASSERT_TRUE(reader.KeyMayMatch("hello",
|
|
301
313
|
/*no_io=*/false, /*const_ikey_ptr=*/nullptr,
|
|
302
314
|
/*get_context=*/nullptr,
|
|
303
|
-
/*lookup_context=*/nullptr
|
|
315
|
+
/*lookup_context=*/nullptr,
|
|
316
|
+
rate_limiter_priority));
|
|
304
317
|
ASSERT_TRUE(reader.KeyMayMatch("foo",
|
|
305
318
|
/*no_io=*/false, /*const_ikey_ptr=*/nullptr,
|
|
306
319
|
/*get_context=*/nullptr,
|
|
307
|
-
/*lookup_context=*/nullptr
|
|
320
|
+
/*lookup_context=*/nullptr,
|
|
321
|
+
rate_limiter_priority));
|
|
308
322
|
ASSERT_TRUE(!reader.KeyMayMatch("missing",
|
|
309
323
|
/*no_io=*/false, /*const_ikey_ptr=*/nullptr,
|
|
310
324
|
/*get_context=*/nullptr,
|
|
311
|
-
/*lookup_context=*/nullptr
|
|
325
|
+
/*lookup_context=*/nullptr,
|
|
326
|
+
rate_limiter_priority));
|
|
312
327
|
ASSERT_TRUE(!reader.KeyMayMatch("other",
|
|
313
328
|
/*no_io=*/false, /*const_ikey_ptr=*/nullptr,
|
|
314
329
|
/*get_context=*/nullptr,
|
|
315
|
-
/*lookup_context=*/nullptr
|
|
330
|
+
/*lookup_context=*/nullptr,
|
|
331
|
+
rate_limiter_priority));
|
|
316
332
|
}
|
|
317
333
|
|
|
318
334
|
} // namespace ROCKSDB_NAMESPACE
|
|
@@ -217,41 +217,46 @@ std::unique_ptr<FilterBlockReader> PartitionedFilterBlockReader::Create(
|
|
|
217
217
|
|
|
218
218
|
bool PartitionedFilterBlockReader::KeyMayMatch(
|
|
219
219
|
const Slice& key, const bool no_io, const Slice* const const_ikey_ptr,
|
|
220
|
-
GetContext* get_context, BlockCacheLookupContext* lookup_context
|
|
220
|
+
GetContext* get_context, BlockCacheLookupContext* lookup_context,
|
|
221
|
+
Env::IOPriority rate_limiter_priority) {
|
|
221
222
|
assert(const_ikey_ptr != nullptr);
|
|
222
223
|
if (!whole_key_filtering()) {
|
|
223
224
|
return true;
|
|
224
225
|
}
|
|
225
226
|
|
|
226
227
|
return MayMatch(key, no_io, const_ikey_ptr, get_context, lookup_context,
|
|
227
|
-
&FullFilterBlockReader::KeyMayMatch);
|
|
228
|
+
rate_limiter_priority, &FullFilterBlockReader::KeyMayMatch);
|
|
228
229
|
}
|
|
229
230
|
|
|
230
231
|
void PartitionedFilterBlockReader::KeysMayMatch(
|
|
231
232
|
MultiGetRange* range, const bool no_io,
|
|
232
|
-
BlockCacheLookupContext* lookup_context
|
|
233
|
+
BlockCacheLookupContext* lookup_context,
|
|
234
|
+
Env::IOPriority rate_limiter_priority) {
|
|
233
235
|
if (!whole_key_filtering()) {
|
|
234
236
|
return; // Any/all may match
|
|
235
237
|
}
|
|
236
238
|
|
|
237
|
-
MayMatch(range, nullptr, no_io, lookup_context,
|
|
239
|
+
MayMatch(range, nullptr, no_io, lookup_context, rate_limiter_priority,
|
|
238
240
|
&FullFilterBlockReader::KeysMayMatch2);
|
|
239
241
|
}
|
|
240
242
|
|
|
241
243
|
bool PartitionedFilterBlockReader::PrefixMayMatch(
|
|
242
244
|
const Slice& prefix, const bool no_io, const Slice* const const_ikey_ptr,
|
|
243
|
-
GetContext* get_context, BlockCacheLookupContext* lookup_context
|
|
245
|
+
GetContext* get_context, BlockCacheLookupContext* lookup_context,
|
|
246
|
+
Env::IOPriority rate_limiter_priority) {
|
|
244
247
|
assert(const_ikey_ptr != nullptr);
|
|
245
248
|
return MayMatch(prefix, no_io, const_ikey_ptr, get_context, lookup_context,
|
|
249
|
+
rate_limiter_priority,
|
|
246
250
|
&FullFilterBlockReader::PrefixMayMatch);
|
|
247
251
|
}
|
|
248
252
|
|
|
249
253
|
void PartitionedFilterBlockReader::PrefixesMayMatch(
|
|
250
254
|
MultiGetRange* range, const SliceTransform* prefix_extractor,
|
|
251
|
-
const bool no_io, BlockCacheLookupContext* lookup_context
|
|
255
|
+
const bool no_io, BlockCacheLookupContext* lookup_context,
|
|
256
|
+
Env::IOPriority rate_limiter_priority) {
|
|
252
257
|
assert(prefix_extractor);
|
|
253
258
|
MayMatch(range, prefix_extractor, no_io, lookup_context,
|
|
254
|
-
&FullFilterBlockReader::PrefixesMayMatch);
|
|
259
|
+
rate_limiter_priority, &FullFilterBlockReader::PrefixesMayMatch);
|
|
255
260
|
}
|
|
256
261
|
|
|
257
262
|
BlockHandle PartitionedFilterBlockReader::GetFilterPartitionHandle(
|
|
@@ -316,11 +321,12 @@ Status PartitionedFilterBlockReader::GetFilterPartitionBlock(
|
|
|
316
321
|
bool PartitionedFilterBlockReader::MayMatch(
|
|
317
322
|
const Slice& slice, bool no_io, const Slice* const_ikey_ptr,
|
|
318
323
|
GetContext* get_context, BlockCacheLookupContext* lookup_context,
|
|
324
|
+
Env::IOPriority rate_limiter_priority,
|
|
319
325
|
FilterFunction filter_function) const {
|
|
320
326
|
CachableEntry<Block> filter_block;
|
|
321
|
-
Status s =
|
|
322
|
-
|
|
323
|
-
|
|
327
|
+
Status s = GetOrReadFilterBlock(
|
|
328
|
+
no_io, get_context, lookup_context, &filter_block,
|
|
329
|
+
BlockType::kFilterPartitionIndex, rate_limiter_priority);
|
|
324
330
|
if (UNLIKELY(!s.ok())) {
|
|
325
331
|
IGNORE_STATUS_IF_ERROR(s);
|
|
326
332
|
return true;
|
|
@@ -347,17 +353,19 @@ bool PartitionedFilterBlockReader::MayMatch(
|
|
|
347
353
|
FullFilterBlockReader filter_partition(table(),
|
|
348
354
|
std::move(filter_partition_block));
|
|
349
355
|
return (filter_partition.*filter_function)(slice, no_io, const_ikey_ptr,
|
|
350
|
-
get_context, lookup_context
|
|
356
|
+
get_context, lookup_context,
|
|
357
|
+
rate_limiter_priority);
|
|
351
358
|
}
|
|
352
359
|
|
|
353
360
|
void PartitionedFilterBlockReader::MayMatch(
|
|
354
361
|
MultiGetRange* range, const SliceTransform* prefix_extractor, bool no_io,
|
|
355
362
|
BlockCacheLookupContext* lookup_context,
|
|
363
|
+
Env::IOPriority rate_limiter_priority,
|
|
356
364
|
FilterManyFunction filter_function) const {
|
|
357
365
|
CachableEntry<Block> filter_block;
|
|
358
|
-
Status s =
|
|
359
|
-
|
|
360
|
-
|
|
366
|
+
Status s = GetOrReadFilterBlock(
|
|
367
|
+
no_io, range->begin()->get_context, lookup_context, &filter_block,
|
|
368
|
+
BlockType::kFilterPartitionIndex, rate_limiter_priority);
|
|
361
369
|
if (UNLIKELY(!s.ok())) {
|
|
362
370
|
IGNORE_STATUS_IF_ERROR(s);
|
|
363
371
|
return; // Any/all may match
|
|
@@ -381,7 +389,7 @@ void PartitionedFilterBlockReader::MayMatch(
|
|
|
381
389
|
this_filter_handle != prev_filter_handle) {
|
|
382
390
|
MultiGetRange subrange(*range, start_iter_same_handle, iter);
|
|
383
391
|
MayMatchPartition(&subrange, prefix_extractor, prev_filter_handle, no_io,
|
|
384
|
-
lookup_context, filter_function);
|
|
392
|
+
lookup_context, rate_limiter_priority, filter_function);
|
|
385
393
|
range->AddSkipsFrom(subrange);
|
|
386
394
|
start_iter_same_handle = iter;
|
|
387
395
|
}
|
|
@@ -397,7 +405,7 @@ void PartitionedFilterBlockReader::MayMatch(
|
|
|
397
405
|
if (!prev_filter_handle.IsNull()) {
|
|
398
406
|
MultiGetRange subrange(*range, start_iter_same_handle, range->end());
|
|
399
407
|
MayMatchPartition(&subrange, prefix_extractor, prev_filter_handle, no_io,
|
|
400
|
-
lookup_context, filter_function);
|
|
408
|
+
lookup_context, rate_limiter_priority, filter_function);
|
|
401
409
|
range->AddSkipsFrom(subrange);
|
|
402
410
|
}
|
|
403
411
|
}
|
|
@@ -406,6 +414,7 @@ void PartitionedFilterBlockReader::MayMatchPartition(
|
|
|
406
414
|
MultiGetRange* range, const SliceTransform* prefix_extractor,
|
|
407
415
|
BlockHandle filter_handle, bool no_io,
|
|
408
416
|
BlockCacheLookupContext* lookup_context,
|
|
417
|
+
Env::IOPriority rate_limiter_priority,
|
|
409
418
|
FilterManyFunction filter_function) const {
|
|
410
419
|
CachableEntry<ParsedFullFilterBlock> filter_partition_block;
|
|
411
420
|
Status s = GetFilterPartitionBlock(
|
|
@@ -419,7 +428,7 @@ void PartitionedFilterBlockReader::MayMatchPartition(
|
|
|
419
428
|
FullFilterBlockReader filter_partition(table(),
|
|
420
429
|
std::move(filter_partition_block));
|
|
421
430
|
(filter_partition.*filter_function)(range, prefix_extractor, no_io,
|
|
422
|
-
lookup_context);
|
|
431
|
+
lookup_context, rate_limiter_priority);
|
|
423
432
|
}
|
|
424
433
|
|
|
425
434
|
size_t PartitionedFilterBlockReader::ApproximateMemoryUsage() const {
|
|
@@ -447,7 +456,8 @@ Status PartitionedFilterBlockReader::CacheDependencies(const ReadOptions& ro,
|
|
|
447
456
|
|
|
448
457
|
Status s = GetOrReadFilterBlock(false /* no_io */, nullptr /* get_context */,
|
|
449
458
|
&lookup_context, &filter_block,
|
|
450
|
-
BlockType::kFilterPartitionIndex
|
|
459
|
+
BlockType::kFilterPartitionIndex,
|
|
460
|
+
ro.rate_limiter_priority);
|
|
451
461
|
if (!s.ok()) {
|
|
452
462
|
ROCKS_LOG_ERROR(rep->ioptions.logger,
|
|
453
463
|
"Error retrieving top-level filter block while trying to "
|
|
@@ -111,18 +111,22 @@ class PartitionedFilterBlockReader : public FilterBlockReaderCommon<Block> {
|
|
|
111
111
|
|
|
112
112
|
bool KeyMayMatch(const Slice& key, const bool no_io,
|
|
113
113
|
const Slice* const const_ikey_ptr, GetContext* get_context,
|
|
114
|
-
BlockCacheLookupContext* lookup_context
|
|
114
|
+
BlockCacheLookupContext* lookup_context,
|
|
115
|
+
Env::IOPriority rate_limiter_priority) override;
|
|
115
116
|
void KeysMayMatch(MultiGetRange* range, const bool no_io,
|
|
116
|
-
BlockCacheLookupContext* lookup_context
|
|
117
|
+
BlockCacheLookupContext* lookup_context,
|
|
118
|
+
Env::IOPriority rate_limiter_priority) override;
|
|
117
119
|
|
|
118
120
|
bool PrefixMayMatch(const Slice& prefix, const bool no_io,
|
|
119
121
|
const Slice* const const_ikey_ptr,
|
|
120
122
|
GetContext* get_context,
|
|
121
|
-
BlockCacheLookupContext* lookup_context
|
|
123
|
+
BlockCacheLookupContext* lookup_context,
|
|
124
|
+
Env::IOPriority rate_limiter_priority) override;
|
|
122
125
|
void PrefixesMayMatch(MultiGetRange* range,
|
|
123
126
|
const SliceTransform* prefix_extractor,
|
|
124
127
|
const bool no_io,
|
|
125
|
-
BlockCacheLookupContext* lookup_context
|
|
128
|
+
BlockCacheLookupContext* lookup_context,
|
|
129
|
+
Env::IOPriority rate_limiter_priority) override;
|
|
126
130
|
|
|
127
131
|
size_t ApproximateMemoryUsage() const override;
|
|
128
132
|
|
|
@@ -137,21 +141,26 @@ class PartitionedFilterBlockReader : public FilterBlockReaderCommon<Block> {
|
|
|
137
141
|
|
|
138
142
|
using FilterFunction = bool (FullFilterBlockReader::*)(
|
|
139
143
|
const Slice& slice, const bool no_io, const Slice* const const_ikey_ptr,
|
|
140
|
-
GetContext* get_context, BlockCacheLookupContext* lookup_context
|
|
144
|
+
GetContext* get_context, BlockCacheLookupContext* lookup_context,
|
|
145
|
+
Env::IOPriority rate_limiter_priority);
|
|
141
146
|
bool MayMatch(const Slice& slice, bool no_io, const Slice* const_ikey_ptr,
|
|
142
147
|
GetContext* get_context,
|
|
143
148
|
BlockCacheLookupContext* lookup_context,
|
|
149
|
+
Env::IOPriority rate_limiter_priority,
|
|
144
150
|
FilterFunction filter_function) const;
|
|
145
151
|
using FilterManyFunction = void (FullFilterBlockReader::*)(
|
|
146
152
|
MultiGetRange* range, const SliceTransform* prefix_extractor,
|
|
147
|
-
const bool no_io, BlockCacheLookupContext* lookup_context
|
|
153
|
+
const bool no_io, BlockCacheLookupContext* lookup_context,
|
|
154
|
+
Env::IOPriority rate_limiter_priority);
|
|
148
155
|
void MayMatch(MultiGetRange* range, const SliceTransform* prefix_extractor,
|
|
149
156
|
bool no_io, BlockCacheLookupContext* lookup_context,
|
|
157
|
+
Env::IOPriority rate_limiter_priority,
|
|
150
158
|
FilterManyFunction filter_function) const;
|
|
151
159
|
void MayMatchPartition(MultiGetRange* range,
|
|
152
160
|
const SliceTransform* prefix_extractor,
|
|
153
161
|
BlockHandle filter_handle, bool no_io,
|
|
154
162
|
BlockCacheLookupContext* lookup_context,
|
|
163
|
+
Env::IOPriority rate_limiter_priority,
|
|
155
164
|
FilterManyFunction filter_function) const;
|
|
156
165
|
Status CacheDependencies(const ReadOptions& ro, bool pin) override;
|
|
157
166
|
|
|
@@ -164,6 +164,7 @@ class PartitionedFilterBlockTest
|
|
|
164
164
|
PartitionedIndexBuilder* pib, bool empty = false) {
|
|
165
165
|
std::unique_ptr<PartitionedFilterBlockReader> reader(
|
|
166
166
|
NewReader(builder, pib));
|
|
167
|
+
Env::IOPriority rate_limiter_priority = Env::IO_TOTAL;
|
|
167
168
|
// Querying added keys
|
|
168
169
|
const bool no_io = true;
|
|
169
170
|
for (auto key : keys) {
|
|
@@ -171,7 +172,8 @@ class PartitionedFilterBlockTest
|
|
|
171
172
|
const Slice ikey_slice = Slice(*ikey.rep());
|
|
172
173
|
ASSERT_TRUE(reader->KeyMayMatch(key, !no_io, &ikey_slice,
|
|
173
174
|
/*get_context=*/nullptr,
|
|
174
|
-
/*lookup_context=*/nullptr
|
|
175
|
+
/*lookup_context=*/nullptr,
|
|
176
|
+
rate_limiter_priority));
|
|
175
177
|
}
|
|
176
178
|
{
|
|
177
179
|
// querying a key twice
|
|
@@ -179,7 +181,8 @@ class PartitionedFilterBlockTest
|
|
|
179
181
|
const Slice ikey_slice = Slice(*ikey.rep());
|
|
180
182
|
ASSERT_TRUE(reader->KeyMayMatch(keys[0], !no_io, &ikey_slice,
|
|
181
183
|
/*get_context=*/nullptr,
|
|
182
|
-
/*lookup_context=*/nullptr
|
|
184
|
+
/*lookup_context=*/nullptr,
|
|
185
|
+
rate_limiter_priority));
|
|
183
186
|
}
|
|
184
187
|
// querying missing keys
|
|
185
188
|
for (auto key : missing_keys) {
|
|
@@ -188,12 +191,14 @@ class PartitionedFilterBlockTest
|
|
|
188
191
|
if (empty) {
|
|
189
192
|
ASSERT_TRUE(reader->KeyMayMatch(key, !no_io, &ikey_slice,
|
|
190
193
|
/*get_context=*/nullptr,
|
|
191
|
-
/*lookup_context=*/nullptr
|
|
194
|
+
/*lookup_context=*/nullptr,
|
|
195
|
+
rate_limiter_priority));
|
|
192
196
|
} else {
|
|
193
197
|
// assuming a good hash function
|
|
194
198
|
ASSERT_FALSE(reader->KeyMayMatch(key, !no_io, &ikey_slice,
|
|
195
199
|
/*get_context=*/nullptr,
|
|
196
|
-
/*lookup_context=*/nullptr
|
|
200
|
+
/*lookup_context=*/nullptr,
|
|
201
|
+
rate_limiter_priority));
|
|
197
202
|
}
|
|
198
203
|
}
|
|
199
204
|
}
|
|
@@ -345,7 +350,8 @@ TEST_P(PartitionedFilterBlockTest, SamePrefixInMultipleBlocks) {
|
|
|
345
350
|
ASSERT_TRUE(reader->PrefixMayMatch(prefix_extractor->Transform(key),
|
|
346
351
|
/*no_io=*/false, &ikey_slice,
|
|
347
352
|
/*get_context=*/nullptr,
|
|
348
|
-
/*lookup_context=*/nullptr
|
|
353
|
+
/*lookup_context=*/nullptr,
|
|
354
|
+
Env::IO_TOTAL));
|
|
349
355
|
}
|
|
350
356
|
// Non-existent keys but with the same prefix
|
|
351
357
|
const std::string pnonkeys[4] = {"p-key9", "p-key11", "p-key21", "p-key31"};
|
|
@@ -355,7 +361,8 @@ TEST_P(PartitionedFilterBlockTest, SamePrefixInMultipleBlocks) {
|
|
|
355
361
|
ASSERT_TRUE(reader->PrefixMayMatch(prefix_extractor->Transform(key),
|
|
356
362
|
/*no_io=*/false, &ikey_slice,
|
|
357
363
|
/*get_context=*/nullptr,
|
|
358
|
-
/*lookup_context=*/nullptr
|
|
364
|
+
/*lookup_context=*/nullptr,
|
|
365
|
+
Env::IO_TOTAL));
|
|
359
366
|
}
|
|
360
367
|
}
|
|
361
368
|
|
|
@@ -386,6 +393,7 @@ TEST_P(PartitionedFilterBlockTest, PrefixInWrongPartitionBug) {
|
|
|
386
393
|
CutABlock(pib.get(), pkeys[4]);
|
|
387
394
|
std::unique_ptr<PartitionedFilterBlockReader> reader(
|
|
388
395
|
NewReader(builder.get(), pib.get()));
|
|
396
|
+
Env::IOPriority rate_limiter_priority = Env::IO_TOTAL;
|
|
389
397
|
for (auto key : pkeys) {
|
|
390
398
|
auto prefix = prefix_extractor->Transform(key);
|
|
391
399
|
auto ikey = InternalKey(prefix, 0, ValueType::kTypeValue);
|
|
@@ -393,7 +401,8 @@ TEST_P(PartitionedFilterBlockTest, PrefixInWrongPartitionBug) {
|
|
|
393
401
|
ASSERT_TRUE(reader->PrefixMayMatch(prefix,
|
|
394
402
|
/*no_io=*/false, &ikey_slice,
|
|
395
403
|
/*get_context=*/nullptr,
|
|
396
|
-
/*lookup_context=*/nullptr
|
|
404
|
+
/*lookup_context=*/nullptr,
|
|
405
|
+
rate_limiter_priority));
|
|
397
406
|
}
|
|
398
407
|
}
|
|
399
408
|
|
|
@@ -126,7 +126,7 @@ inline void BlockFetcher::PrepareBufferForBlockFromFile() {
|
|
|
126
126
|
// cache miss read from device
|
|
127
127
|
if ((do_uncompress_ || ioptions_.allow_mmap_reads) &&
|
|
128
128
|
block_size_with_trailer_ < kDefaultStackBufferSize) {
|
|
129
|
-
// If we've got a small enough
|
|
129
|
+
// If we've got a small enough chunk of data, read it in to the
|
|
130
130
|
// trivially allocated stack buffer instead of needing a full malloc()
|
|
131
131
|
//
|
|
132
132
|
// `GetBlockContents()` cannot return this data as its lifetime is tied to
|
|
@@ -241,7 +241,8 @@ bool GetContext::SaveValue(const ParsedInternalKey& parsed_key,
|
|
|
241
241
|
|
|
242
242
|
auto type = parsed_key.type;
|
|
243
243
|
// Key matches. Process it
|
|
244
|
-
if ((type == kTypeValue || type == kTypeMerge || type == kTypeBlobIndex
|
|
244
|
+
if ((type == kTypeValue || type == kTypeMerge || type == kTypeBlobIndex ||
|
|
245
|
+
type == kTypeWideColumnEntity) &&
|
|
245
246
|
max_covering_tombstone_seq_ != nullptr &&
|
|
246
247
|
*max_covering_tombstone_seq_ > parsed_key.sequence) {
|
|
247
248
|
type = kTypeRangeDeletion;
|
|
@@ -249,15 +250,24 @@ bool GetContext::SaveValue(const ParsedInternalKey& parsed_key,
|
|
|
249
250
|
switch (type) {
|
|
250
251
|
case kTypeValue:
|
|
251
252
|
case kTypeBlobIndex:
|
|
253
|
+
case kTypeWideColumnEntity:
|
|
252
254
|
assert(state_ == kNotFound || state_ == kMerge);
|
|
253
|
-
if (type == kTypeBlobIndex
|
|
254
|
-
|
|
255
|
-
|
|
255
|
+
if (type == kTypeBlobIndex) {
|
|
256
|
+
if (is_blob_index_ == nullptr) {
|
|
257
|
+
// Blob value not supported. Stop.
|
|
258
|
+
state_ = kUnexpectedBlobIndex;
|
|
259
|
+
return false;
|
|
260
|
+
}
|
|
261
|
+
} else if (type == kTypeWideColumnEntity) {
|
|
262
|
+
// TODO: support wide-column entities
|
|
263
|
+
state_ = kUnexpectedWideColumnEntity;
|
|
256
264
|
return false;
|
|
257
265
|
}
|
|
266
|
+
|
|
258
267
|
if (is_blob_index_ != nullptr) {
|
|
259
268
|
*is_blob_index_ = (type == kTypeBlobIndex);
|
|
260
269
|
}
|
|
270
|
+
|
|
261
271
|
if (kNotFound == state_) {
|
|
262
272
|
state_ = kFound;
|
|
263
273
|
if (do_merge_) {
|
|
@@ -276,20 +286,25 @@ bool GetContext::SaveValue(const ParsedInternalKey& parsed_key,
|
|
|
276
286
|
// It means this function is called as part of DB GetMergeOperands
|
|
277
287
|
// API and the current value should be part of
|
|
278
288
|
// merge_context_->operand_list
|
|
279
|
-
if (
|
|
289
|
+
if (type == kTypeBlobIndex) {
|
|
280
290
|
PinnableSlice pin_val;
|
|
281
291
|
if (GetBlobValue(value, &pin_val) == false) {
|
|
282
292
|
return false;
|
|
283
293
|
}
|
|
284
294
|
Slice blob_value(pin_val);
|
|
285
295
|
push_operand(blob_value, nullptr);
|
|
296
|
+
} else if (type == kTypeWideColumnEntity) {
|
|
297
|
+
// TODO: support wide-column entities
|
|
298
|
+
state_ = kUnexpectedWideColumnEntity;
|
|
299
|
+
return false;
|
|
286
300
|
} else {
|
|
301
|
+
assert(type == kTypeValue);
|
|
287
302
|
push_operand(value, value_pinner);
|
|
288
303
|
}
|
|
289
304
|
}
|
|
290
305
|
} else if (kMerge == state_) {
|
|
291
306
|
assert(merge_operator_ != nullptr);
|
|
292
|
-
if (
|
|
307
|
+
if (type == kTypeBlobIndex) {
|
|
293
308
|
PinnableSlice pin_val;
|
|
294
309
|
if (GetBlobValue(value, &pin_val) == false) {
|
|
295
310
|
return false;
|
|
@@ -304,7 +319,13 @@ bool GetContext::SaveValue(const ParsedInternalKey& parsed_key,
|
|
|
304
319
|
// merge_context_->operand_list
|
|
305
320
|
push_operand(blob_value, nullptr);
|
|
306
321
|
}
|
|
322
|
+
} else if (type == kTypeWideColumnEntity) {
|
|
323
|
+
// TODO: support wide-column entities
|
|
324
|
+
state_ = kUnexpectedWideColumnEntity;
|
|
325
|
+
return false;
|
|
307
326
|
} else {
|
|
327
|
+
assert(type == kTypeValue);
|
|
328
|
+
|
|
308
329
|
state_ = kFound;
|
|
309
330
|
if (do_merge_) {
|
|
310
331
|
Merge(&value);
|
|
@@ -74,6 +74,8 @@ class GetContext {
|
|
|
74
74
|
kCorrupt,
|
|
75
75
|
kMerge, // saver contains the current merge result (the operands)
|
|
76
76
|
kUnexpectedBlobIndex,
|
|
77
|
+
// TODO: remove once wide-column entities are supported by Get/MultiGet
|
|
78
|
+
kUnexpectedWideColumnEntity,
|
|
77
79
|
};
|
|
78
80
|
GetContextStats get_context_stats_;
|
|
79
81
|
|