@nxtedition/rocksdb 7.1.20 → 7.1.21

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 (262) hide show
  1. package/deps/rocksdb/rocksdb/CMakeLists.txt +13 -6
  2. package/deps/rocksdb/rocksdb/Makefile +1 -1
  3. package/deps/rocksdb/rocksdb/TARGETS +2 -0
  4. package/deps/rocksdb/rocksdb/cache/cache_reservation_manager_test.cc +1 -0
  5. package/deps/rocksdb/rocksdb/cache/cache_test.cc +4 -4
  6. package/deps/rocksdb/rocksdb/cache/clock_cache.cc +139 -161
  7. package/deps/rocksdb/rocksdb/cache/clock_cache.h +92 -82
  8. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +16 -3
  9. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +9 -3
  10. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +73 -30
  11. package/deps/rocksdb/rocksdb/cache/fast_lru_cache.cc +25 -67
  12. package/deps/rocksdb/rocksdb/cache/fast_lru_cache.h +41 -40
  13. package/deps/rocksdb/rocksdb/cache/lru_cache.cc +109 -155
  14. package/deps/rocksdb/rocksdb/cache/lru_cache.h +127 -149
  15. package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +75 -80
  16. package/deps/rocksdb/rocksdb/cache/sharded_cache.cc +22 -172
  17. package/deps/rocksdb/rocksdb/cache/sharded_cache.h +272 -85
  18. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +12 -4
  19. package/deps/rocksdb/rocksdb/db/blob/blob_counting_iterator_test.cc +1 -0
  20. package/deps/rocksdb/rocksdb/db/blob/blob_file_addition_test.cc +1 -0
  21. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder_test.cc +1 -0
  22. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache_test.cc +1 -0
  23. package/deps/rocksdb/rocksdb/db/blob/blob_file_garbage_test.cc +1 -0
  24. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader_test.cc +1 -0
  25. package/deps/rocksdb/rocksdb/db/blob/blob_garbage_meter_test.cc +1 -0
  26. package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +13 -4
  27. package/deps/rocksdb/rocksdb/db/builder.cc +1 -1
  28. package/deps/rocksdb/rocksdb/db/column_family.cc +15 -1
  29. package/deps/rocksdb/rocksdb/db/compact_files_test.cc +1 -0
  30. package/deps/rocksdb/rocksdb/db/compaction/clipping_iterator_test.cc +1 -0
  31. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +25 -7
  32. package/deps/rocksdb/rocksdb/db/compaction/compaction.h +10 -0
  33. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +22 -8
  34. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +14 -5
  35. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +1 -0
  36. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +38 -12
  37. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +9 -6
  38. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +408 -6
  39. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +244 -54
  40. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +27 -6
  41. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +25 -30
  42. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +87 -26
  43. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +23 -4
  44. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +61 -0
  45. package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +294 -21
  46. package/deps/rocksdb/rocksdb/db/comparator_db_test.cc +1 -0
  47. package/deps/rocksdb/rocksdb/db/cuckoo_table_db_test.cc +1 -0
  48. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +28 -10
  49. package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +4 -4
  50. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +272 -0
  51. package/deps/rocksdb/rocksdb/db/db_flush_test.cc +38 -0
  52. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +69 -25
  53. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +7 -3
  54. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +29 -12
  55. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +0 -12
  56. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +10 -4
  57. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +35 -22
  58. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +5 -1
  59. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +40 -5
  60. package/deps/rocksdb/rocksdb/db/db_iter.cc +1 -0
  61. package/deps/rocksdb/rocksdb/db/db_iter_stress_test.cc +1 -0
  62. package/deps/rocksdb/rocksdb/db/db_iter_test.cc +1 -0
  63. package/deps/rocksdb/rocksdb/db/db_iterator_test.cc +22 -0
  64. package/deps/rocksdb/rocksdb/db/db_kv_checksum_test.cc +1 -0
  65. package/deps/rocksdb/rocksdb/db/db_logical_block_size_cache_test.cc +1 -0
  66. package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +72 -5
  67. package/deps/rocksdb/rocksdb/db/db_tailing_iter_test.cc +60 -21
  68. package/deps/rocksdb/rocksdb/db/db_test.cc +170 -1
  69. package/deps/rocksdb/rocksdb/db/db_test2.cc +9 -3
  70. package/deps/rocksdb/rocksdb/db/db_test_util.cc +19 -0
  71. package/deps/rocksdb/rocksdb/db/db_test_util.h +32 -0
  72. package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +444 -3
  73. package/deps/rocksdb/rocksdb/db/db_write_test.cc +8 -8
  74. package/deps/rocksdb/rocksdb/db/dbformat.cc +13 -0
  75. package/deps/rocksdb/rocksdb/db/dbformat.h +59 -4
  76. package/deps/rocksdb/rocksdb/db/dbformat_test.cc +1 -0
  77. package/deps/rocksdb/rocksdb/db/experimental.cc +3 -1
  78. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +24 -3
  79. package/deps/rocksdb/rocksdb/db/fault_injection_test.cc +1 -0
  80. package/deps/rocksdb/rocksdb/db/filename_test.cc +1 -0
  81. package/deps/rocksdb/rocksdb/db/flush_job.cc +4 -3
  82. package/deps/rocksdb/rocksdb/db/flush_job_test.cc +1 -0
  83. package/deps/rocksdb/rocksdb/db/forward_iterator.cc +85 -43
  84. package/deps/rocksdb/rocksdb/db/forward_iterator.h +3 -1
  85. package/deps/rocksdb/rocksdb/db/internal_stats.cc +33 -6
  86. package/deps/rocksdb/rocksdb/db/internal_stats.h +6 -0
  87. package/deps/rocksdb/rocksdb/db/listener_test.cc +1 -0
  88. package/deps/rocksdb/rocksdb/db/log_test.cc +1 -0
  89. package/deps/rocksdb/rocksdb/db/log_writer.cc +1 -1
  90. package/deps/rocksdb/rocksdb/db/log_writer.h +1 -1
  91. package/deps/rocksdb/rocksdb/db/manual_compaction_test.cc +1 -0
  92. package/deps/rocksdb/rocksdb/db/memtable.cc +158 -56
  93. package/deps/rocksdb/rocksdb/db/memtable.h +2 -0
  94. package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +1 -0
  95. package/deps/rocksdb/rocksdb/db/merge_helper_test.cc +1 -0
  96. package/deps/rocksdb/rocksdb/db/options_file_test.cc +1 -0
  97. package/deps/rocksdb/rocksdb/db/perf_context_test.cc +1 -0
  98. package/deps/rocksdb/rocksdb/db/periodic_task_scheduler_test.cc +1 -0
  99. package/deps/rocksdb/rocksdb/db/plain_table_db_test.cc +1 -0
  100. package/deps/rocksdb/rocksdb/db/prefix_test.cc +1 -0
  101. package/deps/rocksdb/rocksdb/db/range_del_aggregator.cc +52 -9
  102. package/deps/rocksdb/rocksdb/db/range_del_aggregator.h +31 -2
  103. package/deps/rocksdb/rocksdb/db/range_del_aggregator_test.cc +1 -0
  104. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.cc +81 -42
  105. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.h +78 -12
  106. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter_test.cc +1 -0
  107. package/deps/rocksdb/rocksdb/db/repair_test.cc +1 -0
  108. package/deps/rocksdb/rocksdb/db/seqno_time_test.cc +154 -27
  109. package/deps/rocksdb/rocksdb/db/seqno_to_time_mapping.cc +21 -4
  110. package/deps/rocksdb/rocksdb/db/seqno_to_time_mapping.h +4 -1
  111. package/deps/rocksdb/rocksdb/db/table_cache.cc +18 -6
  112. package/deps/rocksdb/rocksdb/db/table_properties_collector_test.cc +1 -0
  113. package/deps/rocksdb/rocksdb/db/version_builder_test.cc +1 -0
  114. package/deps/rocksdb/rocksdb/db/version_edit_test.cc +1 -0
  115. package/deps/rocksdb/rocksdb/db/version_set.cc +15 -7
  116. package/deps/rocksdb/rocksdb/db/version_set.h +2 -1
  117. package/deps/rocksdb/rocksdb/db/version_set_test.cc +1 -0
  118. package/deps/rocksdb/rocksdb/db/version_util.h +3 -1
  119. package/deps/rocksdb/rocksdb/db/wal_manager_test.cc +1 -0
  120. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.cc +28 -9
  121. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.h +21 -0
  122. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization_test.cc +30 -0
  123. package/deps/rocksdb/rocksdb/db/wide/wide_columns.cc +4 -0
  124. package/deps/rocksdb/rocksdb/db/write_batch.cc +30 -7
  125. package/deps/rocksdb/rocksdb/db/write_batch_internal.h +24 -13
  126. package/deps/rocksdb/rocksdb/db/write_batch_test.cc +5 -4
  127. package/deps/rocksdb/rocksdb/db/write_callback_test.cc +1 -0
  128. package/deps/rocksdb/rocksdb/db/write_controller_test.cc +1 -0
  129. package/deps/rocksdb/rocksdb/db_stress_tool/batched_ops_stress.cc +104 -60
  130. package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +199 -108
  131. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.cc +39 -0
  132. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +8 -0
  133. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +3 -1
  134. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +19 -0
  135. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +26 -0
  136. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +247 -118
  137. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +24 -4
  138. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +18 -0
  139. package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.cc +129 -1
  140. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +22 -0
  141. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.h +4 -0
  142. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +312 -117
  143. package/deps/rocksdb/rocksdb/env/env_basic_test.cc +1 -0
  144. package/deps/rocksdb/rocksdb/env/fs_posix.cc +10 -2
  145. package/deps/rocksdb/rocksdb/env/io_posix_test.cc +1 -0
  146. package/deps/rocksdb/rocksdb/env/mock_env_test.cc +1 -0
  147. package/deps/rocksdb/rocksdb/file/delete_scheduler.cc +5 -1
  148. package/deps/rocksdb/rocksdb/file/delete_scheduler_test.cc +1 -0
  149. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +1 -0
  150. package/deps/rocksdb/rocksdb/file/writable_file_writer.h +1 -1
  151. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +49 -1
  152. package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +44 -18
  153. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +8 -7
  154. package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +6 -1
  155. package/deps/rocksdb/rocksdb/include/rocksdb/listener.h +3 -0
  156. package/deps/rocksdb/rocksdb/include/rocksdb/secondary_cache.h +17 -4
  157. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_reader.h +4 -0
  158. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_writer.h +7 -0
  159. package/deps/rocksdb/rocksdb/include/rocksdb/universal_compaction.h +1 -1
  160. package/deps/rocksdb/rocksdb/include/rocksdb/wide_columns.h +9 -0
  161. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch.h +3 -6
  162. package/deps/rocksdb/rocksdb/logging/auto_roll_logger_test.cc +1 -0
  163. package/deps/rocksdb/rocksdb/logging/env_logger_test.cc +1 -0
  164. package/deps/rocksdb/rocksdb/logging/event_logger_test.cc +1 -0
  165. package/deps/rocksdb/rocksdb/memory/arena.cc +23 -88
  166. package/deps/rocksdb/rocksdb/memory/arena.h +25 -31
  167. package/deps/rocksdb/rocksdb/memory/arena_test.cc +61 -0
  168. package/deps/rocksdb/rocksdb/memory/memory_allocator_test.cc +1 -0
  169. package/deps/rocksdb/rocksdb/memtable/inlineskiplist_test.cc +1 -0
  170. package/deps/rocksdb/rocksdb/memtable/skiplist_test.cc +1 -0
  171. package/deps/rocksdb/rocksdb/memtable/write_buffer_manager_test.cc +1 -0
  172. package/deps/rocksdb/rocksdb/monitoring/histogram_test.cc +1 -0
  173. package/deps/rocksdb/rocksdb/monitoring/iostats_context_test.cc +1 -0
  174. package/deps/rocksdb/rocksdb/options/cf_options.cc +19 -0
  175. package/deps/rocksdb/rocksdb/options/cf_options.h +8 -0
  176. package/deps/rocksdb/rocksdb/options/configurable_test.cc +1 -0
  177. package/deps/rocksdb/rocksdb/options/options.cc +7 -0
  178. package/deps/rocksdb/rocksdb/options/options_helper.cc +6 -0
  179. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +6 -0
  180. package/deps/rocksdb/rocksdb/options/options_test.cc +63 -40
  181. package/deps/rocksdb/rocksdb/port/mmap.cc +98 -0
  182. package/deps/rocksdb/rocksdb/port/mmap.h +70 -0
  183. package/deps/rocksdb/rocksdb/port/stack_trace.cc +7 -0
  184. package/deps/rocksdb/rocksdb/port/stack_trace.h +4 -1
  185. package/deps/rocksdb/rocksdb/port/win/port_win.h +2 -7
  186. package/deps/rocksdb/rocksdb/src.mk +1 -0
  187. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +7 -7
  188. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +3 -3
  189. package/deps/rocksdb/rocksdb/table/block_based/block_test.cc +1 -0
  190. package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index_test.cc +1 -0
  191. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block_test.cc +1 -0
  192. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +1 -0
  193. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder_test.cc +1 -0
  194. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader_test.cc +1 -0
  195. package/deps/rocksdb/rocksdb/table/get_context.cc +19 -1
  196. package/deps/rocksdb/rocksdb/table/get_context.h +9 -0
  197. package/deps/rocksdb/rocksdb/table/merger_test.cc +1 -0
  198. package/deps/rocksdb/rocksdb/table/merging_iterator.cc +10 -11
  199. package/deps/rocksdb/rocksdb/table/mock_table.cc +37 -19
  200. package/deps/rocksdb/rocksdb/table/mock_table.h +5 -1
  201. package/deps/rocksdb/rocksdb/table/sst_file_reader.cc +6 -0
  202. package/deps/rocksdb/rocksdb/table/sst_file_reader_test.cc +33 -0
  203. package/deps/rocksdb/rocksdb/table/sst_file_writer.cc +45 -6
  204. package/deps/rocksdb/rocksdb/test_util/testharness.h +2 -0
  205. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_test.cc +1 -0
  206. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +5 -0
  207. package/deps/rocksdb/rocksdb/tools/db_bench_tool_test.cc +1 -0
  208. package/deps/rocksdb/rocksdb/tools/io_tracer_parser_test.cc +1 -0
  209. package/deps/rocksdb/rocksdb/tools/ldb_cmd_test.cc +36 -0
  210. package/deps/rocksdb/rocksdb/tools/reduce_levels_test.cc +1 -0
  211. package/deps/rocksdb/rocksdb/tools/trace_analyzer_test.cc +1 -0
  212. package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer_test.cc +1 -0
  213. package/deps/rocksdb/rocksdb/trace_replay/io_tracer_test.cc +1 -0
  214. package/deps/rocksdb/rocksdb/util/autovector_test.cc +1 -0
  215. package/deps/rocksdb/rocksdb/util/bloom_test.cc +1 -0
  216. package/deps/rocksdb/rocksdb/util/coding_test.cc +1 -0
  217. package/deps/rocksdb/rocksdb/util/crc32c_test.cc +1 -0
  218. package/deps/rocksdb/rocksdb/util/dynamic_bloom_test.cc +1 -0
  219. package/deps/rocksdb/rocksdb/util/file_reader_writer_test.cc +1 -0
  220. package/deps/rocksdb/rocksdb/util/filelock_test.cc +1 -0
  221. package/deps/rocksdb/rocksdb/util/gflags_compat.h +12 -7
  222. package/deps/rocksdb/rocksdb/util/hash_test.cc +1 -0
  223. package/deps/rocksdb/rocksdb/util/heap_test.cc +4 -2
  224. package/deps/rocksdb/rocksdb/util/random_test.cc +1 -0
  225. package/deps/rocksdb/rocksdb/util/rate_limiter_test.cc +1 -0
  226. package/deps/rocksdb/rocksdb/util/repeatable_thread_test.cc +1 -0
  227. package/deps/rocksdb/rocksdb/util/ribbon_test.cc +1 -0
  228. package/deps/rocksdb/rocksdb/util/slice_transform_test.cc +1 -0
  229. package/deps/rocksdb/rocksdb/util/thread_list_test.cc +1 -0
  230. package/deps/rocksdb/rocksdb/util/thread_local_test.cc +1 -0
  231. package/deps/rocksdb/rocksdb/util/timer_test.cc +1 -0
  232. package/deps/rocksdb/rocksdb/util/work_queue_test.cc +4 -0
  233. package/deps/rocksdb/rocksdb/utilities/agg_merge/agg_merge_test.cc +1 -0
  234. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +13 -0
  235. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +9 -3
  236. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_test.cc +1 -0
  237. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_format_test.cc +1 -0
  238. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_functional_test.cc +1 -0
  239. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_row_merge_test.cc +1 -0
  240. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_serialize_test.cc +1 -0
  241. package/deps/rocksdb/rocksdb/utilities/env_mirror_test.cc +1 -0
  242. package/deps/rocksdb/rocksdb/utilities/env_timed_test.cc +1 -0
  243. package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.h +8 -0
  244. package/deps/rocksdb/rocksdb/utilities/memory/memory_test.cc +1 -0
  245. package/deps/rocksdb/rocksdb/utilities/object_registry_test.cc +1 -0
  246. package/deps/rocksdb/rocksdb/utilities/options/options_util_test.cc +1 -0
  247. package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table_test.cc +1 -0
  248. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_test.cc +1 -0
  249. package/deps/rocksdb/rocksdb/utilities/simulator_cache/cache_simulator_test.cc +1 -0
  250. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_test.cc +1 -0
  251. package/deps/rocksdb/rocksdb/utilities/transactions/timestamped_snapshot_test.cc +1 -0
  252. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +1 -0
  253. package/deps/rocksdb/rocksdb/utilities/transactions/write_committed_transaction_ts_test.cc +1 -0
  254. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_transaction_test.cc +1 -0
  255. package/deps/rocksdb/rocksdb/utilities/ttl/ttl_test.cc +1 -0
  256. package/deps/rocksdb/rocksdb/utilities/util_merge_operators_test.cc +1 -0
  257. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +7 -0
  258. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +20 -0
  259. package/index.js +12 -4
  260. package/package.json +1 -1
  261. package/prebuilds/darwin-arm64/node.napi.node +0 -0
  262. package/prebuilds/linux-x64/node.napi.node +0 -0
