@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
@@ -13,6 +13,7 @@
13
13
 
14
14
  #include "cache/charged_cache.h"
15
15
  #include "cache/compressed_secondary_cache.h"
16
+ #include "db/blob/blob_contents.h"
16
17
  #include "db/blob/blob_file_cache.h"
17
18
  #include "db/blob/blob_file_reader.h"
18
19
  #include "db/blob/blob_log_format.h"
@@ -218,6 +219,7 @@ TEST_F(BlobSourceTest, GetBlobsFromCache) {
218
219
  kNoCompression, prefetch_buffer, &values[i],
219
220
  &bytes_read));
220
221
  ASSERT_EQ(values[i], blobs[i]);
222
+ ASSERT_TRUE(values[i].IsPinned());
221
223
  ASSERT_EQ(bytes_read,
222
224
  BlobLogRecord::kHeaderSize + keys[i].size() + blob_sizes[i]);
223
225
 
@@ -255,6 +257,7 @@ TEST_F(BlobSourceTest, GetBlobsFromCache) {
255
257
  kNoCompression, prefetch_buffer, &values[i],
256
258
  &bytes_read));
257
259
  ASSERT_EQ(values[i], blobs[i]);
260
+ ASSERT_TRUE(values[i].IsPinned());
258
261
  ASSERT_EQ(bytes_read,
259
262
  BlobLogRecord::kHeaderSize + keys[i].size() + blob_sizes[i]);
260
263
 
@@ -298,6 +301,7 @@ TEST_F(BlobSourceTest, GetBlobsFromCache) {
298
301
  kNoCompression, prefetch_buffer, &values[i],
299
302
  &bytes_read));
300
303
  ASSERT_EQ(values[i], blobs[i]);
304
+ ASSERT_TRUE(values[i].IsPinned());
301
305
  ASSERT_EQ(bytes_read,
302
306
  BlobLogRecord::kHeaderSize + keys[i].size() + blob_sizes[i]);
303
307
 
@@ -336,6 +340,7 @@ TEST_F(BlobSourceTest, GetBlobsFromCache) {
336
340
  kNoCompression, prefetch_buffer, &values[i],
337
341
  &bytes_read));
338
342
  ASSERT_EQ(values[i], blobs[i]);
343
+ ASSERT_TRUE(values[i].IsPinned());
339
344
  ASSERT_EQ(bytes_read,
340
345
  BlobLogRecord::kHeaderSize + keys[i].size() + blob_sizes[i]);
341
346
 
@@ -382,6 +387,7 @@ TEST_F(BlobSourceTest, GetBlobsFromCache) {
382
387
  &bytes_read)
383
388
  .IsIncomplete());
384
389
  ASSERT_TRUE(values[i].empty());
390
+ ASSERT_FALSE(values[i].IsPinned());
385
391
  ASSERT_EQ(bytes_read, 0);
386
392
 
