@nxtedition/rocksdb 7.1.14 → 7.1.16

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 (223) hide show
  1. package/binding.cc +1 -0
  2. package/deps/rocksdb/rocksdb/CMakeLists.txt +72 -18
  3. package/deps/rocksdb/rocksdb/Makefile +91 -11
  4. package/deps/rocksdb/rocksdb/TARGETS +8 -4
  5. package/deps/rocksdb/rocksdb/cache/cache.cc +5 -0
  6. package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +13 -8
  7. package/deps/rocksdb/rocksdb/cache/cache_entry_roles.cc +2 -0
  8. package/deps/rocksdb/rocksdb/cache/cache_test.cc +116 -57
  9. package/deps/rocksdb/rocksdb/cache/clock_cache.cc +958 -459
  10. package/deps/rocksdb/rocksdb/cache/clock_cache.h +407 -622
  11. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +104 -40
  12. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +23 -8
  13. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +350 -184
  14. package/deps/rocksdb/rocksdb/cache/fast_lru_cache.cc +12 -2
  15. package/deps/rocksdb/rocksdb/cache/fast_lru_cache.h +2 -0
  16. package/deps/rocksdb/rocksdb/cache/lru_cache.cc +130 -43
  17. package/deps/rocksdb/rocksdb/cache/lru_cache.h +24 -2
  18. package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +423 -98
  19. package/deps/rocksdb/rocksdb/cache/sharded_cache.cc +19 -2
  20. package/deps/rocksdb/rocksdb/cache/sharded_cache.h +10 -7
  21. package/deps/rocksdb/rocksdb/crash_test.mk +2 -2
  22. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +46 -26
  23. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.h +9 -3
  24. package/deps/rocksdb/rocksdb/db/blob/blob_contents.cc +90 -0
  25. package/deps/rocksdb/rocksdb/db/blob/blob_contents.h +56 -0
  26. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.cc +23 -10
  27. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.cc +64 -59
  28. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.h +11 -8
  29. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader_test.cc +92 -62
  30. package/deps/rocksdb/rocksdb/db/blob/blob_source.cc +159 -136
  31. package/deps/rocksdb/rocksdb/db/blob/blob_source.h +13 -13
  32. package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +129 -57
  33. package/deps/rocksdb/rocksdb/db/blob/db_blob_basic_test.cc +81 -3
  34. package/deps/rocksdb/rocksdb/db/c.cc +29 -0
  35. package/deps/rocksdb/rocksdb/db/column_family.cc +10 -1
  36. package/deps/rocksdb/rocksdb/db/column_family_test.cc +21 -0
  37. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +42 -36
  38. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +344 -102
  39. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +163 -28
  40. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +52 -17
  41. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +35 -30
  42. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +8 -3
  43. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +167 -11
  44. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +8 -8
  45. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_test.cc +10 -13
  46. package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.cc +0 -117
  47. package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.h +6 -49
  48. package/deps/rocksdb/rocksdb/db/db_basic_test.cc +29 -4
  49. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +18 -11
  50. package/deps/rocksdb/rocksdb/db/db_compaction_filter_test.cc +4 -10
  51. package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.cc +1 -1
  52. package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.h +12 -0
  53. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +144 -93
  54. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +28 -32
  55. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +1 -1
  56. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +5 -9
  57. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +2 -33
  58. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +3 -5
  59. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.h +11 -0
  60. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +1 -2
  61. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.h +8 -0
  62. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +2 -1
  63. package/deps/rocksdb/rocksdb/db/db_iter.cc +76 -138
  64. package/deps/rocksdb/rocksdb/db/db_iter.h +26 -23
  65. package/deps/rocksdb/rocksdb/db/db_properties_test.cc +1 -1
  66. package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +931 -0
  67. package/deps/rocksdb/rocksdb/db/db_sst_test.cc +2 -2
  68. package/deps/rocksdb/rocksdb/db/db_table_properties_test.cc +6 -0
  69. package/deps/rocksdb/rocksdb/db/db_test2.cc +44 -22
  70. package/deps/rocksdb/rocksdb/db/db_test_util.cc +6 -14
  71. package/deps/rocksdb/rocksdb/db/db_with_timestamp_compaction_test.cc +155 -0
  72. package/deps/rocksdb/rocksdb/db/db_write_test.cc +45 -0
  73. package/deps/rocksdb/rocksdb/db/dbformat.h +2 -1
  74. package/deps/rocksdb/rocksdb/db/error_handler_fs_test.cc +8 -0
  75. package/deps/rocksdb/rocksdb/db/experimental.cc +5 -1
  76. package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +24 -12
  77. package/deps/rocksdb/rocksdb/db/internal_stats.cc +7 -1
  78. package/deps/rocksdb/rocksdb/db/internal_stats.h +3 -0
  79. package/deps/rocksdb/rocksdb/db/memtable.cc +79 -18
  80. package/deps/rocksdb/rocksdb/db/memtable.h +5 -0
  81. package/deps/rocksdb/rocksdb/db/memtable_list.cc +26 -4
  82. package/deps/rocksdb/rocksdb/db/memtable_list.h +2 -1
  83. package/deps/rocksdb/rocksdb/db/periodic_task_scheduler.cc +113 -0
  84. package/deps/rocksdb/rocksdb/db/periodic_task_scheduler.h +110 -0
  85. package/deps/rocksdb/rocksdb/db/{periodic_work_scheduler_test.cc → periodic_task_scheduler_test.cc} +33 -39
  86. package/deps/rocksdb/rocksdb/db/range_del_aggregator.cc +12 -20
  87. package/deps/rocksdb/rocksdb/db/range_del_aggregator.h +6 -5
  88. package/deps/rocksdb/rocksdb/db/range_del_aggregator_test.cc +12 -8
  89. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.cc +20 -5
  90. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.h +14 -0
  91. package/deps/rocksdb/rocksdb/db/repair.cc +17 -8
  92. package/deps/rocksdb/rocksdb/db/repair_test.cc +2 -1
  93. package/deps/rocksdb/rocksdb/db/seqno_time_test.cc +49 -66
  94. package/deps/rocksdb/rocksdb/db/table_cache.cc +92 -63
  95. package/deps/rocksdb/rocksdb/db/table_cache.h +16 -9
  96. package/deps/rocksdb/rocksdb/db/table_cache_sync_and_async.h +2 -2
  97. package/deps/rocksdb/rocksdb/db/table_properties_collector.cc +2 -2
  98. package/deps/rocksdb/rocksdb/db/table_properties_collector.h +3 -3
  99. package/deps/rocksdb/rocksdb/db/table_properties_collector_test.cc +1 -1
  100. package/deps/rocksdb/rocksdb/db/version_builder.cc +1 -1
  101. package/deps/rocksdb/rocksdb/db/version_edit.h +1 -2
  102. package/deps/rocksdb/rocksdb/db/version_set.cc +379 -145
  103. package/deps/rocksdb/rocksdb/db/version_set.h +26 -24
  104. package/deps/rocksdb/rocksdb/db/version_set_test.cc +9 -9
  105. package/deps/rocksdb/rocksdb/db/version_util.h +3 -2
  106. package/deps/rocksdb/rocksdb/db/wide/db_wide_basic_test.cc +10 -2
  107. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.cc +2 -0
  108. package/deps/rocksdb/rocksdb/db_stress_tool/batched_ops_stress.cc +5 -8
  109. package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +5 -8
  110. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress.cc +2 -0
  111. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.cc +71 -0
  112. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +14 -0
  113. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +23 -0
  114. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +26 -1
  115. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +105 -34
  116. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +16 -8
  117. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +6 -0
  118. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +4 -8
  119. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.h +4 -8
  120. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +282 -25
  121. package/deps/rocksdb/rocksdb/env/fs_posix.cc +6 -4
  122. package/deps/rocksdb/rocksdb/env/io_posix.cc +3 -1
  123. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +367 -177
  124. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +144 -56
  125. package/deps/rocksdb/rocksdb/file/filename.cc +3 -3
  126. package/deps/rocksdb/rocksdb/file/filename.h +4 -2
  127. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +415 -0
  128. package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +2 -0
  129. package/deps/rocksdb/rocksdb/file/writable_file_writer.cc +36 -45
  130. package/deps/rocksdb/rocksdb/file/writable_file_writer.h +21 -3
  131. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +11 -11
  132. package/deps/rocksdb/rocksdb/include/rocksdb/c.h +15 -1
  133. package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +163 -68
  134. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +26 -12
  135. package/deps/rocksdb/rocksdb/include/rocksdb/iterator.h +23 -5
  136. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +21 -17
  137. package/deps/rocksdb/rocksdb/include/rocksdb/perf_context.h +17 -0
  138. package/deps/rocksdb/rocksdb/include/rocksdb/persistent_cache.h +3 -3
  139. package/deps/rocksdb/rocksdb/include/rocksdb/secondary_cache.h +17 -6
  140. package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +3 -0
  141. package/deps/rocksdb/rocksdb/include/rocksdb/table.h +20 -0
  142. package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +3 -3
  143. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/option_change_migration.h +4 -0
  144. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +1 -1
  145. package/deps/rocksdb/rocksdb/include/rocksdb/wide_columns.h +3 -0
  146. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch.h +2 -1
  147. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch_base.h +2 -1
  148. package/deps/rocksdb/rocksdb/logging/env_logger.h +2 -2
  149. package/deps/rocksdb/rocksdb/monitoring/histogram.cc +4 -2
  150. package/deps/rocksdb/rocksdb/monitoring/histogram.h +2 -0
  151. package/deps/rocksdb/rocksdb/monitoring/histogram_test.cc +15 -1
  152. package/deps/rocksdb/rocksdb/monitoring/instrumented_mutex.cc +17 -0
  153. package/deps/rocksdb/rocksdb/monitoring/instrumented_mutex.h +14 -3
  154. package/deps/rocksdb/rocksdb/monitoring/iostats_context_imp.h +3 -0
  155. package/deps/rocksdb/rocksdb/monitoring/perf_context.cc +50 -0
  156. package/deps/rocksdb/rocksdb/monitoring/statistics.cc +1 -0
  157. package/deps/rocksdb/rocksdb/monitoring/stats_history_test.cc +31 -32
  158. package/deps/rocksdb/rocksdb/options/customizable_test.cc +4 -1
  159. package/deps/rocksdb/rocksdb/options/options.cc +2 -2
  160. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +2 -1
  161. package/deps/rocksdb/rocksdb/port/jemalloc_helper.h +1 -0
  162. package/deps/rocksdb/rocksdb/src.mk +4 -2
  163. package/deps/rocksdb/rocksdb/table/block_based/block.h +9 -8
  164. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +110 -99
  165. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.h +12 -10
  166. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +11 -2
  167. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +138 -83
  168. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +25 -24
  169. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +31 -30
  170. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.cc +16 -13
  171. package/deps/rocksdb/rocksdb/table/block_based/cachable_entry.h +4 -4
  172. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +3 -3
  173. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +3 -3
  174. package/deps/rocksdb/rocksdb/table/block_fetcher.cc +17 -19
  175. package/deps/rocksdb/rocksdb/table/block_fetcher.h +1 -1
  176. package/deps/rocksdb/rocksdb/table/format.cc +26 -29
  177. package/deps/rocksdb/rocksdb/table/format.h +44 -26
  178. package/deps/rocksdb/rocksdb/table/get_context.cc +17 -12
  179. package/deps/rocksdb/rocksdb/table/internal_iterator.h +7 -0
  180. package/deps/rocksdb/rocksdb/table/iterator_wrapper.h +4 -0
  181. package/deps/rocksdb/rocksdb/table/merging_iterator.cc +950 -104
  182. package/deps/rocksdb/rocksdb/table/merging_iterator.h +28 -1
  183. package/deps/rocksdb/rocksdb/table/meta_blocks.cc +3 -2
  184. package/deps/rocksdb/rocksdb/table/meta_blocks.h +1 -1
  185. package/deps/rocksdb/rocksdb/table/persistent_cache_helper.cc +10 -9
  186. package/deps/rocksdb/rocksdb/table/persistent_cache_helper.h +22 -20
  187. package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.cc +1 -1
  188. package/deps/rocksdb/rocksdb/table/sst_file_writer_collectors.h +1 -1
  189. package/deps/rocksdb/rocksdb/table/table_builder.h +9 -21
  190. package/deps/rocksdb/rocksdb/table/table_test.cc +12 -12
  191. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_pysim_test.py +4 -4
  192. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_plot.py +1 -0
  193. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +116 -34
  194. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +6 -1
  195. package/deps/rocksdb/rocksdb/tools/trace_analyzer_tool.cc +1 -1
  196. package/deps/rocksdb/rocksdb/util/autovector.h +12 -0
  197. package/deps/rocksdb/rocksdb/util/rate_limiter_test.cc +3 -2
  198. package/deps/rocksdb/rocksdb/util/stderr_logger.cc +30 -0
  199. package/deps/rocksdb/rocksdb/util/stderr_logger.h +5 -18
  200. package/deps/rocksdb/rocksdb/util/timer.h +2 -3
  201. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +9 -2
  202. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.cc +1 -1
  203. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.cc +1 -1
  204. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.cc +34 -53
  205. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.h +9 -14
  206. package/deps/rocksdb/rocksdb/utilities/debug.cc +2 -4
  207. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +4 -0
  208. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +1 -1
  209. package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.cc +4 -3
  210. package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.h +3 -1
  211. package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration.cc +26 -8
  212. package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration_test.cc +114 -16
  213. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_test.cc +1 -1
  214. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_test.cc +59 -0
  215. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +3 -0
  216. package/deps/rocksdb/rocksdb/utilities/transactions/timestamped_snapshot_test.cc +39 -0
  217. package/deps/rocksdb/rocksdb.gyp +0 -1
  218. package/index.js +6 -10
  219. package/package.json +1 -1
  220. package/prebuilds/darwin-arm64/node.napi.node +0 -0
  221. package/prebuilds/linux-x64/node.napi.node +0 -0
  222. package/deps/rocksdb/rocksdb/db/periodic_work_scheduler.cc +0 -168
  223. package/deps/rocksdb/rocksdb/db/periodic_work_scheduler.h +0 -90
