@nxtedition/rocksdb 15.4.1 → 16.0.0

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 (401) hide show
  1. package/binding.cc +70 -23
  2. package/deps/rocksdb/rocksdb/.clang-tidy +86 -0
  3. package/deps/rocksdb/rocksdb/BUCK +42 -0
  4. package/deps/rocksdb/rocksdb/CMakeLists.txt +11 -0
  5. package/deps/rocksdb/rocksdb/Makefile +59 -32
  6. package/deps/rocksdb/rocksdb/cache/cache.cc +0 -5
  7. package/deps/rocksdb/rocksdb/cache/cache_entry_stats.h +9 -9
  8. package/deps/rocksdb/rocksdb/cache/cache_key.cc +3 -3
  9. package/deps/rocksdb/rocksdb/cache/cache_key.h +5 -5
  10. package/deps/rocksdb/rocksdb/cache/cache_reservation_manager.h +16 -16
  11. package/deps/rocksdb/rocksdb/cache/cache_test.cc +1 -1
  12. package/deps/rocksdb/rocksdb/cache/clock_cache.cc +258 -294
  13. package/deps/rocksdb/rocksdb/cache/clock_cache.h +98 -49
  14. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +1 -5
  15. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +2 -3
  16. package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +18 -18
  17. package/deps/rocksdb/rocksdb/crash_test.mk +5 -1
  18. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.cc +23 -22
  19. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.h +6 -1
  20. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder_test.cc +14 -16
  21. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.cc +38 -26
  22. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.h +5 -1
  23. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader_test.cc +101 -18
  24. package/deps/rocksdb/rocksdb/db/blob/blob_index.h +12 -0
  25. package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +6 -9
  26. package/deps/rocksdb/rocksdb/db/builder.cc +23 -0
  27. package/deps/rocksdb/rocksdb/db/builder.h +7 -0
  28. package/deps/rocksdb/rocksdb/db/c.cc +373 -57
  29. package/deps/rocksdb/rocksdb/db/c_test.c +101 -1
  30. package/deps/rocksdb/rocksdb/db/column_family.cc +31 -3
  31. package/deps/rocksdb/rocksdb/db/column_family_test.cc +10 -13
  32. package/deps/rocksdb/rocksdb/db/compact_files_test.cc +35 -48
  33. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +13 -5
  34. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +201 -39
  35. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +15 -10
  36. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_stats_test.cc +7 -7
  37. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +2 -455
  38. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +4 -2
  39. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +19 -0
  40. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +72 -9
  41. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.h +12 -10
  42. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +405 -83
  43. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.h +25 -1
  44. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +23 -10
  45. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.h +1 -0
  46. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +1410 -106
  47. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +12 -5
  48. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.h +2 -1
  49. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_job.cc +19 -10
  50. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_test.cc +505 -45
  51. package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.cc +2 -2
  52. package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.h +9 -1
  53. package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +4 -4
  54. package/deps/rocksdb/rocksdb/db/comparator_db_test.cc +7 -9
  55. package/deps/rocksdb/rocksdb/db/convenience.cc +4 -4
  56. package/deps/rocksdb/rocksdb/db/convenience_impl.h +2 -1
  57. package/deps/rocksdb/rocksdb/db/corruption_test.cc +60 -88
  58. package/deps/rocksdb/rocksdb/db/cuckoo_table_db_test.cc +10 -12
  59. package/deps/rocksdb/rocksdb/db/db_basic_test.cc +471 -40
  60. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +116 -2
  61. package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +5 -15
  62. package/deps/rocksdb/rocksdb/db/db_compaction_abort_test.cc +993 -0
  63. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +329 -29
  64. package/deps/rocksdb/rocksdb/db/db_flush_test.cc +155 -13
  65. package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.cc +54 -31
  66. package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.h +1 -0
  67. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +232 -70
  68. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +57 -9
  69. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +224 -31
  70. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +5 -0
  71. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_experimental.cc +4 -2
  72. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +1 -1
  73. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_follower.cc +1 -0
  74. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +164 -8
  75. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +6 -0
  76. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.h +5 -0
  77. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +47 -35
  78. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.h +22 -9
  79. package/deps/rocksdb/rocksdb/db/db_iter.cc +9 -0
  80. package/deps/rocksdb/rocksdb/db/db_iterator_test.cc +371 -6
  81. package/deps/rocksdb/rocksdb/db/db_log_iter_test.cc +7 -5
  82. package/deps/rocksdb/rocksdb/db/db_logical_block_size_cache_test.cc +22 -23
  83. package/deps/rocksdb/rocksdb/db/db_memtable_test.cc +0 -2
  84. package/deps/rocksdb/rocksdb/db/db_merge_operator_test.cc +4 -4
  85. package/deps/rocksdb/rocksdb/db/db_options_test.cc +40 -0
  86. package/deps/rocksdb/rocksdb/db/db_properties_test.cc +32 -13
  87. package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +1 -1
  88. package/deps/rocksdb/rocksdb/db/db_readonly_with_timestamp_test.cc +4 -4
  89. package/deps/rocksdb/rocksdb/db/db_secondary_test.cc +68 -15
  90. package/deps/rocksdb/rocksdb/db/db_sst_test.cc +1 -1
  91. package/deps/rocksdb/rocksdb/db/db_statistics_test.cc +2 -3
  92. package/deps/rocksdb/rocksdb/db/db_table_properties_test.cc +6 -21
  93. package/deps/rocksdb/rocksdb/db/db_test.cc +644 -128
  94. package/deps/rocksdb/rocksdb/db/db_test2.cc +198 -81
  95. package/deps/rocksdb/rocksdb/db/db_test_util.cc +35 -10
  96. package/deps/rocksdb/rocksdb/db/db_test_util.h +8 -2
  97. package/deps/rocksdb/rocksdb/db/db_wal_test.cc +36 -32
  98. package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +11 -7
  99. package/deps/rocksdb/rocksdb/db/db_with_timestamp_compaction_test.cc +499 -0
  100. package/deps/rocksdb/rocksdb/db/db_write_buffer_manager_test.cc +284 -20
  101. package/deps/rocksdb/rocksdb/db/db_write_test.cc +3 -3
  102. package/deps/rocksdb/rocksdb/db/dbformat.h +0 -5
  103. package/deps/rocksdb/rocksdb/db/error_handler.cc +24 -0
  104. package/deps/rocksdb/rocksdb/db/error_handler_fs_test.cc +12 -14
  105. package/deps/rocksdb/rocksdb/db/experimental.cc +13 -10
  106. package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +1 -1
  107. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +22 -3
  108. package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +21 -15
  109. package/deps/rocksdb/rocksdb/db/fault_injection_test.cc +4 -6
  110. package/deps/rocksdb/rocksdb/db/flush_job.cc +11 -3
  111. package/deps/rocksdb/rocksdb/db/forward_iterator_bench.cc +5 -6
  112. package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +4 -2
  113. package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +17 -17
  114. package/deps/rocksdb/rocksdb/db/internal_stats.cc +13 -0
  115. package/deps/rocksdb/rocksdb/db/internal_stats.h +2 -0
  116. package/deps/rocksdb/rocksdb/db/listener_test.cc +154 -27
  117. package/deps/rocksdb/rocksdb/db/manual_compaction_test.cc +6 -6
  118. package/deps/rocksdb/rocksdb/db/memtable.cc +197 -51
  119. package/deps/rocksdb/rocksdb/db/memtable.h +6 -0
  120. package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +3 -4
  121. package/deps/rocksdb/rocksdb/db/merge_test.cc +37 -35
  122. package/deps/rocksdb/rocksdb/db/obsolete_files_test.cc +2 -1
  123. package/deps/rocksdb/rocksdb/db/options_file_test.cc +4 -4
  124. package/deps/rocksdb/rocksdb/db/perf_context_test.cc +9 -11
  125. package/deps/rocksdb/rocksdb/db/periodic_task_scheduler.cc +10 -1
  126. package/deps/rocksdb/rocksdb/db/periodic_task_scheduler_test.cc +292 -15
  127. package/deps/rocksdb/rocksdb/db/plain_table_db_test.cc +10 -17
  128. package/deps/rocksdb/rocksdb/db/prefix_test.cc +6 -8
  129. package/deps/rocksdb/rocksdb/db/repair.cc +10 -10
  130. package/deps/rocksdb/rocksdb/db/seqno_time_test.cc +5 -5
  131. package/deps/rocksdb/rocksdb/db/table_cache.cc +142 -135
  132. package/deps/rocksdb/rocksdb/db/table_cache.h +30 -6
  133. package/deps/rocksdb/rocksdb/db/table_cache_sync_and_async.h +7 -7
  134. package/deps/rocksdb/rocksdb/db/version_builder.cc +11 -50
  135. package/deps/rocksdb/rocksdb/db/version_builder.h +2 -1
  136. package/deps/rocksdb/rocksdb/db/version_builder_test.cc +2 -1
  137. package/deps/rocksdb/rocksdb/db/version_edit.cc +51 -2
  138. package/deps/rocksdb/rocksdb/db/version_edit.h +91 -29
  139. package/deps/rocksdb/rocksdb/db/version_edit_handler.h +7 -7
  140. package/deps/rocksdb/rocksdb/db/version_set.cc +211 -50
  141. package/deps/rocksdb/rocksdb/db/version_set.h +40 -3
  142. package/deps/rocksdb/rocksdb/db/version_set_sync_and_async.h +5 -0
  143. package/deps/rocksdb/rocksdb/db/version_set_test.cc +294 -21
  144. package/deps/rocksdb/rocksdb/db/version_util.cc +96 -0
  145. package/deps/rocksdb/rocksdb/db/version_util.h +24 -0
  146. package/deps/rocksdb/rocksdb/db/wide/db_wide_basic_test.cc +5 -5
  147. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.cc +647 -31
  148. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.h +219 -1
  149. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization_test.cc +549 -12
  150. package/deps/rocksdb/rocksdb/db/write_callback_test.cc +3 -3
  151. package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +1 -1
  152. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.cc +19 -0
  153. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +21 -4
  154. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_env_wrapper.h +32 -0
  155. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +74 -22
  156. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_listener.h +9 -0
  157. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +143 -61
  158. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +15 -2
  159. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +76 -2
  160. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +92 -72
  161. package/deps/rocksdb/rocksdb/env/env.cc +1 -0
  162. package/deps/rocksdb/rocksdb/env/env_test.cc +365 -2
  163. package/deps/rocksdb/rocksdb/env/fs_posix.cc +31 -30
  164. package/deps/rocksdb/rocksdb/env/io_posix.cc +8 -11
  165. package/deps/rocksdb/rocksdb/env/io_posix.h +30 -1
  166. package/deps/rocksdb/rocksdb/env/io_posix_test.cc +43 -0
  167. package/deps/rocksdb/rocksdb/file/delete_scheduler.cc +1 -1
  168. package/deps/rocksdb/rocksdb/file/delete_scheduler_test.cc +108 -0
  169. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +32 -4
  170. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +4 -4
  171. package/deps/rocksdb/rocksdb/file/file_util.cc +8 -2
  172. package/deps/rocksdb/rocksdb/file/file_util.h +2 -1
  173. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +331 -12
  174. package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +52 -35
  175. package/deps/rocksdb/rocksdb/folly.mk +22 -5
  176. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_cache.h +1 -1
  177. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_compression.h +100 -54
  178. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +67 -2
  179. package/deps/rocksdb/rocksdb/include/rocksdb/c.h +149 -13
  180. package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +1 -12
  181. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +78 -97
  182. package/deps/rocksdb/rocksdb/include/rocksdb/experimental.h +3 -3
  183. package/deps/rocksdb/rocksdb/include/rocksdb/external_table.h +2 -2
  184. package/deps/rocksdb/rocksdb/include/rocksdb/file_checksum.h +5 -0
  185. package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +17 -2
  186. package/deps/rocksdb/rocksdb/include/rocksdb/functor_wrapper.h +1 -1
  187. package/deps/rocksdb/rocksdb/include/rocksdb/io_dispatcher.h +358 -0
  188. package/deps/rocksdb/rocksdb/include/rocksdb/iostats_context.h +13 -0
  189. package/deps/rocksdb/rocksdb/include/rocksdb/listener.h +43 -0
  190. package/deps/rocksdb/rocksdb/include/rocksdb/memtablerep.h +20 -0
  191. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +63 -21
  192. package/deps/rocksdb/rocksdb/include/rocksdb/perf_context.h +10 -1
  193. package/deps/rocksdb/rocksdb/include/rocksdb/rate_limiter.h +1 -1
  194. package/deps/rocksdb/rocksdb/include/rocksdb/slice_transform.h +2 -7
  195. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_reader.h +13 -0
  196. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_writer.h +3 -14
  197. package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +49 -9
  198. package/deps/rocksdb/rocksdb/include/rocksdb/status.h +8 -0
  199. package/deps/rocksdb/rocksdb/include/rocksdb/table.h +77 -6
  200. package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +15 -0
  201. package/deps/rocksdb/rocksdb/include/rocksdb/tool_hooks.h +16 -10
  202. package/deps/rocksdb/rocksdb/include/rocksdb/unique_id.h +5 -5
  203. package/deps/rocksdb/rocksdb/include/rocksdb/universal_compaction.h +2 -4
  204. package/deps/rocksdb/rocksdb/include/rocksdb/user_defined_index.h +106 -46
  205. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/db_ttl.h +1 -1
  206. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd.h +14 -1
  207. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/memory_util.h +5 -1
  208. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/optimistic_transaction_db.h +2 -1
  209. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/stackable_db.h +7 -9
  210. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +2 -2
  211. package/deps/rocksdb/rocksdb/logging/auto_roll_logger_test.cc +1 -2
  212. package/deps/rocksdb/rocksdb/memory/memory_allocator_test.cc +2 -2
  213. package/deps/rocksdb/rocksdb/memtable/inlineskiplist.h +226 -8
  214. package/deps/rocksdb/rocksdb/memtable/inlineskiplist_test.cc +490 -0
  215. package/deps/rocksdb/rocksdb/memtable/skiplist.h +3 -3
  216. package/deps/rocksdb/rocksdb/memtable/skiplistrep.cc +11 -0
  217. package/deps/rocksdb/rocksdb/microbench/db_basic_bench.cc +4 -12
  218. package/deps/rocksdb/rocksdb/microbench/ribbon_bench.cc +5 -5
  219. package/deps/rocksdb/rocksdb/monitoring/file_read_sample.h +21 -4
  220. package/deps/rocksdb/rocksdb/monitoring/perf_context.cc +9 -3
  221. package/deps/rocksdb/rocksdb/monitoring/statistics.cc +21 -2
  222. package/deps/rocksdb/rocksdb/monitoring/stats_history_test.cc +2 -2
  223. package/deps/rocksdb/rocksdb/options/cf_options.cc +21 -1
  224. package/deps/rocksdb/rocksdb/options/cf_options.h +2 -0
  225. package/deps/rocksdb/rocksdb/options/customizable_test.cc +0 -2
  226. package/deps/rocksdb/rocksdb/options/db_options.cc +26 -5
  227. package/deps/rocksdb/rocksdb/options/db_options.h +3 -1
  228. package/deps/rocksdb/rocksdb/options/options.cc +5 -1
  229. package/deps/rocksdb/rocksdb/options/options_helper.cc +7 -2
  230. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +109 -103
  231. package/deps/rocksdb/rocksdb/options/options_test.cc +14 -0
  232. package/deps/rocksdb/rocksdb/port/jemalloc_helper.h +15 -17
  233. package/deps/rocksdb/rocksdb/port/lang.h +4 -0
  234. package/deps/rocksdb/rocksdb/port/port_example.h +0 -23
  235. package/deps/rocksdb/rocksdb/port/stack_trace.cc +36 -0
  236. package/deps/rocksdb/rocksdb/port/stack_trace.h +9 -0
  237. package/deps/rocksdb/rocksdb/src.mk +12 -0
  238. package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.cc +1 -2
  239. package/deps/rocksdb/rocksdb/table/block_based/binary_search_index_reader.cc +2 -1
  240. package/deps/rocksdb/rocksdb/table/block_based/block.cc +571 -292
  241. package/deps/rocksdb/rocksdb/table/block_based/block.h +143 -53
  242. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +154 -90
  243. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.h +5 -1
  244. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +51 -14
  245. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.h +0 -2
  246. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.cc +147 -734
  247. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.h +30 -233
  248. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +178 -108
  249. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +13 -0
  250. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_impl.h +17 -4
  251. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +5 -2
  252. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +70 -0
  253. package/deps/rocksdb/rocksdb/table/block_based/block_builder.cc +168 -24
  254. package/deps/rocksdb/rocksdb/table/block_based/block_builder.h +25 -9
  255. package/deps/rocksdb/rocksdb/table/block_based/block_cache.cc +7 -4
  256. package/deps/rocksdb/rocksdb/table/block_based/block_cache.h +9 -2
  257. package/deps/rocksdb/rocksdb/table/block_based/block_test.cc +548 -169
  258. package/deps/rocksdb/rocksdb/table/block_based/block_type.h +30 -0
  259. package/deps/rocksdb/rocksdb/table/block_based/block_util.h +156 -0
  260. package/deps/rocksdb/rocksdb/table/block_based/data_block_footer.cc +73 -30
  261. package/deps/rocksdb/rocksdb/table/block_based/data_block_footer.h +74 -7
  262. package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index.h +1 -1
  263. package/deps/rocksdb/rocksdb/table/block_based/index_builder.cc +20 -14
  264. package/deps/rocksdb/rocksdb/table/block_based/index_builder.h +22 -12
  265. package/deps/rocksdb/rocksdb/table/block_based/mock_block_based_table.h +1 -1
  266. package/deps/rocksdb/rocksdb/table/block_based/multi_scan_index_iterator.cc +332 -0
  267. package/deps/rocksdb/rocksdb/table/block_based/multi_scan_index_iterator.h +133 -0
  268. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +4 -2
  269. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +1 -1
  270. package/deps/rocksdb/rocksdb/table/block_based/reader_common.cc +3 -2
  271. package/deps/rocksdb/rocksdb/table/block_based/reader_common.h +4 -1
  272. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.h +0 -1
  273. package/deps/rocksdb/rocksdb/table/block_based/user_defined_index_wrapper.h +126 -46
  274. package/deps/rocksdb/rocksdb/table/block_fetcher.cc +31 -3
  275. package/deps/rocksdb/rocksdb/table/block_fetcher_test.cc +1 -2
  276. package/deps/rocksdb/rocksdb/table/cleanable_test.cc +3 -1
  277. package/deps/rocksdb/rocksdb/table/external_table.cc +25 -4
  278. package/deps/rocksdb/rocksdb/table/format.cc +27 -15
  279. package/deps/rocksdb/rocksdb/table/format.h +41 -15
  280. package/deps/rocksdb/rocksdb/table/merging_iterator.cc +1 -0
  281. package/deps/rocksdb/rocksdb/table/meta_blocks.cc +22 -12
  282. package/deps/rocksdb/rocksdb/table/meta_blocks.h +0 -1
  283. package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +7 -21
  284. package/deps/rocksdb/rocksdb/table/sst_file_dumper.h +0 -1
  285. package/deps/rocksdb/rocksdb/table/sst_file_reader.cc +88 -13
  286. package/deps/rocksdb/rocksdb/table/sst_file_reader_test.cc +53 -42
  287. package/deps/rocksdb/rocksdb/table/sst_file_writer.cc +3 -12
  288. package/deps/rocksdb/rocksdb/table/table_builder.h +0 -4
  289. package/deps/rocksdb/rocksdb/table/table_properties.cc +18 -0
  290. package/deps/rocksdb/rocksdb/table/table_reader_bench.cc +2 -3
  291. package/deps/rocksdb/rocksdb/table/table_test.cc +848 -172
  292. package/deps/rocksdb/rocksdb/table/unique_id.cc +24 -20
  293. package/deps/rocksdb/rocksdb/table/unique_id_impl.h +8 -8
  294. package/deps/rocksdb/rocksdb/test_util/sync_point.h +5 -4
  295. package/deps/rocksdb/rocksdb/test_util/testutil.cc +2 -1
  296. package/deps/rocksdb/rocksdb/test_util/testutil.h +2 -2
  297. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_test.cc +2 -1
  298. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +238 -120
  299. package/deps/rocksdb/rocksdb/tools/db_repl_stress.cc +2 -2
  300. package/deps/rocksdb/rocksdb/tools/db_sanity_test.cc +2 -4
  301. package/deps/rocksdb/rocksdb/tools/dump/db_dump_tool.cc +4 -8
  302. package/deps/rocksdb/rocksdb/tools/dump/rocksdb_undump.cc +1 -1
  303. package/deps/rocksdb/rocksdb/tools/io_tracer_parser_test.cc +2 -3
  304. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +82 -20
  305. package/deps/rocksdb/rocksdb/tools/ldb_cmd_test.cc +41 -47
  306. package/deps/rocksdb/rocksdb/tools/ldb_tool.cc +9 -0
  307. package/deps/rocksdb/rocksdb/tools/reduce_levels_test.cc +5 -6
  308. package/deps/rocksdb/rocksdb/tools/sst_dump_tool.cc +1 -1
  309. package/deps/rocksdb/rocksdb/tools/tool_hooks.cc +6 -5
  310. package/deps/rocksdb/rocksdb/tools/trace_analyzer_test.cc +4 -4
  311. package/deps/rocksdb/rocksdb/tools/write_stress.cc +1 -3
  312. package/deps/rocksdb/rocksdb/util/atomic.h +30 -23
  313. package/deps/rocksdb/rocksdb/util/auto_tune_compressor.cc +6 -7
  314. package/deps/rocksdb/rocksdb/util/auto_tune_compressor.h +3 -3
  315. package/deps/rocksdb/rocksdb/util/bit_fields.h +68 -46
  316. package/deps/rocksdb/rocksdb/util/bloom_impl.h +16 -16
  317. package/deps/rocksdb/rocksdb/util/coding.h +14 -27
  318. package/deps/rocksdb/rocksdb/util/compression.cc +365 -207
  319. package/deps/rocksdb/rocksdb/util/compression.h +16 -1298
  320. package/deps/rocksdb/rocksdb/util/compression_test.cc +347 -61
  321. package/deps/rocksdb/rocksdb/util/crc32c_arm64.cc +8 -9
  322. package/deps/rocksdb/rocksdb/util/crc32c_arm64.h +1 -1
  323. package/deps/rocksdb/rocksdb/util/crc32c_ppc.h +1 -1
  324. package/deps/rocksdb/rocksdb/util/dynamic_bloom_test.cc +3 -3
  325. package/deps/rocksdb/rocksdb/util/filter_bench.cc +18 -18
  326. package/deps/rocksdb/rocksdb/util/gflags_compat.h +3 -3
  327. package/deps/rocksdb/rocksdb/util/hash_test.cc +19 -7
  328. package/deps/rocksdb/rocksdb/util/io_dispatcher_imp.cc +1099 -0
  329. package/deps/rocksdb/rocksdb/util/io_dispatcher_imp.h +36 -0
  330. package/deps/rocksdb/rocksdb/util/io_dispatcher_test.cc +1919 -0
  331. package/deps/rocksdb/rocksdb/util/math.h +3 -1
  332. package/deps/rocksdb/rocksdb/util/mutexlock.h +19 -19
  333. package/deps/rocksdb/rocksdb/util/ribbon_alg.h +25 -25
  334. package/deps/rocksdb/rocksdb/util/simple_mixed_compressor.cc +5 -7
  335. package/deps/rocksdb/rocksdb/util/simple_mixed_compressor.h +4 -5
  336. package/deps/rocksdb/rocksdb/util/slice.cc +0 -10
  337. package/deps/rocksdb/rocksdb/util/slice_test.cc +35 -1
  338. package/deps/rocksdb/rocksdb/util/slice_transform_test.cc +5 -7
  339. package/deps/rocksdb/rocksdb/util/status.cc +3 -1
  340. package/deps/rocksdb/rocksdb/util/stop_watch.h +2 -0
  341. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +4 -1
  342. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +123 -78
  343. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_compaction_filter.cc +12 -93
  344. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_compaction_filter.h +1 -4
  345. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db.cc +0 -21
  346. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db.h +6 -48
  347. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.cc +94 -307
  348. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.h +12 -58
  349. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl_filesnapshot.cc +2 -8
  350. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_listener.h +2 -3
  351. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_test.cc +205 -811
  352. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.cc +18 -9
  353. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_file.cc +2 -7
  354. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_file.h +1 -9
  355. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_functional_test.cc +17 -11
  356. package/deps/rocksdb/rocksdb/utilities/cassandra/test_utils.cc +1 -1
  357. package/deps/rocksdb/rocksdb/utilities/cassandra/test_utils.h +1 -1
  358. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_impl.cc +1 -1
  359. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_test.cc +68 -61
  360. package/deps/rocksdb/rocksdb/utilities/debug.cc +2 -1
  361. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +105 -59
  362. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +274 -7
  363. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs_test.cc +94 -0
  364. package/deps/rocksdb/rocksdb/utilities/memory/memory_test.cc +13 -17
  365. package/deps/rocksdb/rocksdb/utilities/memory/memory_util.cc +16 -3
  366. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend_test.cc +25 -25
  367. package/deps/rocksdb/rocksdb/utilities/object_registry.cc +40 -40
  368. package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration.cc +2 -5
  369. package/deps/rocksdb/rocksdb/utilities/options/options_util_test.cc +17 -19
  370. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.cc +2 -2
  371. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.h +2 -2
  372. package/deps/rocksdb/rocksdb/utilities/persistent_cache/volatile_tier_impl.cc +1 -1
  373. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_db_impl.cc +2 -2
  374. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_db_impl.h +4 -13
  375. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +3 -3
  376. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.h +6 -0
  377. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_transaction_seqno_test.cc +431 -0
  378. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_transaction_test.cc +1 -2
  379. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.h +91 -0
  380. package/deps/rocksdb/rocksdb/utilities/trie_index/bitvector.cc +562 -0
  381. package/deps/rocksdb/rocksdb/utilities/trie_index/bitvector.h +615 -0
  382. package/deps/rocksdb/rocksdb/utilities/trie_index/louds_trie.cc +2575 -0
  383. package/deps/rocksdb/rocksdb/utilities/trie_index/louds_trie.h +685 -0
  384. package/deps/rocksdb/rocksdb/utilities/trie_index/trie_index_db_test.cc +2843 -0
  385. package/deps/rocksdb/rocksdb/utilities/trie_index/trie_index_factory.cc +567 -0
  386. package/deps/rocksdb/rocksdb/utilities/trie_index/trie_index_factory.h +275 -0
  387. package/deps/rocksdb/rocksdb/utilities/trie_index/trie_index_test.cc +5183 -0
  388. package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.cc +4 -3
  389. package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.h +1 -1
  390. package/deps/rocksdb/rocksdb/utilities/ttl/ttl_test.cc +2 -2
  391. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.h +3 -3
  392. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +93 -88
  393. package/deps/rocksdb/rocksdb.gyp +7 -0
  394. package/index.js +70 -10
  395. package/iterator.js +25 -3
  396. package/max_rev_operator.h +9 -5
  397. package/package.json +1 -1
  398. package/prebuilds/darwin-arm64/@nxtedition+rocksdb.node +0 -0
  399. package/prebuilds/linux-x64/@nxtedition+rocksdb.node +0 -0
  400. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/lua/rocks_lua_custom_library.h +0 -43
  401. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/lua/rocks_lua_util.h +0 -55
