@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.
Files changed (105) hide show
  1. package/deps/rocksdb/rocksdb/CMakeLists.txt +1 -0
  2. package/deps/rocksdb/rocksdb/Makefile +3 -0
  3. package/deps/rocksdb/rocksdb/TARGETS +6 -0
  4. package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +12 -7
  5. package/deps/rocksdb/rocksdb/cache/cache_key.h +2 -0
  6. package/deps/rocksdb/rocksdb/cache/fast_lru_cache.cc +18 -6
  7. package/deps/rocksdb/rocksdb/cache/fast_lru_cache.h +13 -5
  8. package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +89 -0
  9. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.cc +18 -28
  10. package/deps/rocksdb/rocksdb/db/blob/blob_source.cc +147 -2
  11. package/deps/rocksdb/rocksdb/db/blob/blob_source.h +30 -0
  12. package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +403 -30
  13. package/deps/rocksdb/rocksdb/db/c.cc +159 -5
  14. package/deps/rocksdb/rocksdb/db/c_test.c +108 -0
  15. package/deps/rocksdb/rocksdb/db/column_family.cc +2 -1
  16. package/deps/rocksdb/rocksdb/db/column_family.h +7 -5
  17. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +22 -0
  18. package/deps/rocksdb/rocksdb/db/compaction/compaction.h +8 -0
  19. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +6 -3
  20. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +15 -0
  21. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +35 -2
  22. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +55 -0
  23. package/deps/rocksdb/rocksdb/db/db_basic_test.cc +21 -19
  24. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +60 -1
  25. package/deps/rocksdb/rocksdb/db/db_flush_test.cc +247 -6
  26. package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.h +10 -0
  27. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +6 -33
  28. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +10 -2
  29. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +7 -15
  30. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +17 -3
  31. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +10 -4
  32. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.h +9 -0
  33. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.h +8 -0
  34. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +32 -0
  35. package/deps/rocksdb/rocksdb/db/db_inplace_update_test.cc +54 -0
  36. package/deps/rocksdb/rocksdb/db/db_iter.cc +50 -2
  37. package/deps/rocksdb/rocksdb/db/db_iter.h +2 -0
  38. package/deps/rocksdb/rocksdb/db/db_kv_checksum_test.cc +56 -25
  39. package/deps/rocksdb/rocksdb/db/db_options_test.cc +1 -1
  40. package/deps/rocksdb/rocksdb/db/db_test.cc +9 -0
  41. package/deps/rocksdb/rocksdb/db/flush_job.cc +17 -8
  42. package/deps/rocksdb/rocksdb/db/flush_job.h +1 -1
  43. package/deps/rocksdb/rocksdb/db/log_writer.h +1 -1
  44. package/deps/rocksdb/rocksdb/db/memtable.cc +103 -93
  45. package/deps/rocksdb/rocksdb/db/memtable.h +3 -3
  46. package/deps/rocksdb/rocksdb/db/merge_helper.cc +7 -2
  47. package/deps/rocksdb/rocksdb/db/version_edit.h +1 -1
  48. package/deps/rocksdb/rocksdb/db/version_set.cc +13 -5
  49. package/deps/rocksdb/rocksdb/db/version_set_sync_and_async.h +5 -0
  50. package/deps/rocksdb/rocksdb/db/wide/db_wide_basic_test.cc +213 -0
  51. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.cc +6 -7
  52. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization_test.cc +16 -0
  53. package/deps/rocksdb/rocksdb/db/write_batch.cc +154 -2
  54. package/deps/rocksdb/rocksdb/db/write_batch_internal.h +3 -0
  55. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +4 -0
  56. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_compaction_filter.h +8 -3
  57. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +21 -1
  58. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +31 -4
  59. package/deps/rocksdb/rocksdb/env/env_test.cc +2 -2
  60. package/deps/rocksdb/rocksdb/env/fs_remap.cc +4 -0
  61. package/deps/rocksdb/rocksdb/file/random_access_file_reader.h +1 -1
  62. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +17 -0
  63. package/deps/rocksdb/rocksdb/include/rocksdb/c.h +136 -0
  64. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +6 -0
  65. package/deps/rocksdb/rocksdb/include/rocksdb/env.h +1 -1
  66. package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +1 -1
  67. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +23 -23
  68. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/stackable_db.h +7 -0
  69. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/write_batch_with_index.h +11 -0
  70. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch.h +14 -0
  71. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch_base.h +5 -0
  72. package/deps/rocksdb/rocksdb/options/cf_options.cc +7 -0
  73. package/deps/rocksdb/rocksdb/options/cf_options.h +19 -0
  74. package/deps/rocksdb/rocksdb/options/db_options.cc +1 -6
  75. package/deps/rocksdb/rocksdb/options/db_options.h +0 -1
  76. package/deps/rocksdb/rocksdb/options/options.cc +4 -1
  77. package/deps/rocksdb/rocksdb/options/options_helper.cc +2 -0
  78. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +1 -0
  79. package/deps/rocksdb/rocksdb/options/options_test.cc +4 -4
  80. package/deps/rocksdb/rocksdb/port/win/env_win.cc +1 -1
  81. package/deps/rocksdb/rocksdb/src.mk +1 -0
  82. package/deps/rocksdb/rocksdb/table/block_based/block.cc +5 -3
  83. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +2 -2
  84. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +16 -9
  85. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +4 -2
  86. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +1 -1
  87. package/deps/rocksdb/rocksdb/table/block_based/filter_block.h +13 -7
  88. package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.cc +7 -3
  89. package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.h +4 -2
  90. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.cc +28 -17
  91. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.h +15 -9
  92. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block_test.cc +32 -16
  93. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +28 -18
  94. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.h +15 -6
  95. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +16 -7
  96. package/deps/rocksdb/rocksdb/table/block_fetcher.cc +1 -1
  97. package/deps/rocksdb/rocksdb/table/get_context.cc +27 -6
  98. package/deps/rocksdb/rocksdb/table/get_context.h +2 -0
  99. package/deps/rocksdb/rocksdb/table/table_test.cc +5 -5
  100. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +46 -0
  101. package/deps/rocksdb/rocksdb/util/filter_bench.cc +3 -1
  102. package/deps/rocksdb/rocksdb/util/mutexlock.h +1 -1
  103. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +1 -1
  104. package/package.json +1 -1
  105. 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