@@ -8,6 +8,7 @@
8
8
  #include <cassert>
9
9
  #include <string>
10
10
 
11
+ #include "db/blob/blob_contents.h"
11
12
  #include "db/blob/blob_log_format.h"
12
13
  #include "db/blob/blob_log_writer.h"
13
14
  #include "env/mock_env.h"
@@ -180,15 +181,17 @@ TEST_F(BlobFileReaderTest, CreateReaderAndGetBlob) {
180
181
  read_options.verify_checksums = false;
181
182
 
182
183
  constexpr FilePrefetchBuffer* prefetch_buffer = nullptr;
184
+ constexpr MemoryAllocator* allocator = nullptr;
183
185
 
184
186
  {
185
- PinnableSlice value;
187
+ std::unique_ptr<BlobContents> value;
186
188
  uint64_t bytes_read = 0;
187
189
 
188
190
  ASSERT_OK(reader->GetBlob(read_options, keys[0], blob_offsets[0],
189
191
  blob_sizes[0], kNoCompression, prefetch_buffer,
190
- &value, &bytes_read));
191
- ASSERT_EQ(value, blobs[0]);
192
+ allocator, &value, &bytes_read));
193
+ ASSERT_NE(value, nullptr);
194
+ ASSERT_EQ(value->data(), blobs[0]);
192
195
  ASSERT_EQ(bytes_read, blob_sizes[0]);