@@ -669,7 +669,7 @@ TEST_P(PrefetchTest, ConfigureAutoMaxReadaheadSize) {
669
669
  MoveFilesToLevel(level);
670
670
  }
671
671
  Close();
672
- std::vector<int> buff_prefectch_level_count = {0, 0, 0};
672
+ std::vector<int> buff_prefetch_level_count = {0, 0, 0};
673
673
  ASSERT_OK(TryReopen(options));
674
674
  {
675
675
  auto iter = std::unique_ptr<Iterator>(db_->NewIterator(ReadOptions()));
@@ -707,7 +707,7 @@ TEST_P(PrefetchTest, ConfigureAutoMaxReadaheadSize) {
707
707
  iter->Next();
708
708
  }
709
709
 
710
- buff_prefectch_level_count[level] = buff_prefetch_count;
710
+ buff_prefetch_level_count[level] = buff_prefetch_count;
711
711
  if (support_prefetch && !use_direct_io) {
712
712
  if (level == 0) {
713
713
  ASSERT_FALSE(fs->IsPrefetchCalled());
@@ -728,7 +728,7 @@ TEST_P(PrefetchTest, ConfigureAutoMaxReadaheadSize) {
728
728
  }
729
729
 
730
730
  if (!support_prefetch) {
731
- ASSERT_GT(buff_prefectch_level_count[1], buff_prefectch_level_count[2]);
731
+ ASSERT_GT(buff_prefetch_level_count[1], buff_prefetch_level_count[2]);
732
732
  }
733
733
 
734
734
  SyncPoint::GetInstance()->DisableProcessing();
@@ -814,7 +814,7 @@ TEST_P(PrefetchTest, ConfigureInternalAutoReadaheadSize) {
814
814
  "{initial_auto_readahead_size=0;}"}}));