- const Slice& key, const bool no_io, const Slice* const /*const_ikey_ptr*/,
129
- GetContext* get_context, BlockCacheLookupContext* lookup_context) {
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
- return MayMatch(prefix, no_io, get_context, lookup_context);
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) const {
177
+ BlockCacheLookupContext* lookup_context,
178
+ Env::IOPriority rate_limiter_priority) const {
173
179
  CachableEntry<ParsedFullFilterBlock> filter_block;
174
180
 
175
- const Status s = GetOrReadFilterBlock(no_io, get_context, lookup_context,
176
- &filter_block, BlockType::kFilter);
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
- MayMatch(range, no_io, prefix_extractor, lookup_context);
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) const {
228
+ BlockCacheLookupContext* lookup_context,
229
+ Env::IOPriority rate_limiter_priority) const {
219
230
  CachableEntry<ParsedFullFilterBlock> filter_block;
220
231
 
221
- const Status s =
222
- GetOrReadFilterBlock(no_io, range->begin()->get_context, lookup_context,
223
- &filter_block, BlockType::kFilter);
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) override;
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) override;
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) override;
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
- BlockCacheLookupContext* lookup_context) {
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) override;
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) const;
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) const;
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
- GetOrReadFilterBlock(no_io, get_context, lookup_context, &filter_block,
323
- BlockType::kFilterPartitionIndex);
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
- GetOrReadFilterBlock(no_io, range->begin()->get_context, lookup_context,
360
- &filter_block, BlockType::kFilterPartitionIndex);
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) override;
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) override;
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) override;
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) override;
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 hunk of data, read it in to the
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 && is_blob_index_ == nullptr) {
254
- // Blob value not supported. Stop.
255
- state_ = kUnexpectedBlobIndex;
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 (is_blob_index_ != nullptr && *is_blob_index_) {
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 (is_blob_index_ != nullptr && *is_blob_index_) {
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