193
196
 
194
197
  // MultiGetBlob
@@ -196,22 +199,25 @@ TEST_F(BlobFileReaderTest, CreateReaderAndGetBlob) {
196
199
  size_t total_size = 0;
197
200
 
198
201
  std::array<Status, num_blobs> statuses_buf;
199
- std::array<PinnableSlice, num_blobs> value_buf;
200
202
  std::array<BlobReadRequest, num_blobs> requests_buf;
201
- autovector<BlobReadRequest*> blob_reqs;
203
+ autovector<std::pair<BlobReadRequest*, std::unique_ptr<BlobContents>>>
204
+ blob_reqs;
202
205
 
203
206
  for (size_t i = 0; i < num_blobs; ++i) {
204
207
  requests_buf[i] =
205
208
  BlobReadRequest(keys[i], blob_offsets[i], blob_sizes[i],
206
- kNoCompression, &value_buf[i], &statuses_buf[i]);
207
- blob_reqs.push_back(&requests_buf[i]);
209
+ kNoCompression, nullptr, &statuses_buf[i]);
210
+ blob_reqs.emplace_back(&requests_buf[i], std::unique_ptr<BlobContents>());
208
211
  }
209
212
 
210
- reader->MultiGetBlob(read_options, blob_reqs, &bytes_read);
213
+ reader->MultiGetBlob(read_options, allocator, blob_reqs, &bytes_read);
211
214
 