@@ -22,6 +22,9 @@
22
22
  namespace ROCKSDB_NAMESPACE {
23
23
  namespace lru_cache {
24
24
 
25
+ // A distinct pointer value for marking "dummy" cache entries
26
+ void* const kDummyValueMarker = const_cast<char*>("kDummyValueMarker");
27
+
25
28
  LRUHandleTable::LRUHandleTable(int max_upper_hash_bits)
26
29
  : length_bits_(/* historical starting size*/ 4),
27
30
  list_(new LRUHandle* [size_t{1} << length_bits_] {}),
@@ -35,7 +38,7 @@ LRUHandleTable::~LRUHandleTable() {
35
38
  h->Free();
36
39
  }
37
40
  },
38
- 0, uint32_t{1} << length_bits_);
41
+ 0, size_t{1} << length_bits_);
39
42
  }
40
43
 
41
44
  LRUHandle* LRUHandleTable::Lookup(const Slice& key, uint32_t hash) {
@@ -110,12 +113,13 @@ void LRUHandleTable::Resize() {
110
113
  length_bits_ = new_length_bits;
111
114
  }
112
115
 
113
- LRUCacheShard::LRUCacheShard(
114
- size_t capacity, bool strict_capacity_limit, double high_pri_pool_ratio,
115
- double low_pri_pool_ratio, bool use_adaptive_mutex,
116
- CacheMetadataChargePolicy metadata_charge_policy, int max_upper_hash_bits,
117
- const std::shared_ptr<SecondaryCache>& secondary_cache)
118
- : CacheShard(metadata_charge_policy),
116
+ LRUCacheShard::LRUCacheShard(size_t capacity, bool strict_capacity_limit,
117
+ double high_pri_pool_ratio,
118
+ double low_pri_pool_ratio, bool use_adaptive_mutex,
119
+ CacheMetadataChargePolicy metadata_charge_policy,
120
+ int max_upper_hash_bits,
121
+ SecondaryCache* secondary_cache)
122
+ : CacheShardBase(metadata_charge_policy),
119
123
  capacity_(0),
120
124
  high_pri_pool_usage_(0),
121
125
  low_pri_pool_usage_(0),
@@ -162,27 +166,27 @@ void LRUCacheShard::EraseUnRefEntries() {
162
166
  void LRUCacheShard::ApplyToSomeEntries(
163
167
  const std::function<void(const Slice& key, void* value, size_t charge,
164
168
  DeleterFn deleter)>& callback,
165
- uint32_t average_entries_per_lock, uint32_t* state) {
169
+ size_t average_entries_per_lock, size_t* state) {
166
170
  // The state is essentially going to be the starting hash, which works
167
171
  // nicely even if we resize between calls because we use upper-most
168
172
  // hash bits for table indexes.
169
173
  DMutexLock l(mutex_);
170
- uint32_t length_bits = table_.GetLengthBits();
171
- uint32_t length = uint32_t{1} << length_bits;
174
+ int length_bits = table_.GetLengthBits();
175
+ size_t length = size_t{1} << length_bits;
172
176
 
173
177
  assert(average_entries_per_lock > 0);
174
178
  // Assuming we are called with same average_entries_per_lock repeatedly,
175
179
  // this simplifies some logic (index_end will not overflow).
176
180
  assert(average_entries_per_lock < length || *state == 0);
177
181
 
178
- uint32_t index_begin = *state >> (32 - length_bits);
179
- uint32_t index_end = index_begin + average_entries_per_lock;
182
+ size_t index_begin = *state >> (sizeof(size_t) * 8u - length_bits);
183
+ size_t index_end = index_begin + average_entries_per_lock;
180
184
  if (index_end >= length) {
181
185
  // Going to end
182
186
  index_end = length;
183
- *state = UINT32_MAX;
187
+ *state = SIZE_MAX;
184
188
  } else {
185
- *state = index_end << (32 - length_bits);
189
+ *state = index_end << (sizeof(size_t) * 8u - length_bits);
186
190
  }
187
191
 
188
192
  table_.ApplyToEntriesRange(
@@ -361,7 +365,7 @@ void LRUCacheShard::SetStrictCapacityLimit(bool strict_capacity_limit) {
361
365
  strict_capacity_limit_ = strict_capacity_limit;
362
366
  }
363
367
 
364
- Status LRUCacheShard::InsertItem(LRUHandle* e, Cache::Handle** handle,
368
+ Status LRUCacheShard::InsertItem(LRUHandle* e, LRUHandle** handle,
365
369
  bool free_handle_on_fail) {
366
370
  Status s = Status::OK();
367
371
  autovector<LRUHandle*> last_reference_list;
@@ -411,7 +415,7 @@ Status LRUCacheShard::InsertItem(LRUHandle* e, Cache::Handle** handle,
411
415
  if (!e->HasRefs()) {
412
416
  e->Ref();
413
417
  }
414
- *handle = reinterpret_cast<Cache::Handle*>(e);
418
+ *handle = e;
415
419
  }
416
420
  }
417
421
  }
@@ -425,16 +429,20 @@ void LRUCacheShard::Promote(LRUHandle* e) {
425
429
  SecondaryCacheResultHandle* secondary_handle = e->sec_handle;
426
430
 
427
431
  assert(secondary_handle->IsReady());
428
- e->SetIncomplete(false);
429
- e->SetInCache(false);
432
+ // e is not thread-shared here; OK to modify "immutable" fields as well as
433
+ // "mutable" (normally requiring mutex)
434
+ e->SetIsPending(false);
430
435
  e->value = secondary_handle->Value();
431
- e->CalcTotalCharge(secondary_handle->Size(), metadata_charge_policy_);
436
+ assert(e->total_charge == 0);
437
+ size_t value_size = secondary_handle->Size();
432
438
  delete secondary_handle;
433
439
 
434
440
  if (e->value) {
441
+ e->CalcTotalCharge(value_size, metadata_charge_policy_);
435
442
  Status s;
436
- if (secondary_cache_ && secondary_cache_->SupportForceErase() &&
437
- e->IsStandalone()) {
443
+ if (e->IsStandalone()) {
444
+ assert(secondary_cache_ && secondary_cache_->SupportForceErase());
445
+
438
446
  // Insert a dummy handle and return a standalone handle to caller.
439
447
  // Charge the standalone handle.
440
448
  autovector<LRUHandle*> last_reference_list;
@@ -464,15 +472,16 @@ void LRUCacheShard::Promote(LRUHandle* e) {
464
472
 
465
473
  // Insert a dummy handle into the primary cache. This dummy handle is
466
474
  // not IsSecondaryCacheCompatible().
475
+ // FIXME? This should not overwrite an existing non-dummy entry in the
476
+ // rare case that one exists
467
477
  Cache::Priority priority =
468
478
  e->IsHighPri() ? Cache::Priority::HIGH : Cache::Priority::LOW;
469
- s = Insert(e->key(), e->hash, /*value=*/nullptr, 0,
479
+ s = Insert(e->key(), e->hash, kDummyValueMarker, /*charge=*/0,
470
480
  /*deleter=*/nullptr, /*helper=*/nullptr, /*handle=*/nullptr,
471
481
  priority);
472
482
  } else {
473
483
  e->SetInCache(true);
474
- e->SetIsStandalone(false);
475
- Cache::Handle* handle = reinterpret_cast<Cache::Handle*>(e);
484
+ LRUHandle* handle = e;
476
485
  // This InsertItem() could fail if the cache is over capacity and
477
486
  // strict_capacity_limit_ is true. In such a case, we don't want
478
487
  // InsertItem() to free the handle, since the item is already in memory
@@ -489,23 +498,19 @@ void LRUCacheShard::Promote(LRUHandle* e) {
489
498
  // When the handle is released, the item should get deleted.
490
499
  assert(!e->InCache());
491
500
  }
492
-
493
501
  } else {
494
- // Since the secondary cache lookup failed, mark the item as not in cache
495
- // Don't charge the cache as its only metadata that'll shortly be released
496
- DMutexLock l(mutex_);
497
- // TODO
498
- e->CalcTotalCharge(0, metadata_charge_policy_);
499
- e->SetInCache(false);
500
- e->SetIsStandalone(false);
502
+ // Secondary cache lookup failed. The caller will take care of detecting
503
+ // this and eventually releasing e.
504
+ assert(!e->value);
505
+ assert(!e->InCache());
501
506
  }
502
507
  }
503
508
 
504
- Cache::Handle* LRUCacheShard::Lookup(
505
- const Slice& key, uint32_t hash,
506
- const ShardedCache::CacheItemHelper* helper,
507
- const ShardedCache::CreateCallback& create_cb, Cache::Priority priority,
508
- bool wait, Statistics* stats) {
509
+ LRUHandle* LRUCacheShard::Lookup(const Slice& key, uint32_t hash,
510
+ const Cache::CacheItemHelper* helper,
511
+ const Cache::CreateCallback& create_cb,
512
+ Cache::Priority priority, bool wait,
513
+ Statistics* stats) {
509
514
  LRUHandle* e = nullptr;
510
515
  bool found_dummy_entry{false};
511
516
  {
@@ -513,21 +518,22 @@ Cache::Handle* LRUCacheShard::Lookup(
513
518
  e = table_.Lookup(key, hash);
514
519
  if (e != nullptr) {
515
520
  assert(e->InCache());
516
- if (!e->HasRefs()) {
517
- // The entry is in LRU since it's in hash and has no external
518
- // references.
519
- LRU_Remove(e);
520
- }
521
- e->Ref();
522
- e->SetHit();
523
-
524
- // For a dummy handle, if it was retrieved from secondary cache,
525
- // it may still exist in secondary cache.
526
- // If the handle exists in secondary cache, the value should be
527
- // erased from sec cache and be inserted into primary cache.
528
- if (!e->value && secondary_cache_ &&
529
- secondary_cache_->SupportForceErase()) {
521
+ if (e->value == kDummyValueMarker) {
522
+ // For a dummy handle, if it was retrieved from secondary cache,
523
+ // it may still exist in secondary cache.
524
+ // If the handle exists in secondary cache, the value should be
525
+ // erased from sec cache and be inserted into primary cache.
530
526
  found_dummy_entry = true;
527
+ // Let the dummy entry be overwritten
528
+ e = nullptr;
529
+ } else {
530
+ if (!e->HasRefs()) {
531
+ // The entry is in LRU since it's in hash and has no external
532
+ // references.
533
+ LRU_Remove(e);
534
+ }
535
+ e->Ref();
536
+ e->SetHit();
531
537
  }
532
538
  }
533
539
  }
@@ -541,21 +547,13 @@ Cache::Handle* LRUCacheShard::Lookup(
541
547
  // standalone handle is returned to the caller. Only if the block is hit
542
548
  // again, we erase it from CompressedSecondaryCache and add it into the
543
549
  // primary cache.
544
- //
545
- // Only support synchronous for now.
546
- // TODO: Support asynchronous lookup in secondary cache
547
- if ((!e || found_dummy_entry) && secondary_cache_ && helper &&
548
- helper->saveto_cb) {
550
+ if (!e && secondary_cache_ && helper && helper->saveto_cb) {
549
551
  // For objects from the secondary cache, we expect the caller to provide
550
552
  // a way to create/delete the primary cache object. The only case where
551
553
  // a deleter would not be required is for dummy entries inserted for
552
554
  // accounting purposes, which we won't demote to the secondary cache
553
555
  // anyway.
554
556
  assert(create_cb && helper->del_cb);
555
- // Release the dummy handle.
556
- if (e) {
557
- Release(reinterpret_cast<Cache::Handle*>(e), true /*erase_if_last_ref*/);
558
- }
559
557
  bool is_in_sec_cache{false};
560
558
  std::unique_ptr<SecondaryCacheResultHandle> secondary_handle =
561
559
  secondary_cache_->Lookup(key, create_cb, wait, found_dummy_entry,
@@ -564,7 +562,8 @@ Cache::Handle* LRUCacheShard::Lookup(
564
562
  e = reinterpret_cast<LRUHandle*>(
565
563
  new char[sizeof(LRUHandle) - 1 + key.size()]);
566
564
 
567
- e->flags = 0;
565
+ e->m_flags = 0;
566
+ e->im_flags = 0;
568
567
  e->SetSecondaryCacheCompatible(true);
569
568
  e->info_.helper = helper;
570
569
  e->key_length = key.size();
@@ -578,10 +577,8 @@ Cache::Handle* LRUCacheShard::Lookup(
578
577
  e->total_charge = 0;
579
578
  e->Ref();
580
579
  e->SetIsInSecondaryCache(is_in_sec_cache);
581
-
582
- if (secondary_cache_->SupportForceErase() && !found_dummy_entry) {
583
- e->SetIsStandalone(true);
584
- }
580
+ e->SetIsStandalone(secondary_cache_->SupportForceErase() &&
581
+ !found_dummy_entry);
585
582
 
586
583
  if (wait) {
587
584
  Promote(e);
@@ -599,24 +596,27 @@ Cache::Handle* LRUCacheShard::Lookup(
599
596
  } else {
600
597
  // If wait is false, we always return a handle and let the caller
601
598
  // release the handle after checking for success or failure.
602
- e->SetIncomplete(true);
599
+ e->SetIsPending(true);
603
600
  // This may be slightly inaccurate, if the lookup eventually fails.
604
601
  // But the probability is very low.
605
602
  PERF_COUNTER_ADD(secondary_cache_hit_count, 1);
606
603
  RecordTick(stats, SECONDARY_CACHE_HITS);
607
604
  }
608
605
  } else {
609
- e = nullptr;
606
+ // Caller will most likely overwrite the dummy entry with an Insert
607
+ // after this Lookup fails
608
+ assert(e == nullptr);
610
609
  }
611
610
  }
612
- return reinterpret_cast<Cache::Handle*>(e);
611
+ return e;
613
612
  }
614
613
 
615
- bool LRUCacheShard::Ref(Cache::Handle* h) {
616
- LRUHandle* e = reinterpret_cast<LRUHandle*>(h);
614
+ bool LRUCacheShard::Ref(LRUHandle* e) {
617
615
  DMutexLock l(mutex_);
618
616
  // To create another reference - entry must be already externally referenced.
619
617
  assert(e->HasRefs());
618
+ // Pending handles are not for sharing
619
+ assert(!e->IsPending());
620
620
  e->Ref();
621
621
  return true;
622
622
  }
@@ -635,12 +635,15 @@ void LRUCacheShard::SetLowPriorityPoolRatio(double low_pri_pool_ratio) {
635
635
  MaintainPoolSize();
636
636
  }
637
637
 
638
- bool LRUCacheShard::Release(Cache::Handle* handle, bool erase_if_last_ref) {
639
- if (handle == nullptr) {
638
+ bool LRUCacheShard::Release(LRUHandle* e, bool /*useful*/,
639
+ bool erase_if_last_ref) {
640
+ if (e == nullptr) {
640
641
  return false;
641
642
  }
642
- LRUHandle* e = reinterpret_cast<LRUHandle*>(handle);
643
643
  bool last_reference = false;
644
+ // Must Wait or WaitAll first on pending handles. Otherwise, would leak
645
+ // a secondary cache handle.
646
+ assert(!e->IsPending());
644
647
  {
645
648
  DMutexLock l(mutex_);
646
649
  last_reference = e->Unref();
@@ -658,12 +661,8 @@ bool LRUCacheShard::Release(Cache::Handle* handle, bool erase_if_last_ref) {
658
661
  last_reference = false;
659
662
  }
660
663
  }
661
- // If it was the last reference, and the entry is either not secondary
662
- // cache compatible (i.e a dummy entry for accounting), or is secondary
663
- // cache compatible and has a non-null value, then decrement the cache
664
- // usage. If value is null in the latter case, that means the lookup
665
- // failed and we didn't charge the cache.
666
- if (last_reference && (!e->IsSecondaryCacheCompatible() || e->value)) {
664
+ // If it was the last reference, then decrement the cache usage.
665
+ if (last_reference) {
667
666
  assert(usage_ >= e->total_charge);
668
667
  usage_ -= e->total_charge;
669
668
  }
@@ -680,7 +679,7 @@ Status LRUCacheShard::Insert(const Slice& key, uint32_t hash, void* value,
680
679
  size_t charge,
681
680
  void (*deleter)(const Slice& key, void* value),
682
681
  const Cache::CacheItemHelper* helper,
683
- Cache::Handle** handle, Cache::Priority priority) {
682
+ LRUHandle** handle, Cache::Priority priority) {
684
683
  // Allocate the memory here outside of the mutex.
685
684
  // If the cache is full, we'll have to release it.
686
685
  // It shouldn't happen very often though.
@@ -688,14 +687,17 @@ Status LRUCacheShard::Insert(const Slice& key, uint32_t hash, void* value,
688
687
  new char[sizeof(LRUHandle) - 1 + key.size()]);
689
688
 
690
689
  e->value = value;
691
- e->flags = 0;
690
+ e->m_flags = 0;
691
+ e->im_flags = 0;
692
692
  if (helper) {
693
+ // Use only one of the two parameters
694
+ assert(deleter == nullptr);
695
+ // value == nullptr is reserved for indicating failure for when secondary
696
+ // cache compatible
697
+ assert(value != nullptr);
693
698
  e->SetSecondaryCacheCompatible(true);
694
699
  e->info_.helper = helper;
695
700
  } else {
696
- #ifdef __SANITIZE_THREAD__
697
- e->is_secondary_cache_compatible_for_tsan = false;
698
- #endif // __SANITIZE_THREAD__
699
701
  e->info_.deleter = deleter;
700
702
  }
701
703
  e->key_length = key.size();
@@ -736,9 +738,7 @@ void LRUCacheShard::Erase(const Slice& key, uint32_t hash) {
736
738
  }
737
739
  }
738
740
 
739
- bool LRUCacheShard::IsReady(Cache::Handle* handle) {
740
- LRUHandle* e = reinterpret_cast<LRUHandle*>(handle);
741
- DMutexLock l(mutex_);
741
+ bool LRUCacheShard::IsReady(LRUHandle* e) {
742
742
  bool ready = true;
743
743
  if (e->IsPending()) {
744
744
  assert(secondary_cache_);
@@ -769,7 +769,7 @@ size_t LRUCacheShard::GetTableAddressCount() const {
769
769
  return size_t{1} << table_.GetLengthBits();
770
770
  }
771
771
 
772
- std::string LRUCacheShard::GetPrintableOptions() const {
772
+ void LRUCacheShard::AppendPrintableOptions(std::string& str) const {
773
773
  const int kBufferSize = 200;
774
774
  char buffer[kBufferSize];
775
775
  {
@@ -779,7 +779,7 @@ std::string LRUCacheShard::GetPrintableOptions() const {
779
779
  snprintf(buffer + strlen(buffer), kBufferSize - strlen(buffer),
780
780
  " low_pri_pool_ratio: %.3lf\n", low_pri_pool_ratio_);
781
781
  }
782
- return std::string(buffer);
782
+ str.append(buffer);
783
783
  }
784
784
 
785
785
  LRUCache::LRUCache(size_t capacity, int num_shard_bits,
@@ -788,51 +788,30 @@ LRUCache::LRUCache(size_t capacity, int num_shard_bits,
788
788
  std::shared_ptr<MemoryAllocator> allocator,
789
789
  bool use_adaptive_mutex,
790
790
  CacheMetadataChargePolicy metadata_charge_policy,
791
- const std::shared_ptr<SecondaryCache>& secondary_cache)
791
+ std::shared_ptr<SecondaryCache> _secondary_cache)
792
792
  : ShardedCache(capacity, num_shard_bits, strict_capacity_limit,
793
- std::move(allocator)) {
794
- num_shards_ = 1 << num_shard_bits;
795
- shards_ = reinterpret_cast<LRUCacheShard*>(
796
- port::cacheline_aligned_alloc(sizeof(LRUCacheShard) * num_shards_));
797
- size_t per_shard = (capacity + (num_shards_ - 1)) / num_shards_;
798
- for (int i = 0; i < num_shards_; i++) {
799
- new (&shards_[i]) LRUCacheShard(
793
+ std::move(allocator)),
794
+ secondary_cache_(std::move(_secondary_cache)) {
795
+ size_t per_shard = GetPerShardCapacity();
796
+ SecondaryCache* secondary_cache = secondary_cache_.get();
797
+ InitShards([=](LRUCacheShard* cs) {
798
+ new (cs) LRUCacheShard(
800
799
  per_shard, strict_capacity_limit, high_pri_pool_ratio,
801
800
  low_pri_pool_ratio, use_adaptive_mutex, metadata_charge_policy,
802
801
  /* max_upper_hash_bits */ 32 - num_shard_bits, secondary_cache);
803
- }
804
- secondary_cache_ = secondary_cache;
805
- }
806
-
807
- LRUCache::~LRUCache() {
808
- if (shards_ != nullptr) {
809
- assert(num_shards_ > 0);
810
- for (int i = 0; i < num_shards_; i++) {
811
- shards_[i].~LRUCacheShard();
812
- }
813
- port::cacheline_aligned_free(shards_);
814
- }
815
- }
816
-
817
- CacheShard* LRUCache::GetShard(uint32_t shard) {
818
- return reinterpret_cast<CacheShard*>(&shards_[shard]);
819
- }
820
-
821
- const CacheShard* LRUCache::GetShard(uint32_t shard) const {
822
- return reinterpret_cast<CacheShard*>(&shards_[shard]);
802
+ });
823
803
  }
824
804
 
825
805
  void* LRUCache::Value(Handle* handle) {
826
- return reinterpret_cast<const LRUHandle*>(handle)->value;
806
+ auto h = reinterpret_cast<const LRUHandle*>(handle);
807
+ assert(!h->IsPending() || h->value == nullptr);
808
+ assert(h->value != kDummyValueMarker);
809
+ return h->value;
827
810
  }
828
811
 
829
812
  size_t LRUCache::GetCharge(Handle* handle) const {
830
- CacheMetadataChargePolicy metadata_charge_policy = kDontChargeCacheMetadata;
831
- if (num_shards_ > 0) {
832
- metadata_charge_policy = shards_[0].metadata_charge_policy_;
833
- }
834
813
  return reinterpret_cast<const LRUHandle*>(handle)->GetCharge(
835
- metadata_charge_policy);
814
+ GetShard(0).metadata_charge_policy_);
836
815
  }
837
816
 
838
817
  Cache::DeleterFn LRUCache::GetDeleter(Handle* handle) const {
@@ -844,32 +823,12 @@ Cache::DeleterFn LRUCache::GetDeleter(Handle* handle) const {
844
823
  }
845
824
  }
846
825
 
847
- uint32_t LRUCache::GetHash(Handle* handle) const {
848
- return reinterpret_cast<const LRUHandle*>(handle)->hash;
849
- }
850
-
851
- void LRUCache::DisownData() {
852
- // Leak data only if that won't generate an ASAN/valgrind warning.
853
- if (!kMustFreeHeapAllocations) {
854
- shards_ = nullptr;
855
- num_shards_ = 0;
856
- }
857
- }
858
-
859
826
  size_t LRUCache::TEST_GetLRUSize() {
860
- size_t lru_size_of_all_shards = 0;
861
- for (int i = 0; i < num_shards_; i++) {
862
- lru_size_of_all_shards += shards_[i].TEST_GetLRUSize();
863
- }
864
- return lru_size_of_all_shards;
827
+ return SumOverShards([](LRUCacheShard& cs) { return cs.TEST_GetLRUSize(); });
865
828
  }
866
829
 
867
830
  double LRUCache::GetHighPriPoolRatio() {
868
- double result = 0.0;
869
- if (num_shards_ > 0) {
870
- result = shards_[0].GetHighPriPoolRatio();
871
- }
872
- return result;
831
+ return GetShard(0).GetHighPriPoolRatio();
873
832
  }
874
833
 
875
834
  void LRUCache::WaitAll(std::vector<Handle*>& handles) {
@@ -895,22 +854,17 @@ void LRUCache::WaitAll(std::vector<Handle*>& handles) {
895
854
  if (!lru_handle->IsPending()) {
896
855
  continue;
897
856
  }
898
- uint32_t hash = GetHash(handle);
899
- LRUCacheShard* shard = static_cast<LRUCacheShard*>(GetShard(Shard(hash)));
900
- shard->Promote(lru_handle);
857
+ GetShard(lru_handle->hash).Promote(lru_handle);
901
858
  }
902
859
  }
903
860
  }
904
861
 
905
- std::string LRUCache::GetPrintableOptions() const {
906
- std::string ret;
907
- ret.reserve(20000);
908
- ret.append(ShardedCache::GetPrintableOptions());
862
+ void LRUCache::AppendPrintableOptions(std::string& str) const {
863
+ ShardedCache::AppendPrintableOptions(str); // options from shard
909
864
  if (secondary_cache_) {
910
- ret.append(" secondary_cache:\n");
911
- ret.append(secondary_cache_->GetPrintableOptions());
865
+ str.append(" secondary_cache:\n");
866
+ str.append(secondary_cache_->GetPrintableOptions());
912
867
  }
913
- return ret;
914
868
  }
915
869
 
916
870
  } // namespace lru_cache