387
393
  ASSERT_FALSE(blob_source.TEST_BlobInCache(blob_file_number, file_size,
@@ -423,6 +429,7 @@ TEST_F(BlobSourceTest, GetBlobsFromCache) {
423
429
  &bytes_read)
424
430
  .IsIOError());
425
431
  ASSERT_TRUE(values[i].empty());
432
+ ASSERT_FALSE(values[i].IsPinned());
426
433
  ASSERT_EQ(bytes_read, 0);
427
434
 
428
435
  ASSERT_FALSE(blob_source.TEST_BlobInCache(file_number, file_size,
@@ -855,6 +862,7 @@ TEST_F(BlobSourceTest, MultiGetBlobsFromCache) {
855
862
  if (i % 2 == 0) {
856
863
  ASSERT_OK(statuses_buf[i]);
857
864
  ASSERT_EQ(value_buf[i], blobs[i]);
865
+ ASSERT_TRUE(value_buf[i].IsPinned());
858
866
  fs_read_bytes +=
859
867
  blob_sizes[i] + keys[i].size() + BlobLogRecord::kHeaderSize;
860
868
  ASSERT_TRUE(blob_source.TEST_BlobInCache(blob_file_number, file_size,
@@ -863,6 +871,7 @@ TEST_F(BlobSourceTest, MultiGetBlobsFromCache) {
863
871
  } else {
864
872
  statuses_buf[i].PermitUncheckedError();
865
873
  ASSERT_TRUE(value_buf[i].empty());
874
+ ASSERT_FALSE(value_buf[i].IsPinned());
866
875
  ASSERT_FALSE(blob_source.TEST_BlobInCache(blob_file_number, file_size,
867
876
  blob_offsets[i]));
868
877
  }
@@ -895,6 +904,7 @@ TEST_F(BlobSourceTest, MultiGetBlobsFromCache) {
895
904
  kNoCompression, prefetch_buffer,
896
905
  &value_buf[i], &bytes_read));
897
906
  ASSERT_EQ(value_buf[i], blobs[i]);
907
+ ASSERT_TRUE(value_buf[i].IsPinned());
898
908
  ASSERT_EQ(bytes_read,
899
909
  BlobLogRecord::kHeaderSize + keys[i].size() + blob_sizes[i]);
900
910
 
@@ -920,6 +930,7 @@ TEST_F(BlobSourceTest, MultiGetBlobsFromCache) {
920
930
  for (size_t i = 0; i < num_blobs; ++i) {
921
931
  ASSERT_OK(statuses_buf[i]);
922
932
  ASSERT_EQ(value_buf[i], blobs[i]);
933
+ ASSERT_TRUE(value_buf[i].IsPinned());
923
934
  ASSERT_TRUE(blob_source.TEST_BlobInCache(blob_file_number, file_size,
924
935
  blob_offsets[i]));
925
936
  blob_bytes += blob_sizes[i];
@@ -968,6 +979,7 @@ TEST_F(BlobSourceTest, MultiGetBlobsFromCache) {
968
979
  for (size_t i = 0; i < num_blobs; ++i) {
969
980
  ASSERT_TRUE(statuses_buf[i].IsIncomplete());
970
981
  ASSERT_TRUE(value_buf[i].empty());
982
+ ASSERT_FALSE(value_buf[i].IsPinned());
971
983
  ASSERT_FALSE(blob_source.TEST_BlobInCache(blob_file_number, file_size,
972
984
  blob_offsets[i]));
973
985
  }
@@ -1011,6 +1023,7 @@ TEST_F(BlobSourceTest, MultiGetBlobsFromCache) {
1011
1023
  for (size_t i = 0; i < num_blobs; ++i) {
1012
1024
  ASSERT_TRUE(statuses_buf[i].IsIOError());
1013
1025
  ASSERT_TRUE(value_buf[i].empty());
1026
+ ASSERT_FALSE(value_buf[i].IsPinned());
1014
1027
  ASSERT_FALSE(blob_source.TEST_BlobInCache(non_existing_file_number,
1015
1028
  file_size, blob_offsets[i]));
1016
1029
  }
@@ -1040,16 +1053,17 @@ class BlobSecondaryCacheTest : public DBTestBase {
1040
1053
 
1041
1054
  // Set a small cache capacity to evict entries from the cache, and to test
1042
1055
  // that secondary cache is used properly.
1043
- lru_cache_ops_.capacity = 1024;
1044
- lru_cache_ops_.num_shard_bits = 0;
1045
- lru_cache_ops_.strict_capacity_limit = true;
1046
- lru_cache_ops_.metadata_charge_policy = kDontChargeCacheMetadata;
1047
- lru_cache_ops_.high_pri_pool_ratio = 0.2;
1048
- lru_cache_ops_.low_pri_pool_ratio = 0.2;
1056
+ lru_cache_opts_.capacity = 1024;
1057
+ lru_cache_opts_.num_shard_bits = 0;
1058
+ lru_cache_opts_.strict_capacity_limit = true;
1059
+ lru_cache_opts_.metadata_charge_policy = kDontChargeCacheMetadata;
1060
+ lru_cache_opts_.high_pri_pool_ratio = 0.2;
1061
+ lru_cache_opts_.low_pri_pool_ratio = 0.2;
1049
1062
 
1050
1063
  secondary_cache_opts_.capacity = 8 << 20; // 8 MB
1051
1064
  secondary_cache_opts_.num_shard_bits = 0;
1052
- secondary_cache_opts_.metadata_charge_policy = kDontChargeCacheMetadata;
1065
+ secondary_cache_opts_.metadata_charge_policy =
1066
+ kDefaultCacheMetadataChargePolicy;
1053
1067
 
1054
1068
  // Read blobs from the secondary cache if they are not in the primary cache
1055
1069
  options_.lowest_used_cache_tier = CacheTier::kNonVolatileBlockTier;
@@ -1060,7 +1074,7 @@ class BlobSecondaryCacheTest : public DBTestBase {
1060
1074
 
1061
1075
  Options options_;
1062
1076
 
1063
- LRUCacheOptions lru_cache_ops_;
1077
+ LRUCacheOptions lru_cache_opts_;
1064
1078
  CompressedSecondaryCacheOptions secondary_cache_opts_;
1065
1079
 
1066
1080
  std::string db_id_;
@@ -1073,9 +1087,9 @@ TEST_F(BlobSecondaryCacheTest, GetBlobsFromSecondaryCache) {
1073
1087
  }
1074
1088
 
1075
1089
  secondary_cache_opts_.compression_type = kSnappyCompression;
1076
- lru_cache_ops_.secondary_cache =
1090
+ lru_cache_opts_.secondary_cache =
1077
1091
  NewCompressedSecondaryCache(secondary_cache_opts_);
1078
- options_.blob_cache = NewLRUCache(lru_cache_ops_);
1092
+ options_.blob_cache = NewLRUCache(lru_cache_opts_);
1079
1093
 
1080
1094
  options_.cf_paths.emplace_back(
1081
1095
  test::PerThreadDBPath(
@@ -1098,8 +1112,8 @@ TEST_F(BlobSecondaryCacheTest, GetBlobsFromSecondaryCache) {
1098
1112
  Random rnd(301);
1099
1113
 
1100
1114
  std::vector<std::string> key_strs{"key0", "key1"};
1101
- std::vector<std::string> blob_strs{rnd.RandomString(1010),
1102
- rnd.RandomString(1020)};
1115
+ std::vector<std::string> blob_strs{rnd.RandomString(512),
1116
+ rnd.RandomString(768)};
1103
1117
 
1104
1118
  std::vector<Slice> keys{key_strs[0], key_strs[1]};
1105
1119
  std::vector<Slice> blobs{blob_strs[0], blob_strs[1]};
@@ -1134,16 +1148,15 @@ TEST_F(BlobSecondaryCacheTest, GetBlobsFromSecondaryCache) {
1134
1148
  read_options.verify_checksums = true;
1135
1149
 
1136
1150
  auto blob_cache = options_.blob_cache;
1137
- auto secondary_cache = lru_cache_ops_.secondary_cache;
1138
-
1139
- Cache::CreateCallback create_cb = [&](const void* buf, size_t size,
1140
- void** out_obj,
1141
- size_t* charge) -> Status {
1142
- std::string* blob = new std::string();
1143
- blob->assign(static_cast<const char*>(buf), size);
1144
- *out_obj = blob;
1145
- *charge = size;
1146
- return Status::OK();
1151
+ auto secondary_cache = lru_cache_opts_.secondary_cache;
1152
+
1153
+ Cache::CreateCallback create_cb = [](const void* buf, size_t size,
1154
+ void** out_obj,
1155
+ size_t* charge) -> Status {
1156
+ CacheAllocationPtr allocation(new char[size]);
1157
+
1158
+ return BlobContents::CreateCallback(std::move(allocation), buf, size,
1159
+ out_obj, charge);
1147
1160
  };
1148
1161
 
1149
1162
  {
@@ -1154,6 +1167,25 @@ TEST_F(BlobSecondaryCacheTest, GetBlobsFromSecondaryCache) {
1154
1167
  get_perf_context()->Reset();
1155
1168
 
1156
1169
  // key0 should be filled to the primary cache from the blob file.
1170
+ ASSERT_OK(blob_source.GetBlob(read_options, keys[0], file_number,
1171
+ blob_offsets[0], file_size, blob_sizes[0],
1172
+ kNoCompression, nullptr /* prefetch_buffer */,
1173
+ &values[0], nullptr /* bytes_read */));
1174
+ // Release cache handle
1175
+ values[0].Reset();
1176
+
1177
+ // key0 should be evicted and key0's dummy item is inserted into secondary
1178
+ // cache. key1 should be filled to the primary cache from the blob file.
1179
+ ASSERT_OK(blob_source.GetBlob(read_options, keys[1], file_number,
1180
+ blob_offsets[1], file_size, blob_sizes[1],
1181
+ kNoCompression, nullptr /* prefetch_buffer */,
1182
+ &values[1], nullptr /* bytes_read */));
1183
+
1184
+ // Release cache handle
1185
+ values[1].Reset();
1186
+
1187
+ // key0 should be filled to the primary cache from the blob file. key1
1188
+ // should be evicted and key1's dummy item is inserted into secondary cache.
1157
1189
  ASSERT_OK(blob_source.GetBlob(read_options, keys[0], file_number,
1158
1190
  blob_offsets[0], file_size, blob_sizes[0],
1159
1191
  kNoCompression, nullptr /* prefetch_buffer */,
@@ -1162,8 +1194,11 @@ TEST_F(BlobSecondaryCacheTest, GetBlobsFromSecondaryCache) {
1162
1194
  ASSERT_TRUE(
1163
1195
  blob_source.TEST_BlobInCache(file_number, file_size, blob_offsets[0]));
1164
1196
 
1165
- // key0 should be demoted to the secondary cache, and key1 should be filled
1166
- // to the primary cache from the blob file.
1197
+ // Release cache handle
1198
+ values[0].Reset();
1199
+
1200
+ // key0 should be evicted and is inserted into secondary cache.
1201
+ // key1 should be filled to the primary cache from the blob file.
1167
1202
  ASSERT_OK(blob_source.GetBlob(read_options, keys[1], file_number,
1168
1203
  blob_offsets[1], file_size, blob_sizes[1],
1169
1204
  kNoCompression, nullptr /* prefetch_buffer */,
@@ -1172,6 +1207,9 @@ TEST_F(BlobSecondaryCacheTest, GetBlobsFromSecondaryCache) {
1172
1207
  ASSERT_TRUE(
1173
1208
  blob_source.TEST_BlobInCache(file_number, file_size, blob_offsets[1]));
1174
1209
 
1210
+ // Release cache handle
1211
+ values[1].Reset();
1212
+
1175
1213
  OffsetableCacheKey base_cache_key(db_id_, db_session_id_, file_number);
1176
1214
 
1177
1215
  // blob_cache here only looks at the primary cache since we didn't provide
@@ -1184,24 +1222,27 @@ TEST_F(BlobSecondaryCacheTest, GetBlobsFromSecondaryCache) {
1184
1222
  auto handle0 = blob_cache->Lookup(key0, statistics);
1185
1223
  ASSERT_EQ(handle0, nullptr);
1186
1224
 
1187
- // key0 should be in the secondary cache. After looking up key0 in the
1188
- // secondary cache, it will be erased from the secondary cache.
1225
+ // key0's item should be in the secondary cache.
1189
1226
  bool is_in_sec_cache = false;
1190
1227
  auto sec_handle0 =
1191
- secondary_cache->Lookup(key0, create_cb, true, is_in_sec_cache);
1228
+ secondary_cache->Lookup(key0, create_cb, true,
1229
+ /*advise_erase=*/true, is_in_sec_cache);
1192
1230
  ASSERT_FALSE(is_in_sec_cache);
1193
1231
  ASSERT_NE(sec_handle0, nullptr);
1194
1232
  ASSERT_TRUE(sec_handle0->IsReady());
1195
- auto value = static_cast<std::string*>(sec_handle0->Value());
1196
- ASSERT_EQ(*value, blobs[0]);
1233
+ auto value = static_cast<BlobContents*>(sec_handle0->Value());
1234
+ ASSERT_NE(value, nullptr);
1235
+ ASSERT_EQ(value->data(), blobs[0]);
1197
1236
  delete value;
1198
1237
 
1199
- // key0 doesn't exist in the blob cache
1238
+ // key0 doesn't exist in the blob cache although key0's dummy
1239
+ // item exist in the secondary cache.
1200
1240
  ASSERT_FALSE(blob_source.TEST_BlobInCache(file_number, file_size,
1201
1241
  blob_offsets[0]));
1202
1242
  }
1203
1243
 
1204
- // key1 should exist in the primary cache.
1244
+ // key1 should exists in the primary cache. key1's dummy item exists
1245
+ // in the secondary cache.
1205
1246
  {
1206
1247
  CacheKey cache_key = base_cache_key.WithOffset(blob_offsets[1]);
1207
1248
  const Slice key1 = cache_key.AsSlice();
@@ -1211,7 +1252,8 @@ TEST_F(BlobSecondaryCacheTest, GetBlobsFromSecondaryCache) {
1211
1252
 
1212
1253
  bool is_in_sec_cache = false;
1213
1254
  auto sec_handle1 =
1214
- secondary_cache->Lookup(key1, create_cb, true, is_in_sec_cache);
1255
+ secondary_cache->Lookup(key1, create_cb, true,
1256
+ /*advise_erase=*/true, is_in_sec_cache);
1215
1257
  ASSERT_FALSE(is_in_sec_cache);
1216
1258
  ASSERT_EQ(sec_handle1, nullptr);
1217
1259
 
@@ -1221,23 +1263,27 @@ TEST_F(BlobSecondaryCacheTest, GetBlobsFromSecondaryCache) {
1221
1263
 
1222
1264
  {
1223
1265
  // fetch key0 from the blob file to the primary cache.
1266
+ // key1 is evicted and inserted into the secondary cache.
1224
1267
  ASSERT_OK(blob_source.GetBlob(
1225
1268
  read_options, keys[0], file_number, blob_offsets[0], file_size,
1226
1269
  blob_sizes[0], kNoCompression, nullptr /* prefetch_buffer */,
1227
1270
  &values[0], nullptr /* bytes_read */));
1228
1271
  ASSERT_EQ(values[0], blobs[0]);
1229
1272
 
1273
+ // Release cache handle
1274
+ values[0].Reset();
1275
+
1230
1276
  // key0 should be in the primary cache.
1231
1277
  CacheKey cache_key0 = base_cache_key.WithOffset(blob_offsets[0]);
1232
1278
  const Slice key0 = cache_key0.AsSlice();
1233
1279
  auto handle0 = blob_cache->Lookup(key0, statistics);
1234
1280
  ASSERT_NE(handle0, nullptr);
1235
- auto value = static_cast<std::string*>(blob_cache->Value(handle0));
1236
- ASSERT_EQ(*value, blobs[0]);
1281
+ auto value = static_cast<BlobContents*>(blob_cache->Value(handle0));
1282
+ ASSERT_NE(value, nullptr);
1283
+ ASSERT_EQ(value->data(), blobs[0]);
1237
1284
  blob_cache->Release(handle0);
1238
1285
 
1239
- // key1 is not in the primary cache, and it should be demoted to the
1240
- // secondary cache.
1286
+ // key1 is not in the primary cache and is in the secondary cache.
1241
1287
  CacheKey cache_key1 = base_cache_key.WithOffset(blob_offsets[1]);
1242
1288
  const Slice key1 = cache_key1.AsSlice();
1243
1289
  auto handle1 = blob_cache->Lookup(key1, statistics);
@@ -1251,16 +1297,19 @@ TEST_F(BlobSecondaryCacheTest, GetBlobsFromSecondaryCache) {
1251
1297
  // key1 promotion should succeed due to the primary cache being empty. we
1252
1298
  // did't call secondary cache's Lookup() here, because it will remove the
1253
1299
  // key but it won't be able to promote the key to the primary cache.
1254
- // Instead we use the end-to-end blob source API to promote the key to
1255
- // the primary cache.
1300
+ // Instead we use the end-to-end blob source API to read key1.
1301
+ // In function TEST_BlobInCache, key1's dummy item is inserted into the
1302
+ // primary cache and a standalone handle is checked by GetValue().
1256
1303
  ASSERT_TRUE(blob_source.TEST_BlobInCache(file_number, file_size,
1257
1304
  blob_offsets[1]));
1258
1305
 
1259
- // key1 should be in the primary cache.
1306
+ // key1's dummy handle is in the primary cache and key1's item is still
1307
+ // in the secondary cache. So, the primary cache's Lookup() can only
1308
+ // get a dummy handle.
1260
1309
  handle1 = blob_cache->Lookup(key1, statistics);
1261
1310
  ASSERT_NE(handle1, nullptr);
1262
- value = static_cast<std::string*>(blob_cache->Value(handle1));
1263
- ASSERT_EQ(*value, blobs[1]);
1311
+ // handl1 is a dummy handle.
1312
+ ASSERT_EQ(blob_cache->Value(handle1), nullptr);
1264
1313
  blob_cache->Release(handle1);
1265
1314
  }
1266
1315
  }
@@ -1385,11 +1434,11 @@ TEST_F(BlobSourceCacheReservationTest, SimpleCacheReservation) {
1385
1434
  ReadOptions read_options;
1386
1435
  read_options.verify_checksums = true;
1387
1436
 
1388
- std::vector<PinnableSlice> values(keys_.size());
1389
-
1390
1437
  {
1391
1438
  read_options.fill_cache = false;
1392
1439
 
1440
+ std::vector<PinnableSlice> values(keys_.size());
1441
+
1393
1442
  for (size_t i = 0; i < kNumBlobs; ++i) {
1394
1443
  ASSERT_OK(blob_source.GetBlob(
1395
1444
  read_options, keys_[i], kBlobFileNumber, blob_offsets[i],
@@ -1403,6 +1452,8 @@ TEST_F(BlobSourceCacheReservationTest, SimpleCacheReservation) {
1403
1452
  {
1404
1453
  read_options.fill_cache = true;
1405
1454
 
1455
+ std::vector<PinnableSlice> values(keys_.size());
1456
+
1406
1457
  // num_blobs is 16, so the total blob cache usage is less than a single
1407
1458
  // dummy entry. Therefore, cache reservation manager only reserves one dummy
1408
1459
  // entry here.
@@ -1412,7 +1463,12 @@ TEST_F(BlobSourceCacheReservationTest, SimpleCacheReservation) {
1412
1463
  read_options, keys_[i], kBlobFileNumber, blob_offsets[i],
1413
1464
  blob_file_size_, blob_sizes[i], kNoCompression,
1414
1465
  nullptr /* prefetch_buffer */, &values[i], nullptr /* bytes_read */));
1415
- blob_bytes += blob_sizes[i];
1466
+
1467
+ size_t charge = 0;
1468
+ ASSERT_TRUE(blob_source.TEST_BlobInCache(kBlobFileNumber, blob_file_size_,
1469
+ blob_offsets[i], &charge));
1470
+
1471
+ blob_bytes += charge;
1416
1472
  ASSERT_EQ(cache_res_mgr->GetTotalReservedCacheSize(), kSizeDummyEntry);
1417
1473
  ASSERT_EQ(cache_res_mgr->GetTotalMemoryUsed(), blob_bytes);
1418
1474
  ASSERT_EQ(cache_res_mgr->GetTotalMemoryUsed(),
@@ -1425,19 +1481,23 @@ TEST_F(BlobSourceCacheReservationTest, SimpleCacheReservation) {
1425
1481
  size_t blob_bytes = options_.blob_cache->GetUsage();
1426
1482
 
1427
1483
  for (size_t i = 0; i < kNumBlobs; ++i) {
1484
+ size_t charge = 0;
1485
+ ASSERT_TRUE(blob_source.TEST_BlobInCache(kBlobFileNumber, blob_file_size_,
1486
+ blob_offsets[i], &charge));
1487
+
1428
1488
  CacheKey cache_key = base_cache_key.WithOffset(blob_offsets[i]);
1429
1489
  // We didn't call options_.blob_cache->Erase() here, this is because
1430
1490
  // the cache wrapper's Erase() method must be called to update the
1431
1491
  // cache usage after erasing the cache entry.
1432
1492
  blob_source.GetBlobCache()->Erase(cache_key.AsSlice());
1433
1493
  if (i == kNumBlobs - 1) {
1434
- // The last blob is not in the cache. cache_res_mgr should not reserve
1435
- // any space for it.
1494
+ // All the blobs got removed from the cache. cache_res_mgr should not
1495
+ // reserve any space for them.
1436
1496
  ASSERT_EQ(cache_res_mgr->GetTotalReservedCacheSize(), 0);
1437
1497
  } else {
1438
1498
  ASSERT_EQ(cache_res_mgr->GetTotalReservedCacheSize(), kSizeDummyEntry);
1439
1499
  }
1440
- blob_bytes -= blob_sizes[i];
1500
+ blob_bytes -= charge;
1441
1501
  ASSERT_EQ(cache_res_mgr->GetTotalMemoryUsed(), blob_bytes);
1442
1502
  ASSERT_EQ(cache_res_mgr->GetTotalMemoryUsed(),
1443
1503
  options_.blob_cache->GetUsage());
@@ -1495,11 +1555,11 @@ TEST_F(BlobSourceCacheReservationTest, IncreaseCacheReservationOnFullCache) {
1495
1555
  ReadOptions read_options;
1496
1556
  read_options.verify_checksums = true;
1497
1557
 
1498
- std::vector<PinnableSlice> values(keys_.size());
1499
-
1500
1558
  {
1501
1559
  read_options.fill_cache = false;
1502
1560
 
1561
+ std::vector<PinnableSlice> values(keys_.size());
1562
+
1503
1563
  for (size_t i = 0; i < kNumBlobs; ++i) {
1504
1564
  ASSERT_OK(blob_source.GetBlob(
1505
1565
  read_options, keys_[i], kBlobFileNumber, blob_offsets[i],
@@ -1513,21 +1573,33 @@ TEST_F(BlobSourceCacheReservationTest, IncreaseCacheReservationOnFullCache) {
1513
1573
  {
1514
1574
  read_options.fill_cache = true;
1515
1575
 
1516
- // Since we resized each blob to be kSizeDummyEntry / (num_blobs/ 2), we
1517
- // should observe cache eviction for the second half blobs.
1576
+ std::vector<PinnableSlice> values(keys_.size());
1577
+
1578
+ // Since we resized each blob to be kSizeDummyEntry / (num_blobs / 2), we
1579
+ // can't fit all the blobs in the cache at the same time, which means we
1580
+ // should observe cache evictions once we reach the cache's capacity.
1581
+ // Due to the overhead of the cache and the BlobContents objects, as well as
1582
+ // jemalloc bin sizes, this happens after inserting seven blobs.
1518
1583
  uint64_t blob_bytes = 0;
1519
1584
  for (size_t i = 0; i < kNumBlobs; ++i) {
1520
1585
  ASSERT_OK(blob_source.GetBlob(
1521
1586
  read_options, keys_[i], kBlobFileNumber, blob_offsets[i],
1522
1587
  blob_file_size_, blob_sizes[i], kNoCompression,
1523
1588
  nullptr /* prefetch_buffer */, &values[i], nullptr /* bytes_read */));
1524
- blob_bytes += blob_sizes[i];
1525
- ASSERT_EQ(cache_res_mgr->GetTotalReservedCacheSize(), kSizeDummyEntry);
1526
- if (i >= kNumBlobs / 2) {
1527
- ASSERT_EQ(cache_res_mgr->GetTotalMemoryUsed(), kSizeDummyEntry);
1528
- } else {
1529
- ASSERT_EQ(cache_res_mgr->GetTotalMemoryUsed(), blob_bytes);
1589
+
1590
+ // Release cache handle
1591
+ values[i].Reset();
1592
+
1593
+ if (i < kNumBlobs / 2 - 1) {
1594
+ size_t charge = 0;
1595
+ ASSERT_TRUE(blob_source.TEST_BlobInCache(
1596
+ kBlobFileNumber, blob_file_size_, blob_offsets[i], &charge));
1597
+
1598
+ blob_bytes += charge;
1530
1599
  }
1600
+
1601
+ ASSERT_EQ(cache_res_mgr->GetTotalReservedCacheSize(), kSizeDummyEntry);
1602
+ ASSERT_EQ(cache_res_mgr->GetTotalMemoryUsed(), blob_bytes);
1531
1603
  ASSERT_EQ(cache_res_mgr->GetTotalMemoryUsed(),
1532
1604
  options_.blob_cache->GetUsage());
1533
1605
  }
@@ -7,6 +7,7 @@
7
7
  #include <sstream>
8
8
  #include <string>
9
9
 
10
+ #include "cache/compressed_secondary_cache.h"
10
11
  #include "db/blob/blob_index.h"
11
12
  #include "db/blob/blob_log_format.h"
12
13
  #include "db/db_test_util.h"
@@ -53,7 +54,7 @@ TEST_F(DBBlobBasicTest, GetBlobFromCache) {
53
54
  Options options = GetDefaultOptions();
54
55
 
55
56
  LRUCacheOptions co;
56
- co.capacity = 2048;
57
+ co.capacity = 2 << 20; // 2MB
57
58
  co.num_shard_bits = 2;
58
59
  co.metadata_charge_policy = kDontChargeCacheMetadata;
59
60
  auto backing_cache = NewLRUCache(co);
@@ -121,7 +122,7 @@ TEST_F(DBBlobBasicTest, IterateBlobsFromCache) {
121
122
  Options options = GetDefaultOptions();
122
123
 
123
124
  LRUCacheOptions co;
124
- co.capacity = 2048;
125
+ co.capacity = 2 << 20; // 2MB
125
126
  co.num_shard_bits = 2;
126
127
  co.metadata_charge_policy = kDontChargeCacheMetadata;
127
128
  auto backing_cache = NewLRUCache(co);
@@ -452,7 +453,7 @@ TEST_F(DBBlobBasicTest, MultiGetBlobsFromCache) {
452
453
  Options options = GetDefaultOptions();
453
454
 
454
455
  LRUCacheOptions co;
455
- co.capacity = 2048;
456
+ co.capacity = 2 << 20; // 2MB
456
457
  co.num_shard_bits = 2;
457
458
  co.metadata_charge_policy = kDontChargeCacheMetadata;
458
459
  auto backing_cache = NewLRUCache(co);
@@ -1701,6 +1702,83 @@ TEST_F(DBBlobBasicTest, DynamicallyWarmCacheDuringFlush) {
1701
1702
  }
1702
1703
  #endif // !ROCKSDB_LITE
1703
1704
 
1705
+ TEST_F(DBBlobBasicTest, WarmCacheWithBlobsSecondary) {
1706
+ CompressedSecondaryCacheOptions secondary_cache_opts;
1707
+ secondary_cache_opts.capacity = 1 << 20;
1708
+ secondary_cache_opts.num_shard_bits = 0;
1709
+ secondary_cache_opts.metadata_charge_policy = kDontChargeCacheMetadata;
1710
+ secondary_cache_opts.compression_type = kNoCompression;
1711
+
1712
+ LRUCacheOptions primary_cache_opts;
1713
+ primary_cache_opts.capacity = 1024;
1714
+ primary_cache_opts.num_shard_bits = 0;
1715
+ primary_cache_opts.metadata_charge_policy = kDontChargeCacheMetadata;
1716
+ primary_cache_opts.secondary_cache =
1717
+ NewCompressedSecondaryCache(secondary_cache_opts);
1718
+
1719
+ Options options = GetDefaultOptions();
1720
+ options.create_if_missing = true;
1721
+ options.statistics = CreateDBStatistics();
1722
+ options.enable_blob_files = true;
1723
+ options.blob_cache = NewLRUCache(primary_cache_opts);
1724
+ options.prepopulate_blob_cache = PrepopulateBlobCache::kFlushOnly;
1725
+
1726
+ DestroyAndReopen(options);
1727
+
1728
+ // Note: only one of the two blobs fit in the primary cache at any given time.
1729
+ constexpr char first_key[] = "foo";
1730
+ constexpr size_t first_blob_size = 512;
1731
+ const std::string first_blob(first_blob_size, 'a');
1732
+
1733
+ constexpr char second_key[] = "bar";
1734
+ constexpr size_t second_blob_size = 768;
1735
+ const std::string second_blob(second_blob_size, 'b');
1736
+
1737
+ // First blob is inserted into primary cache during flush.
1738
+ ASSERT_OK(Put(first_key, first_blob));
1739
+ ASSERT_OK(Flush());
1740
+ ASSERT_EQ(options.statistics->getAndResetTickerCount(BLOB_DB_CACHE_ADD), 1);
1741
+
1742
+ // Second blob is inserted into primary cache during flush,
1743
+ // First blob is evicted but only a dummy handle is inserted into secondary
1744
+ // cache.
1745
+ ASSERT_OK(Put(second_key, second_blob));
1746
+ ASSERT_OK(Flush());
1747
+ ASSERT_EQ(options.statistics->getAndResetTickerCount(BLOB_DB_CACHE_ADD), 1);
1748
+
1749
+ // First blob is inserted into primary cache.
1750
+ // Second blob is evicted but only a dummy handle is inserted into secondary
1751
+ // cache.
1752
+ ASSERT_EQ(Get(first_key), first_blob);
1753
+ ASSERT_EQ(options.statistics->getAndResetTickerCount(BLOB_DB_CACHE_MISS), 1);
1754
+ ASSERT_EQ(options.statistics->getAndResetTickerCount(BLOB_DB_CACHE_HIT), 0);
1755
+ ASSERT_EQ(options.statistics->getAndResetTickerCount(SECONDARY_CACHE_HITS),
1756
+ 0);
1757
+ // Second blob is inserted into primary cache,
1758
+ // First blob is evicted and is inserted into secondary cache.
1759
+ ASSERT_EQ(Get(second_key), second_blob);
1760
+ ASSERT_EQ(options.statistics->getAndResetTickerCount(BLOB_DB_CACHE_MISS), 1);
1761
+ ASSERT_EQ(options.statistics->getAndResetTickerCount(BLOB_DB_CACHE_HIT), 0);
1762
+ ASSERT_EQ(options.statistics->getAndResetTickerCount(SECONDARY_CACHE_HITS),
1763
+ 0);
1764
+
1765
+ // First blob's dummy item is inserted into primary cache b/c of lookup.
1766
+ // Second blob is still in primary cache.
1767
+ ASSERT_EQ(Get(first_key), first_blob);
1768
+ ASSERT_EQ(options.statistics->getAndResetTickerCount(BLOB_DB_CACHE_MISS), 0);
1769
+ ASSERT_EQ(options.statistics->getAndResetTickerCount(BLOB_DB_CACHE_HIT), 1);
1770
+ ASSERT_EQ(options.statistics->getAndResetTickerCount(SECONDARY_CACHE_HITS),
1771
+ 1);
1772
+
1773
+ // First blob's item is inserted into primary cache b/c of lookup.
1774
+ // Second blob is evicted and inserted into secondary cache.
1775
+ ASSERT_EQ(Get(first_key), first_blob);
1776
+ ASSERT_EQ(options.statistics->getAndResetTickerCount(BLOB_DB_CACHE_MISS), 0);
1777
+ ASSERT_EQ(options.statistics->getAndResetTickerCount(BLOB_DB_CACHE_HIT), 1);
1778
+ ASSERT_EQ(options.statistics->getAndResetTickerCount(SECONDARY_CACHE_HITS),
1779
+ 1);
1780
+ }
1781
+
1704
1782
  } // namespace ROCKSDB_NAMESPACE
1705
1783
 
1706
1784
  int main(int argc, char** argv) {
@@ -1054,6 +1054,18 @@ void rocksdb_drop_column_family(
1054
1054
  SaveError(errptr, db->rep->DropColumnFamily(handle->rep));
1055
1055
  }
1056
1056
 
1057
+ uint32_t rocksdb_column_family_handle_get_id(
1058
+ rocksdb_column_family_handle_t* handle) {
1059
+ return handle->rep->GetID();
1060
+ }
1061
+
1062
+ char* rocksdb_column_family_handle_get_name(
1063
+ rocksdb_column_family_handle_t* handle, size_t* name_len) {
1064
+ auto name = handle->rep->GetName();
1065
+ *name_len = name.size();
1066
+ return CopyString(name);
1067
+ }
1068
+
1057
1069
  void rocksdb_column_family_handle_destroy(rocksdb_column_family_handle_t* handle) {
1058
1070
  delete handle->rep;
1059
1071
  delete handle;
@@ -2606,6 +2618,11 @@ void rocksdb_block_based_options_destroy(
2606
2618
  delete options;
2607
2619
  }
2608
2620
 
2621
+ void rocksdb_block_based_options_set_checksum(
2622
+ rocksdb_block_based_table_options_t* opt, char v) {
2623
+ opt->rep.checksum = static_cast<ROCKSDB_NAMESPACE::ChecksumType>(v);
2624
+ }
2625
+
2609
2626
  void rocksdb_block_based_options_set_block_size(
2610
2627
  rocksdb_block_based_table_options_t* options, size_t block_size) {
2611
2628
  options->rep.block_size = block_size;
@@ -4099,6 +4116,8 @@ uint64_t rocksdb_perfcontext_metric(rocksdb_perfcontext_t* context,
4099
4116
  return rep->blob_checksum_time;
4100
4117
  case rocksdb_blob_decompress_time:
4101
4118
  return rep->blob_decompress_time;
4119
+ case rocksdb_internal_range_del_reseek_count:
4120
+ return rep->internal_range_del_reseek_count;
4102
4121
  default:
4103
4122
  break;
4104
4123
  }
@@ -6449,6 +6468,16 @@ void rocksdb_options_set_memtable_whole_key_filtering(rocksdb_options_t* opt,
6449
6468
  opt->rep.memtable_whole_key_filtering = val;
6450
6469
  }
6451
6470
 
6471
+ void rocksdb_options_set_avoid_unnecessary_blocking_io(rocksdb_options_t* opt,
6472
+ unsigned char val) {
6473
+ opt->rep.avoid_unnecessary_blocking_io = val;
6474
+ }
6475
+
6476
+ unsigned char rocksdb_options_get_avoid_unnecessary_blocking_io(
6477
+ rocksdb_options_t* opt) {
6478
+ return opt->rep.avoid_unnecessary_blocking_io;
6479
+ }
6480
+
6452
6481
  // deletes container with memory usage estimates
6453
6482
  void rocksdb_approximate_memory_usage_destroy(rocksdb_memory_usage_t* usage) {
6454
6483
  delete usage;
@@ -1144,7 +1144,8 @@ Status ColumnFamilyData::RangesOverlapWithMemtables(
1144
1144
  MergeIteratorBuilder merge_iter_builder(&internal_comparator_, &arena);
1145
1145
  merge_iter_builder.AddIterator(
1146
1146
  super_version->mem->NewIterator(read_opts, &arena));
1147
- super_version->imm->AddIterators(read_opts, &merge_iter_builder);
1147
+ super_version->imm->AddIterators(read_opts, &merge_iter_builder,
1148
+ false /* add_range_tombstone_iter */);
1148
1149
  ScopedArenaIterator memtable_iter(merge_iter_builder.Finish());
1149
1150
 
1150
1151
  auto read_seq = super_version->current->version_set()->LastSequence();
@@ -1415,6 +1416,14 @@ Status ColumnFamilyData::ValidateOptions(
1415
1416
  "FIFO compaction only supported with max_open_files = -1.");
1416
1417
  }
1417
1418
 
1419
+ std::vector<uint32_t> supported{0, 1, 2, 4, 8};
1420
+ if (std::find(supported.begin(), supported.end(),
1421
+ cf_options.memtable_protection_bytes_per_key) ==
1422
+ supported.end()) {
1423
+ return Status::NotSupported(
1424
+ "Memtable per key-value checksum protection only supports 0, 1, 2, 4 "
1425
+ "or 8 bytes per key.");
1426
+ }
1418
1427
  return s;
1419
1428
  }
1420
1429