212
215
  for (size_t i = 0; i < num_blobs; ++i) {
216
+ const auto& result = blob_reqs[i].second;
217
+
213
218
  ASSERT_OK(statuses_buf[i]);
214
- ASSERT_EQ(value_buf[i], blobs[i]);
219
+ ASSERT_NE(result, nullptr);
220
+ ASSERT_EQ(result->data(), blobs[i]);
215
221
  total_size += blob_sizes[i];
216
222
  }
217
223
  ASSERT_EQ(bytes_read, total_size);
@@ -220,13 +226,14 @@ TEST_F(BlobFileReaderTest, CreateReaderAndGetBlob) {
220
226
  read_options.verify_checksums = true;
221
227
 
222
228
  {
223
- PinnableSlice value;
229
+ std::unique_ptr<BlobContents> value;
224
230
  uint64_t bytes_read = 0;
225
231
 
226
232
  ASSERT_OK(reader->GetBlob(read_options, keys[1], blob_offsets[1],
227
233
  blob_sizes[1], kNoCompression, prefetch_buffer,
228
- &value, &bytes_read));
229
- ASSERT_EQ(value, blobs[1]);
234
+ allocator, &value, &bytes_read));
235
+ ASSERT_NE(value, nullptr);
236
+ ASSERT_EQ(value->data(), blobs[1]);
230
237
 