815
815
  break;
816
816
  case 1:
817
- // intial_auto_readahead_size and max_auto_readahead_size are set
817
+ // initial_auto_readahead_size and max_auto_readahead_size are set
818
818
  // same so readahead_size remains same.
819
819
  ASSERT_OK(db_->SetOptions({{"block_based_table_factory",
820
820
  "{initial_auto_readahead_size=4096;max_"
@@ -1081,7 +1081,7 @@ TEST_P(PrefetchTest, PrefetchWhenReseek) {
1081
1081
  }
1082
1082
  {
1083
1083
  /*
1084
- * Reesek keys from Single Data Block.
1084
+ * Reseek keys from Single Data Block.
1085
1085
  */
1086
1086
  auto iter = std::unique_ptr<Iterator>(db_->NewIterator(ReadOptions()));
1087
1087
  iter->Seek(BuildKey(0));
@@ -1116,9 +1116,8 @@ TEST_P(PrefetchTest, PrefetchWhenReseek) {
1116
1116
  ASSERT_TRUE(iter->Valid());
1117
1117
  iter->Seek(BuildKey(1008));
1118
1118
  ASSERT_TRUE(iter->Valid());
1119
- iter->Seek(
1120
- BuildKey(996)); // Reseek won't prefetch any data and
1121
- // readahead_size will be initiallized to 8*1024.
1119
+ iter->Seek(BuildKey(996)); // Reseek won't prefetch any data and
1120
+ // readahead_size will be initialized to 8*1024.
1122
1121
  ASSERT_TRUE(iter->Valid());
1123
1122
  iter->Seek(BuildKey(992));
1124
1123
  ASSERT_TRUE(iter->Valid());
@@ -1590,7 +1589,7 @@ INSTANTIATE_TEST_CASE_P(
1590
1589
  ::testing::Combine(
1591
1590
  // Params are as follows -
1592
1591
  // Param 0 - TableOptions::index_shortening
1593
- // Param 2 - ReadOptinos::auto_readahead_size
1592
+ // Param 2 - ReadOptions::auto_readahead_size
1594
1593
  ::testing::Values(
1595
1594
  BlockBasedTableOptions::IndexShorteningMode::kNoShortening,
1596
1595
  BlockBasedTableOptions::IndexShorteningMode::kShortenSeparators,
@@ -2518,6 +2517,187 @@ TEST_P(PrefetchTest1, SeekParallelizationTest) {
2518
2517
  Close();
2519
2518
  }
2520
2519
 
2520
+ TEST_P(PrefetchTest1, PollErrorRecoveryDuringIteration) {
2521
+ // This end-to-end test verifies that Poll() errors during async prefetching
2522
+ // are properly propagated to the iterator. When Poll() fails, the iterator
2523
+ // should stop and return an IOError status.
2524
+ //
2525
+ // With error injection on the 3rd Poll call, the iterator reads ~231 keys
2526
+ // (out of 500) before encountering the error.
2527
+
2528
+ if (mem_env_ || encrypted_env_) {
2529
+ ROCKSDB_GTEST_SKIP("Test requires non-mem or non-encrypted environment");
2530
+ return;
2531
+ }
2532
+
2533
+ const int kNumKeys = 500;
2534
+ std::shared_ptr<MockFS> fs = std::make_shared<MockFS>(
2535
+ FileSystem::Default(), /*support_prefetch=*/false);
2536
+ std::unique_ptr<Env> env(new CompositeEnvWrapper(env_, fs));
2537
+
2538
+ bool use_direct_io = GetParam();
2539
+ Options options;
2540
+ SetGenericOptions(env.get(), use_direct_io, options);
2541
+ options.statistics = CreateDBStatistics();
2542
+ BlockBasedTableOptions table_options;
2543
+ SetBlockBasedTableOptions(table_options);
2544
+ options.table_factory.reset(NewBlockBasedTableFactory(table_options));
2545
+
2546
+ Status s = TryReopen(options);
2547
+ if (use_direct_io && (s.IsNotSupported() || s.IsInvalidArgument())) {
2548
+ ROCKSDB_GTEST_SKIP("Direct IO not supported");
2549
+ return;
2550
+ }
2551
+ ASSERT_OK(s);
2552
+
2553
+ // Write keys with known values so we can verify correctness
2554
+ std::map<std::string, std::string> expected_data;
2555
+ {
2556
+ WriteBatch batch;
2557
+ for (int i = 0; i < kNumKeys; i++) {
2558
+ std::string key = BuildKey(i);
2559
+ std::string value = "value_" + std::to_string(i) + "_" +
2560
+ std::string(100, 'x'); // Make values ~110 bytes
2561
+ ASSERT_OK(batch.Put(key, value));
2562
+ expected_data[key] = value;
2563
+ }
2564
+ ASSERT_OK(db_->Write(WriteOptions(), &batch));
2565
+ ASSERT_OK(Flush());
2566
+ }
2567
+
2568
+ std::string start_key = BuildKey(0);
2569
+ std::string end_key = BuildKey(kNumKeys - 1);
2570
+ Slice least(start_key.data(), start_key.size());
2571
+ Slice greatest(end_key.data(), end_key.size());
2572
+ ASSERT_OK(db_->CompactRange(CompactRangeOptions(), &least, &greatest));
2573
+
2574
+ // Set up callbacks to track async IO and inject Poll errors
2575
+ std::atomic<int> poll_call_count{0};
2576
+ std::atomic<int> poll_error_injected_count{0};
2577
+ bool read_async_called = false;
2578
+
2579
+ SyncPoint::GetInstance()->SetCallBack(
2580
+ "FilePrefetchBuffer::PollIfNeeded:IOStatus", [&](void* arg) {
2581
+ poll_call_count++;
2582
+ int current_count = poll_call_count.load();
2583
+
2584
+ // Inject error on the third Poll call to allow some keys to be read
2585
+ // first
2586
+ if (current_count == 3) {
2587
+ IOStatus* io_s = static_cast<IOStatus*>(arg);
2588
+ *io_s = IOStatus::IOError("Injected Poll error for e2e testing");
2589
+ poll_error_injected_count++;
2590
+ std::cout << "PollErrorRecoveryDuringIteration: Injected error on "
2591
+ "Poll call #"
2592
+ << current_count << std::endl;
2593
+ }
2594
+ });
2595
+
2596
+ SyncPoint::GetInstance()->SetCallBack(
2597
+ "UpdateResults::io_uring_result",
2598
+ [&](void* /*arg*/) { read_async_called = true; });
2599
+
2600
+ SyncPoint::GetInstance()->EnableProcessing();
2601
+
2602
+ // Iterate through all keys with async IO enabled
2603
+ ReadOptions ro;
2604
+ ro.async_io = true;
2605
+ ro.adaptive_readahead = true;
2606
+
2607
+ int keys_read = 0;
2608
+ int data_mismatches = 0;
2609
+ Status iter_status;
2610
+ {
2611
+ auto iter = std::unique_ptr<Iterator>(db_->NewIterator(ro));
2612
+ for (iter->SeekToFirst(); iter->Valid(); iter->Next()) {
2613
+ std::string key = iter->key().ToString();
2614
+ std::string value = iter->value().ToString();
2615
+
2616
+ auto it = expected_data.find(key);
2617
+ if (it == expected_data.end()) {
2618
+ std::cout << "PollErrorRecoveryDuringIteration: Unexpected key: " << key
2619
+ << std::endl;
2620
+ data_mismatches++;
2621
+ } else if (it->second != value) {
2622
+ std::cout << "PollErrorRecoveryDuringIteration: Value mismatch for key "
2623
+ << key << std::endl;
2624
+ data_mismatches++;
2625
+ }
2626
+ keys_read++;
2627
+ }
2628
+ iter_status = iter->status();
2629
+ }
2630
+
2631
+ SyncPoint::GetInstance()->DisableProcessing();
2632
+ SyncPoint::GetInstance()->ClearAllCallBacks();
2633
+
2634
+ // Log results
2635
+ std::cout << "PollErrorRecoveryDuringIteration: " << "read_async_called="
2636
+ << read_async_called << ", poll_calls=" << poll_call_count.load()
2637
+ << ", poll_errors_injected=" << poll_error_injected_count.load()
2638
+ << ", keys_read=" << keys_read << ", expected_keys=" << kNumKeys
2639
+ << ", data_mismatches=" << data_mismatches
2640
+ << ", iter_status=" << iter_status.ToString() << std::endl;
2641
+
2642
+ // Verify no data mismatches occurred for keys that were read
2643
+ ASSERT_EQ(data_mismatches, 0)
2644
+ << "Found " << data_mismatches << " data mismatches";
2645
+
2646
+ if (read_async_called) {
2647
+ // Async IO was used - verify Poll error was injected and propagated
2648
+ ASSERT_EQ(poll_call_count.load(), 3)
2649
+ << "Expected exactly 3 Poll calls when error injected on 3rd call";
2650
+ ASSERT_EQ(poll_error_injected_count.load(), 1)
2651
+ << "Expected exactly 1 Poll error to be injected";
2652
+
2653
+ // The iterator should have stopped with an error status
2654
+ ASSERT_TRUE(iter_status.IsIOError())
2655
+ << "Expected iterator to report IOError after Poll failure, got: "
2656
+ << iter_status.ToString();
2657
+
2658
+ std::cout << "PollErrorRecoveryDuringIteration: Successfully verified "
2659
+ "Poll error was injected and propagated to iterator"
2660
+ << std::endl;
2661
+ } else {
2662
+ // Async IO not supported - iterator should complete successfully
2663
+ ASSERT_OK(iter_status);
2664
+ ASSERT_EQ(keys_read, kNumKeys);
2665
+ std::cout << "PollErrorRecoveryDuringIteration: Async IO (io_uring) not "
2666
+ "supported on this platform, verified data correctness"
2667
+ << std::endl;
2668
+ }
2669
+
2670
+ // Retry iteration without error injection - verify all data is still readable
2671
+ // This confirms the Poll error didn't corrupt state
2672
+ {
2673
+ int retry_keys_read = 0;
2674
+ int retry_data_mismatches = 0;
2675
+ auto iter = std::unique_ptr<Iterator>(db_->NewIterator(ro));
2676
+ for (iter->SeekToFirst(); iter->Valid(); iter->Next()) {
2677
+ std::string key = iter->key().ToString();
2678
+ std::string value = iter->value().ToString();
2679
+
2680
+ auto it = expected_data.find(key);
2681
+ if (it == expected_data.end()) {
2682
+ retry_data_mismatches++;
2683
+ } else if (it->second != value) {
2684
+ retry_data_mismatches++;
2685
+ }
2686
+ retry_keys_read++;
2687
+ }
2688
+ ASSERT_OK(iter->status())
2689
+ << "Retry iteration failed: " << iter->status().ToString();
2690
+ ASSERT_EQ(retry_keys_read, kNumKeys)
2691
+ << "Retry should read all " << kNumKeys << " keys";
2692
+ ASSERT_EQ(retry_data_mismatches, 0)
2693
+ << "Retry found " << retry_data_mismatches << " data mismatches";
2694
+ std::cout << "PollErrorRecoveryDuringIteration: Retry succeeded, read all "
2695
+ << retry_keys_read << " keys correctly" << std::endl;
2696
+ }
2697
+
2698
+ Close();
2699
+ }
2700
+
2521
2701
  namespace {
2522
2702
  #ifdef GFLAGS
2523
2703
  const int kMaxArgCount = 100;
@@ -3041,7 +3221,11 @@ class FilePrefetchBufferTest : public testing::Test {
3041
3221
  stats_ = CreateDBStatistics();
3042
3222
  }
3043
3223
 
3044
- void TearDown() override { EXPECT_OK(DestroyDir(env_, test_dir_)); }
3224
+ void TearDown() override {
3225
+ SyncPoint::GetInstance()->DisableProcessing();
3226
+ SyncPoint::GetInstance()->ClearAllCallBacks();
3227
+ EXPECT_OK(DestroyDir(env_, test_dir_));
3228
+ }
3045
3229
 
3046
3230
  void Write(const std::string& fname, const std::string& content) {
3047
3231
  std::unique_ptr<FSWritableFile> f;
@@ -3303,7 +3487,7 @@ TEST_F(FilePrefetchBufferTest, SyncReadaheadStats) {
3303
3487
  ASSERT_EQ(stats->getAndResetTickerCount(PREFETCH_HITS), 1);
3304
3488
  ASSERT_EQ(stats->getAndResetTickerCount(PREFETCH_BYTES_USEFUL), 8192);
3305
3489
 
3306
- // Now read some data with length doesn't align with aligment and it needs
3490
+ // Now read some data with length doesn't align with alignment and it needs
3307
3491
  // prefetching. Read from 16000 with length 10000 (i.e. requested end offset -
3308
3492
  // 26000).
3309
3493
  ASSERT_TRUE(
@@ -3377,6 +3561,118 @@ TEST_F(FilePrefetchBufferTest, ForCompaction) {
3377
3561
  0);
3378
3562
  }
3379
3563
 
3564
+ TEST_F(FilePrefetchBufferTest, PollErrorPropagation) {
3565
+ // This test verifies that Poll() errors in PollIfNeeded are properly
3566
+ // propagated rather than being silently ignored.
3567
+
3568
+ std::string fname = "poll-error-test";
3569
+ Random rand(0);
3570
+ std::string content = rand.RandomString(32768);
3571
+ Write(fname, content);
3572
+
3573
+ FileOptions opts;
3574
+ std::unique_ptr<RandomAccessFileReader> r;
3575
+ Read(fname, opts, &r);
3576
+
3577
+ // Set up readahead params for async prefetching
3578
+ ReadaheadParams readahead_params;
3579
+ readahead_params.initial_readahead_size = 16384;
3580
+ readahead_params.max_readahead_size = 16384;
3581
+
3582
+ FilePrefetchBuffer fpb(readahead_params, /*enable=*/true,
3583
+ /*track_min_offset=*/false, fs());
3584
+
3585
+ Slice result;
3586
+ // Start an async prefetch to set up async_read_in_progress_ state
3587
+ Status s = fpb.PrefetchAsync(IOOptions(), r.get(), 0, 4096, &result);
3588
+
3589
+ // Skip test on platforms that don't support async IO.
3590
+ if (s.IsNotSupported()) {
3591
+ ROCKSDB_GTEST_SKIP("Async IO not supported on this platform");
3592
+ return;
3593
+ }
3594
+ ASSERT_TRUE(s.IsTryAgain());
3595
+
3596
+ // With the ReadAsync sync fallback, PrefetchAsync returns TryAgain even when
3597
+ // async IO is unavailable (data is read synchronously, but data_found was
3598
+ // false at entry). Detect by checking async_read_in_progress_ on the buffer.
3599
+ {
3600
+ std::vector<std::tuple<uint64_t, size_t, bool>> buf_info(1);
3601
+ fpb.TEST_GetBufferOffsetandSize(buf_info);
3602
+ bool async_read_in_progress = std::get<2>(buf_info[0]);
3603
+ if (!async_read_in_progress) {
3604
+ ROCKSDB_GTEST_SKIP("Async IO not available (sync fallback used)");
3605
+ return;
3606
+ }
3607
+ }
3608
+
3609
+ // Set up SyncPoint to inject Poll error
3610
+ SyncPoint::GetInstance()->SetCallBack(
3611
+ "FilePrefetchBuffer::PollIfNeeded:IOStatus", [&](void* arg) {
3612
+ IOStatus* io_s = static_cast<IOStatus*>(arg);
3613
+ *io_s = IOStatus::IOError("Injected Poll error for testing");
3614
+ });
3615
+ SyncPoint::GetInstance()->EnableProcessing();
3616
+
3617
+ // TryReadFromCache will call PollIfNeeded to complete the async read
3618
+ IOOptions io_opts;
3619
+ io_opts.rate_limiter_priority = Env::IOPriority::IO_LOW;
3620
+ Status read_status;
3621
+ bool found =
3622
+ fpb.TryReadFromCache(io_opts, r.get(), 0, 4096, &result, &read_status);
3623
+
3624
+ // When PollIfNeeded fails:
3625
+ // 1. PrefetchInternal returns the error status
3626
+ // 2. TryReadFromCacheUntracked sets *status to the error and returns false
3627
+ // Therefore: found should be false, and read_status should contain the error
3628
+ ASSERT_FALSE(found) << "Expected TryReadFromCache to return false on Poll "
3629
+ "error, but it returned true";
3630
+ ASSERT_TRUE(read_status.IsIOError())
3631
+ << "Expected IOError status, got: " << read_status.ToString();
3632
+ ASSERT_TRUE(read_status.ToString().find("Injected Poll error") !=
3633
+ std::string::npos)
3634
+ << "Expected error message to contain 'Injected Poll error', got: "
3635
+ << read_status.ToString();
3636
+
3637
+ SyncPoint::GetInstance()->DisableProcessing();
3638
+ SyncPoint::GetInstance()->ClearAllCallBacks();
3639
+ }
3640
+
3641
+ TEST_F(FilePrefetchBufferTest, ReadAsyncSyncFallbackOnNotSupported) {
3642
+ std::string fname = "read-async-sync-fallback";
3643
+ Random rand(0);
3644
+ std::string content = rand.RandomString(32768);
3645
+ Write(fname, content);
3646
+
3647
+ FileOptions opts;
3648
+ std::unique_ptr<RandomAccessFileReader> r;
3649
+ Read(fname, opts, &r);
3650
+
3651
+ SyncPoint::GetInstance()->SetCallBack(
3652
+ "RandomAccessFileReader::ReadAsync:InjectStatus", [](void* arg) {
3653
+ *static_cast<IOStatus*>(arg) = IOStatus::NotSupported();
3654
+ });
3655
+ SyncPoint::GetInstance()->EnableProcessing();
3656
+
3657
+ ReadaheadParams readahead_params;
3658
+ readahead_params.initial_readahead_size = 16384;
3659
+ readahead_params.max_readahead_size = 16384;
3660
+ readahead_params.num_buffers = 2;
3661
+
3662
+ FilePrefetchBuffer fpb(readahead_params, /*enable=*/true,
3663
+ /*track_min_offset=*/false, fs());
3664
+
3665
+ Slice result;
3666
+ Status s;
3667
+ ASSERT_TRUE(fpb.TryReadFromCache(IOOptions(), r.get(), 0, 4096, &result, &s));
3668
+ ASSERT_OK(s);
3669
+ ASSERT_EQ(result.size(), 4096);
3670
+ ASSERT_EQ(memcmp(result.data(), content.data(), 4096), 0);
3671
+
3672
+ SyncPoint::GetInstance()->DisableProcessing();
3673
+ SyncPoint::GetInstance()->ClearAllCallBacks();
3674
+ }
3675
+
3380
3676
  class FSBufferPrefetchTest
3381
3677
  : public testing::Test,
3382
3678
  public ::testing::WithParamInterface<std::tuple<bool, bool>> {
@@ -3455,7 +3751,11 @@ class FSBufferPrefetchTest
3455
3751
  stats_ = CreateDBStatistics();
3456
3752
  }
3457
3753
 
3458
- void TearDown() override { EXPECT_OK(DestroyDir(env_, test_dir_)); }
3754
+ void TearDown() override {
3755
+ SyncPoint::GetInstance()->DisableProcessing();
3756
+ SyncPoint::GetInstance()->ClearAllCallBacks();
3757
+ EXPECT_OK(DestroyDir(env_, test_dir_));
3758
+ }
3459
3759
 
3460
3760
  void Write(const std::string& fname, const std::string& content) {
3461
3761
  std::unique_ptr<FSWritableFile> f;
@@ -3542,6 +3842,9 @@ TEST_P(FSBufferPrefetchTest, FSBufferPrefetchStatsInternals) {
3542
3842
  fpb.TryReadFromCache(IOOptions(), r.get(), 0 /* offset */, 4096 /* n */,
3543
3843
  &result, &s, for_compaction);
3544
3844
  // Platforms that don't have IO uring may not support async IO.
3845
+ // With the ReadAsync sync fallback, s will be OK even when async IO is
3846
+ // unavailable — detect by checking if the second buffer has an async read
3847
+ // in progress.
3545
3848
  if (use_async_prefetch && s.IsNotSupported()) {
3546
3849
  return;
3547
3850
  }
@@ -3555,6 +3858,14 @@ TEST_P(FSBufferPrefetchTest, FSBufferPrefetchStatsInternals) {
3555
3858
  fpb.TEST_GetOverlapBufferOffsetandSize(overlap_buffer_info);
3556
3859
  fpb.TEST_GetBufferOffsetandSize(buffer_info);
3557
3860
  if (use_async_prefetch) {
3861
+ bool async_read_in_progress = std::get<2>(buffer_info[1]);
3862
+ if (!async_read_in_progress) {
3863
+ // Async IO was requested but not available (e.g., no io_uring).
3864
+ // ReadAsync fell back to sync read. Skip async-specific assertions.
3865
+ SyncPoint::GetInstance()->DisableProcessing();
3866
+ SyncPoint::GetInstance()->ClearAllCallBacks();
3867
+ return;
3868
+ }
3558
3869
  // Cut the readahead of 8192 in half.
3559
3870
  // Overlap buffer is not used
3560
3871
  ASSERT_EQ(overlap_buffer_info.first, 0);
@@ -3747,6 +4058,14 @@ TEST_P(FSBufferPrefetchTest, FSBufferPrefetchUnalignedReads) {
3747
4058
  fpb.TEST_GetOverlapBufferOffsetandSize(overlap_buffer_info);
3748
4059
  fpb.TEST_GetBufferOffsetandSize(buffer_info);
3749
4060
  if (use_async_prefetch) {
4061
+ bool async_read_in_progress = std::get<2>(buffer_info[1]);
4062
+ if (!async_read_in_progress) {
4063
+ // Async IO was requested but not available (e.g., no io_uring).
4064
+ // ReadAsync fell back to sync read. Skip async-specific assertions.
4065
+ SyncPoint::GetInstance()->DisableProcessing();
4066
+ SyncPoint::GetInstance()->ClearAllCallBacks();
4067
+ return;
4068
+ }
3750
4069
  // Overlap buffer is not used
3751
4070
  ASSERT_EQ(overlap_buffer_info.first, 0);
3752
4071
  ASSERT_EQ(overlap_buffer_info.second, 0);
@@ -66,41 +66,53 @@ inline void RecordIOStats(Statistics* stats, Temperature file_temperature,
66
66
  }
67
67
 
68
68
  // record for temperature file
69
- if (file_temperature != Temperature::kUnknown) {
70
- switch (file_temperature) {
71
- case Temperature::kHot:
72
- IOSTATS_ADD(file_io_stats_by_temperature.hot_file_bytes_read, size);
73
- IOSTATS_ADD(file_io_stats_by_temperature.hot_file_read_count, 1);
74
- RecordTick(stats, HOT_FILE_READ_BYTES, size);
75
- RecordTick(stats, HOT_FILE_READ_COUNT, 1);
76
- break;
77
- case Temperature::kWarm:
78
- IOSTATS_ADD(file_io_stats_by_temperature.warm_file_bytes_read, size);
79
- IOSTATS_ADD(file_io_stats_by_temperature.warm_file_read_count, 1);
80
- RecordTick(stats, WARM_FILE_READ_BYTES, size);
81
- RecordTick(stats, WARM_FILE_READ_COUNT, 1);
82
- break;
83
- case Temperature::kCool:
84
- IOSTATS_ADD(file_io_stats_by_temperature.cool_file_bytes_read, size);
85
- IOSTATS_ADD(file_io_stats_by_temperature.cool_file_read_count, 1);
86
- RecordTick(stats, COOL_FILE_READ_BYTES, size);
87
- RecordTick(stats, COOL_FILE_READ_COUNT, 1);
88
- break;
89
- case Temperature::kCold:
90
- IOSTATS_ADD(file_io_stats_by_temperature.cold_file_bytes_read, size);
91
- IOSTATS_ADD(file_io_stats_by_temperature.cold_file_read_count, 1);
92
- RecordTick(stats, COLD_FILE_READ_BYTES, size);
93
- RecordTick(stats, COLD_FILE_READ_COUNT, 1);
94
- break;
95
- case Temperature::kIce:
96
- IOSTATS_ADD(file_io_stats_by_temperature.ice_file_bytes_read, size);
97
- IOSTATS_ADD(file_io_stats_by_temperature.ice_file_read_count, 1);
98
- RecordTick(stats, ICE_FILE_READ_BYTES, size);
99
- RecordTick(stats, ICE_FILE_READ_COUNT, 1);
100
- break;
101
- default:
102
- break;
103
- }
69
+ switch (file_temperature) {
70
+ case Temperature::kHot:
71
+ IOSTATS_ADD(file_io_stats_by_temperature.hot_file_bytes_read, size);
72
+ IOSTATS_ADD(file_io_stats_by_temperature.hot_file_read_count, 1);
73
+ RecordTick(stats, HOT_FILE_READ_BYTES, size);
74
+ RecordTick(stats, HOT_FILE_READ_COUNT, 1);
75
+ break;
76
+ case Temperature::kWarm:
77
+ IOSTATS_ADD(file_io_stats_by_temperature.warm_file_bytes_read, size);
78
+ IOSTATS_ADD(file_io_stats_by_temperature.warm_file_read_count, 1);
79
+ RecordTick(stats, WARM_FILE_READ_BYTES, size);
80
+ RecordTick(stats, WARM_FILE_READ_COUNT, 1);
81
+ break;
82
+ case Temperature::kCool:
83
+ IOSTATS_ADD(file_io_stats_by_temperature.cool_file_bytes_read, size);
84
+ IOSTATS_ADD(file_io_stats_by_temperature.cool_file_read_count, 1);
85
+ RecordTick(stats, COOL_FILE_READ_BYTES, size);
86
+ RecordTick(stats, COOL_FILE_READ_COUNT, 1);
87
+ break;
88
+ case Temperature::kCold:
89
+ IOSTATS_ADD(file_io_stats_by_temperature.cold_file_bytes_read, size);
90
+ IOSTATS_ADD(file_io_stats_by_temperature.cold_file_read_count, 1);
91
+ RecordTick(stats, COLD_FILE_READ_BYTES, size);
92
+ RecordTick(stats, COLD_FILE_READ_COUNT, 1);
93
+ break;
94
+ case Temperature::kIce:
95
+ IOSTATS_ADD(file_io_stats_by_temperature.ice_file_bytes_read, size);
96
+ IOSTATS_ADD(file_io_stats_by_temperature.ice_file_read_count, 1);
97
+ RecordTick(stats, ICE_FILE_READ_BYTES, size);
98
+ RecordTick(stats, ICE_FILE_READ_COUNT, 1);
99
+ break;
100
+ case Temperature::kUnknown:
101
+ if (is_last_level) {
102
+ IOSTATS_ADD(file_io_stats_by_temperature.unknown_last_level_bytes_read,
103
+ size);
104
+ IOSTATS_ADD(file_io_stats_by_temperature.unknown_last_level_read_count,
105
+ 1);
106
+ } else {
107
+ IOSTATS_ADD(
108
+ file_io_stats_by_temperature.unknown_non_last_level_bytes_read,
109
+ size);
110
+ IOSTATS_ADD(
111
+ file_io_stats_by_temperature.unknown_non_last_level_read_count, 1);
112
+ }
113
+ break;
114
+ default:
115
+ break;
104
116
  }
105
117
  }
106
118
 
@@ -516,6 +528,11 @@ IOStatus RandomAccessFileReader::ReadAsync(
516
528
  void** io_handle, IOHandleDeleter* del_fn, AlignedBuf* aligned_buf,
517
529
  IODebugContext* dbg) {
518
530
  IOStatus s;
531
+ TEST_SYNC_POINT_CALLBACK("RandomAccessFileReader::ReadAsync:InjectStatus",
532
+ &s);
533
+ if (!s.ok()) {
534
+ return s;
535
+ }
519
536
  // Create a callback and populate info.
520
537
  auto read_async_callback =
521
538
  std::bind(&RandomAccessFileReader::ReadAsyncCallback, this,
@@ -47,13 +47,13 @@ ifneq ($(strip $(FOLLY_PATH)),)
47
47
  # Add -ldl at the end as gcc resolves a symbol in a library by searching only in libraries specified later
48
48
  # in the command line
49
49
 
50
- PLATFORM_LDFLAGS += $(FOLLY_PATH)/lib/libfolly.a $(BOOST_PATH)/lib/libboost_context.a $(BOOST_PATH)/lib/libboost_filesystem.a $(BOOST_PATH)/lib/libboost_atomic.a $(BOOST_PATH)/lib/libboost_program_options.a $(BOOST_PATH)/lib/libboost_regex.a $(BOOST_PATH)/lib/libboost_system.a $(BOOST_PATH)/lib/libboost_thread.a $(DBL_CONV_PATH)/lib/libdouble-conversion.a $(LIBEVENT_PATH)/lib/libevent-2.1.so $(LIBSODIUM_PATH)/lib/libsodium.a -ldl
50
+ PLATFORM_LDFLAGS += $(FOLLY_PATH)/lib/libfolly.a $(BOOST_PATH)/lib/libboost_context.a $(BOOST_PATH)/lib/libboost_filesystem.a $(BOOST_PATH)/lib/libboost_atomic.a $(BOOST_PATH)/lib/libboost_program_options.a $(BOOST_PATH)/lib/libboost_regex.a $(BOOST_PATH)/lib/libboost_system.a $(BOOST_PATH)/lib/libboost_thread.a $(DBL_CONV_PATH)/lib/libdouble-conversion.a $(LIBEVENT_PATH)/lib/libevent.a $(LIBSODIUM_PATH)/lib/libsodium.a -ldl
51
51
  ifneq ($(DEBUG_LEVEL),0)
52
52
  PLATFORM_LDFLAGS += $(FMT_LIB_PATH)/libfmtd.a $(GLOG_LIB_PATH)/libglogd.so $(GFLAGS_PATH)/lib/libgflags_debug.so.2.2
53
53
  else
54
54
  PLATFORM_LDFLAGS += $(FMT_LIB_PATH)/libfmt.a $(GLOG_LIB_PATH)/libglog.so $(GFLAGS_PATH)/lib/libgflags.so.2.2
55
55
  endif
56
- PLATFORM_LDFLAGS += -Wl,-rpath=$(LIBEVENT_PATH)/lib -Wl,-rpath=$(GLOG_LIB_PATH) -Wl,-rpath=$(GFLAGS_PATH)/lib
56
+ PLATFORM_LDFLAGS += -Wl,-rpath=$(GLOG_LIB_PATH) -Wl,-rpath=$(GFLAGS_PATH)/lib
57
57
  endif
58
58
  PLATFORM_CCFLAGS += -DUSE_FOLLY -DFOLLY_NO_CONFIG
59
59
  PLATFORM_CXXFLAGS += -DUSE_FOLLY -DFOLLY_NO_CONFIG
@@ -98,7 +98,7 @@ endif # FMT_SOURCE_PATH
98
98
  PLATFORM_LDFLAGS += -lglog
99
99
  endif
100
100
 
101
- FOLLY_COMMIT_HASH = abe68f7e917e8b7a0ee2fe066c972dc98fd35aa1
101
+ FOLLY_COMMIT_HASH = 3b0eed0a128c484a2b077546c3e08c824a311357
102
102
 
103
103
  # For public CI runs, checkout folly in a way that can build with RocksDB.
104
104
  # This is mostly intended as a test-only simulation of Meta-internal folly
@@ -116,10 +116,27 @@ checkout_folly:
116
116
  perl -pi -e 's/(#include <atomic>)/$$1\n#include <cstring>/' third-party/folly/folly/lang/Exception.h
117
117
  @# const mismatch
118
118
  perl -pi -e 's/: environ/: (const char**)(environ)/' third-party/folly/folly/Subprocess.cpp
119
- @# Use gnu.org mirrors to improve download speed (ftp.gnu.org is often super slow)
120
- cd third-party/folly && perl -pi -e 's/ftp.gnu.org/ftpmirror.gnu.org/' `git grep -l ftp.gnu.org` README.md
119
+ @# Restore cached downloads and handle unreliable mirrors with fallback
120
+ @cd third-party/folly && \
121
+ DOWNLOAD_DIR=`$(PYTHON) build/fbcode_builder/getdeps.py show-inst-dir | sed 's|/installed/.*|/downloads|'` && \
122
+ mkdir -p "$$DOWNLOAD_DIR" && \
123
+ CACHE_DIR="/tmp/rocksdb-getdeps-cache" && \
124
+ mkdir -p "$$CACHE_DIR" && \
125
+ echo "Restoring cached downloads..." && \
126
+ if ls "$$CACHE_DIR"/*.tar.gz "$$CACHE_DIR"/*.tar.xz "$$CACHE_DIR"/*.zip >/dev/null 2>&1; then \
127
+ cp -n "$$CACHE_DIR"/*.tar.gz "$$CACHE_DIR"/*.tar.xz "$$CACHE_DIR"/*.zip "$$DOWNLOAD_DIR/" 2>/dev/null || true; \
128
+ fi && \
129
+ echo "Handling known unreliable downloads with fallback mirrors..." && \
130
+ $(PYTHON) ../../build_tools/getdeps_fallback_mirror.py "$$DOWNLOAD_DIR" "$$CACHE_DIR" build/fbcode_builder/manifests
121
131
  @# NOTE: boost and fmt source will be needed for any build including `USE_FOLLY_LITE` builds as those depend on those headers
122
132
  cd third-party/folly && GETDEPS_USE_WGET=1 $(PYTHON) build/fbcode_builder/getdeps.py fetch boost && GETDEPS_USE_WGET=1 $(PYTHON) build/fbcode_builder/getdeps.py fetch fmt
133
+ @# Update cache with any new downloads
134
+ @cd third-party/folly && \
135
+ DOWNLOAD_DIR=`$(PYTHON) build/fbcode_builder/getdeps.py show-inst-dir | sed 's|/installed/.*|/downloads|'` && \
136
+ CACHE_DIR="/tmp/rocksdb-getdeps-cache" && \
137
+ if ls "$$DOWNLOAD_DIR"/*.tar.gz "$$DOWNLOAD_DIR"/*.tar.xz "$$DOWNLOAD_DIR"/*.zip >/dev/null 2>&1; then \
138
+ cp -n "$$DOWNLOAD_DIR"/*.tar.gz "$$DOWNLOAD_DIR"/*.tar.xz "$$DOWNLOAD_DIR"/*.zip "$$CACHE_DIR/" 2>/dev/null || true; \
139
+ fi
123
140
 
124
141
  CXX_M_FLAGS = $(filter -m%, $(CXXFLAGS))
125
142
 
@@ -318,7 +318,7 @@ class Cache : public Customizable {
318
318
  // REQUIRES: handle must have been returned by a method on *this.
319
319
  virtual bool Release(Handle* handle, bool erase_if_last_ref = false) = 0;
320
320
 
321
- // Return the object assiciated with a handle returned by a successful
321
+ // Return the object associated with a handle returned by a successful
322
322
  // Lookup(). For historical reasons, this is also known at the "value"
323
323
  // associated with the key.
324
324
  // REQUIRES: handle must not have been released yet.