231
238
  const uint64_t key_size = keys[1].size();
232
239
  ASSERT_EQ(bytes_read,
@@ -236,47 +243,50 @@ TEST_F(BlobFileReaderTest, CreateReaderAndGetBlob) {
236
243
 
237
244
  // Invalid offset (too close to start of file)
238
245
  {
239
- PinnableSlice value;
246
+ std::unique_ptr<BlobContents> value;
240
247
  uint64_t bytes_read = 0;
241
248
 
242
249
  ASSERT_TRUE(reader
243
250
  ->GetBlob(read_options, keys[0], blob_offsets[0] - 1,
244
251
  blob_sizes[0], kNoCompression, prefetch_buffer,
245
- &value, &bytes_read)
252
+ allocator, &value, &bytes_read)
246
253
  .IsCorruption());
254
+ ASSERT_EQ(value, nullptr);
247
255
  ASSERT_EQ(bytes_read, 0);
248
256
  }
249
257
 
250
258
  // Invalid offset (too close to end of file)
251
259
  {
252
- PinnableSlice value;
260
+ std::unique_ptr<BlobContents> value;
253
261
  uint64_t bytes_read = 0;
254
262
 
255
263
  ASSERT_TRUE(reader
256
264
  ->GetBlob(read_options, keys[2], blob_offsets[2] + 1,
257
265
  blob_sizes[2], kNoCompression, prefetch_buffer,
258
- &value, &bytes_read)
266
+ allocator, &value, &bytes_read)
259
267
  .IsCorruption());
268
+ ASSERT_EQ(value, nullptr);
260
269
  ASSERT_EQ(bytes_read, 0);
261
270
  }
262
271
 
263
272
  // Incorrect compression type
264
273
  {
265
- PinnableSlice value;
274
+ std::unique_ptr<BlobContents> value;
266
275
  uint64_t bytes_read = 0;
267
276
 
268
277
  ASSERT_TRUE(reader
269
278
  ->GetBlob(read_options, keys[0], blob_offsets[0],
270
- blob_sizes[0], kZSTD, prefetch_buffer, &value,
271
- &bytes_read)
279
+ blob_sizes[0], kZSTD, prefetch_buffer, allocator,
280
+ &value, &bytes_read)
272
281
  .IsCorruption());
282
+ ASSERT_EQ(value, nullptr);
273
283
  ASSERT_EQ(bytes_read, 0);
274
284
  }
275
285
 
276
286
  // Incorrect key size
277
287
  {
278
288
  constexpr char shorter_key[] = "k";
279
- PinnableSlice value;
289
+ std::unique_ptr<BlobContents> value;
280
290
  uint64_t bytes_read = 0;
281
291
 
282
292
  ASSERT_TRUE(reader
@@ -284,8 +294,9 @@ TEST_F(BlobFileReaderTest, CreateReaderAndGetBlob) {
284
294
  blob_offsets[0] -
285
295
  (keys[0].size() - sizeof(shorter_key) + 1),
286
296
  blob_sizes[0], kNoCompression, prefetch_buffer,
287
- &value, &bytes_read)
297
+ allocator, &value, &bytes_read)
288
298
  .IsCorruption());
299
+ ASSERT_EQ(value, nullptr);
289
300
  ASSERT_EQ(bytes_read, 0);
290
301
 
291
302
  // MultiGetBlob
@@ -302,18 +313,18 @@ TEST_F(BlobFileReaderTest, CreateReaderAndGetBlob) {
302
313
  blob_offsets[2]};
303
314
 
304
315
  std::array<Status, num_blobs> statuses_buf;
305
- std::array<PinnableSlice, num_blobs> value_buf;
306
316
  std::array<BlobReadRequest, num_blobs> requests_buf;
307
- autovector<BlobReadRequest*> blob_reqs;
317
+ autovector<std::pair<BlobReadRequest*, std::unique_ptr<BlobContents>>>
318
+ blob_reqs;
308
319
 
309
320
  for (size_t i = 0; i < num_blobs; ++i) {
310
321
  requests_buf[i] =
311
322
  BlobReadRequest(key_refs[i], offsets[i], blob_sizes[i],
312
- kNoCompression, &value_buf[i], &statuses_buf[i]);
313
- blob_reqs.push_back(&requests_buf[i]);
323
+ kNoCompression, nullptr, &statuses_buf[i]);
324
+ blob_reqs.emplace_back(&requests_buf[i], std::unique_ptr<BlobContents>());
314
325
  }
315
326
 
316
- reader->MultiGetBlob(read_options, blob_reqs, &bytes_read);
327
+ reader->MultiGetBlob(read_options, allocator, blob_reqs, &bytes_read);
317
328
 
318
329
  for (size_t i = 0; i < num_blobs; ++i) {
319
330
  if (i == 1) {
@@ -327,14 +338,15 @@ TEST_F(BlobFileReaderTest, CreateReaderAndGetBlob) {
327
338
  // Incorrect key
328
339
  {
329
340
  constexpr char incorrect_key[] = "foo1";
330
- PinnableSlice value;
341
+ std::unique_ptr<BlobContents> value;
331
342
  uint64_t bytes_read = 0;
332
343
 
333
344
  ASSERT_TRUE(reader
334
345
  ->GetBlob(read_options, incorrect_key, blob_offsets[0],
335
346
  blob_sizes[0], kNoCompression, prefetch_buffer,
336
- &value, &bytes_read)
347
+ allocator, &value, &bytes_read)
337
348
  .IsCorruption());
349
+ ASSERT_EQ(value, nullptr);
338
350
  ASSERT_EQ(bytes_read, 0);
339
351
 
340
352
  // MultiGetBlob
@@ -346,19 +358,18 @@ TEST_F(BlobFileReaderTest, CreateReaderAndGetBlob) {
346
358
  key_refs[2] = std::cref(wrong_key_slice);
347
359
 
348
360
  std::array<Status, num_blobs> statuses_buf;
349
- std::array<PinnableSlice, num_blobs> value_buf;
350
361
  std::array<BlobReadRequest, num_blobs> requests_buf;
362
+ autovector<std::pair<BlobReadRequest*, std::unique_ptr<BlobContents>>>
363
+ blob_reqs;
351
364
 
352
365
  for (size_t i = 0; i < num_blobs; ++i) {
353
366
  requests_buf[i] =
354
367
  BlobReadRequest(key_refs[i], blob_offsets[i], blob_sizes[i],
355
- kNoCompression, &value_buf[i], &statuses_buf[i]);
368
+ kNoCompression, nullptr, &statuses_buf[i]);
369
+ blob_reqs.emplace_back(&requests_buf[i], std::unique_ptr<BlobContents>());
356
370
  }
357
371
 
358
- autovector<BlobReadRequest*> blob_reqs = {
359
- &requests_buf[0], &requests_buf[1], &requests_buf[2]};
360
-
361
- reader->MultiGetBlob(read_options, blob_reqs, &bytes_read);
372
+ reader->MultiGetBlob(read_options, allocator, blob_reqs, &bytes_read);
362
373
 
363
374
  for (size_t i = 0; i < num_blobs; ++i) {
364
375
  if (i == num_blobs - 1) {
@@ -371,14 +382,15 @@ TEST_F(BlobFileReaderTest, CreateReaderAndGetBlob) {
371
382
 
372
383
  // Incorrect value size
373
384
  {
374
- PinnableSlice value;
385
+ std::unique_ptr<BlobContents> value;
375
386
  uint64_t bytes_read = 0;
376
387
 
377
388
  ASSERT_TRUE(reader
378
389
  ->GetBlob(read_options, keys[1], blob_offsets[1],
379
390
  blob_sizes[1] + 1, kNoCompression,
380
- prefetch_buffer, &value, &bytes_read)
391
+ prefetch_buffer, allocator, &value, &bytes_read)
381
392
  .IsCorruption());
393
+ ASSERT_EQ(value, nullptr);
382
394
  ASSERT_EQ(bytes_read, 0);
383
395
 
384
396
  // MultiGetBlob
@@ -388,23 +400,26 @@ TEST_F(BlobFileReaderTest, CreateReaderAndGetBlob) {
388
400
  }
389
401
 
390
402
  std::array<Status, num_blobs> statuses_buf;
391
- std::array<PinnableSlice, num_blobs> value_buf;
392
403
  std::array<BlobReadRequest, num_blobs> requests_buf;
393
404
 
394
405
  requests_buf[0] =
395
406
  BlobReadRequest(key_refs[0], blob_offsets[0], blob_sizes[0],
396
- kNoCompression, &value_buf[0], &statuses_buf[0]);
407
+ kNoCompression, nullptr, &statuses_buf[0]);
397
408
  requests_buf[1] =
398
409
  BlobReadRequest(key_refs[1], blob_offsets[1], blob_sizes[1] + 1,
399
- kNoCompression, &value_buf[1], &statuses_buf[1]);
410
+ kNoCompression, nullptr, &statuses_buf[1]);
400
411
  requests_buf[2] =
401
412
  BlobReadRequest(key_refs[2], blob_offsets[2], blob_sizes[2],
402
- kNoCompression, &value_buf[2], &statuses_buf[2]);
413
+ kNoCompression, nullptr, &statuses_buf[2]);
403
414
 
404
- autovector<BlobReadRequest*> blob_reqs = {
405
- &requests_buf[0], &requests_buf[1], &requests_buf[2]};
415
+ autovector<std::pair<BlobReadRequest*, std::unique_ptr<BlobContents>>>
416
+ blob_reqs;
406
417
 
407
- reader->MultiGetBlob(read_options, blob_reqs, &bytes_read);
418
+ for (size_t i = 0; i < num_blobs; ++i) {
419
+ blob_reqs.emplace_back(&requests_buf[i], std::unique_ptr<BlobContents>());
420
+ }
421
+
422
+ reader->MultiGetBlob(read_options, allocator, blob_reqs, &bytes_read);
408
423
 
409
424
  for (size_t i = 0; i < num_blobs; ++i) {
410
425
  if (i != 1) {
@@ -665,14 +680,17 @@ TEST_F(BlobFileReaderTest, BlobCRCError) {
665
680
  SyncPoint::GetInstance()->EnableProcessing();
666
681
 
667
682
  constexpr FilePrefetchBuffer* prefetch_buffer = nullptr;
668
- PinnableSlice value;
683
+ constexpr MemoryAllocator* allocator = nullptr;
684
+
685
+ std::unique_ptr<BlobContents> value;
669
686
  uint64_t bytes_read = 0;
670
687
 
671
688
  ASSERT_TRUE(reader
672
689
  ->GetBlob(ReadOptions(), key, blob_offset, blob_size,
673
- kNoCompression, prefetch_buffer, &value,
690
+ kNoCompression, prefetch_buffer, allocator, &value,
674
691
  &bytes_read)
675
692
  .IsCorruption());
693
+ ASSERT_EQ(value, nullptr);
676
694
  ASSERT_EQ(bytes_read, 0);
677
695
 
678
696
  SyncPoint::GetInstance()->DisableProcessing();
@@ -720,28 +738,31 @@ TEST_F(BlobFileReaderTest, Compression) {
720
738
  read_options.verify_checksums = false;
721
739
 
722
740
  constexpr FilePrefetchBuffer* prefetch_buffer = nullptr;
741
+ constexpr MemoryAllocator* allocator = nullptr;
723
742
 
724
743
  {
725
- PinnableSlice value;
744
+ std::unique_ptr<BlobContents> value;
726
745
  uint64_t bytes_read = 0;
727
746
 
728
747
  ASSERT_OK(reader->GetBlob(read_options, key, blob_offset, blob_size,
729
- kSnappyCompression, prefetch_buffer, &value,
730
- &bytes_read));
731
- ASSERT_EQ(value, blob);
748
+ kSnappyCompression, prefetch_buffer, allocator,
749
+ &value, &bytes_read));
750
+ ASSERT_NE(value, nullptr);
751
+ ASSERT_EQ(value->data(), blob);
732
752
  ASSERT_EQ(bytes_read, blob_size);
733
753
  }
734
754
 
735
755
  read_options.verify_checksums = true;
736
756
 
737
757
  {
738
- PinnableSlice value;
758
+ std::unique_ptr<BlobContents> value;
739
759
  uint64_t bytes_read = 0;
740
760
 
741
761
  ASSERT_OK(reader->GetBlob(read_options, key, blob_offset, blob_size,
742
- kSnappyCompression, prefetch_buffer, &value,
743
- &bytes_read));
744
- ASSERT_EQ(value, blob);
762
+ kSnappyCompression, prefetch_buffer, allocator,
763
+ &value, &bytes_read));
764
+ ASSERT_NE(value, nullptr);
765
+ ASSERT_EQ(value->data(), blob);
745
766
 
746
767
  constexpr uint64_t key_size = sizeof(key) - 1;
747
768
  ASSERT_EQ(bytes_read,
@@ -799,14 +820,17 @@ TEST_F(BlobFileReaderTest, UncompressionError) {
799
820
  SyncPoint::GetInstance()->EnableProcessing();
800
821
 
801
822
  constexpr FilePrefetchBuffer* prefetch_buffer = nullptr;
802
- PinnableSlice value;
823
+ constexpr MemoryAllocator* allocator = nullptr;
824
+
825
+ std::unique_ptr<BlobContents> value;
803
826
  uint64_t bytes_read = 0;
804
827
 
805
828
  ASSERT_TRUE(reader
806
829
  ->GetBlob(ReadOptions(), key, blob_offset, blob_size,
807
- kSnappyCompression, prefetch_buffer, &value,
808
- &bytes_read)
830
+ kSnappyCompression, prefetch_buffer, allocator,
831
+ &value, &bytes_read)
809
832
  .IsCorruption());
833
+ ASSERT_EQ(value, nullptr);
810
834
  ASSERT_EQ(bytes_read, 0);
811
835
 
812
836
  SyncPoint::GetInstance()->DisableProcessing();
@@ -885,14 +909,17 @@ TEST_P(BlobFileReaderIOErrorTest, IOError) {
885
909
  ASSERT_OK(s);
886
910
 
887
911
  constexpr FilePrefetchBuffer* prefetch_buffer = nullptr;
888
- PinnableSlice value;
912
+ constexpr MemoryAllocator* allocator = nullptr;
913
+
914
+ std::unique_ptr<BlobContents> value;
889
915
  uint64_t bytes_read = 0;
890
916
 
891
917
  ASSERT_TRUE(reader
892
918
  ->GetBlob(ReadOptions(), key, blob_offset, blob_size,
893
- kNoCompression, prefetch_buffer, &value,
894
- &bytes_read)
919
+ kNoCompression, prefetch_buffer, allocator,
920
+ &value, &bytes_read)
895
921
  .IsIOError());
922
+ ASSERT_EQ(value, nullptr);
896
923
  ASSERT_EQ(bytes_read, 0);
897
924
  }
898
925
 
@@ -970,14 +997,17 @@ TEST_P(BlobFileReaderDecodingErrorTest, DecodingError) {
970
997
  ASSERT_OK(s);
971
998
 
972
999
  constexpr FilePrefetchBuffer* prefetch_buffer = nullptr;
973
- PinnableSlice value;
1000
+ constexpr MemoryAllocator* allocator = nullptr;
1001
+
1002
+ std::unique_ptr<BlobContents> value;
974
1003
  uint64_t bytes_read = 0;
975
1004
 
976
1005
  ASSERT_TRUE(reader
977
1006
  ->GetBlob(ReadOptions(), key, blob_offset, blob_size,
978
- kNoCompression, prefetch_buffer, &value,
979
- &bytes_read)
1007
+ kNoCompression, prefetch_buffer, allocator,
1008
+ &value, &bytes_read)
980
1009
  .IsCorruption());
1010
+ ASSERT_EQ(value, nullptr);
981
1011
  ASSERT_EQ(bytes_read, 0);
982
1012
  }
983
1013