@nxtedition/rocksdb 5.2.21 → 5.2.28

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 (923) hide show
  1. package/binding.cc +510 -967
  2. package/binding.gyp +78 -72
  3. package/chained-batch.js +1 -2
  4. package/deps/rocksdb/build_version.cc +70 -4
  5. package/deps/rocksdb/rocksdb/CMakeLists.txt +281 -149
  6. package/deps/rocksdb/rocksdb/Makefile +459 -469
  7. package/deps/rocksdb/rocksdb/TARGETS +5244 -1500
  8. package/deps/rocksdb/rocksdb/cache/cache.cc +12 -3
  9. package/deps/rocksdb/rocksdb/cache/cache_bench.cc +7 -368
  10. package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +924 -0
  11. package/deps/rocksdb/rocksdb/cache/cache_entry_roles.cc +128 -0
  12. package/deps/rocksdb/rocksdb/cache/cache_entry_roles.h +103 -0
  13. package/deps/rocksdb/rocksdb/cache/cache_entry_stats.h +183 -0
  14. package/deps/rocksdb/rocksdb/cache/cache_helpers.h +11 -0
  15. package/deps/rocksdb/rocksdb/cache/cache_key.cc +344 -0
  16. package/deps/rocksdb/rocksdb/cache/cache_key.h +132 -0
  17. package/deps/rocksdb/rocksdb/cache/cache_reservation_manager.cc +183 -0
  18. package/deps/rocksdb/rocksdb/cache/cache_reservation_manager.h +288 -0
  19. package/deps/rocksdb/rocksdb/cache/cache_reservation_manager_test.cc +468 -0
  20. package/deps/rocksdb/rocksdb/cache/cache_test.cc +85 -8
  21. package/deps/rocksdb/rocksdb/cache/clock_cache.cc +121 -51
  22. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +171 -0
  23. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +86 -0
  24. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +607 -0
  25. package/deps/rocksdb/rocksdb/cache/lru_cache.cc +381 -154
  26. package/deps/rocksdb/rocksdb/cache/lru_cache.h +176 -33
  27. package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +1659 -3
  28. package/deps/rocksdb/rocksdb/cache/sharded_cache.cc +94 -23
  29. package/deps/rocksdb/rocksdb/cache/sharded_cache.h +49 -28
  30. package/deps/rocksdb/rocksdb/cmake/modules/CxxFlags.cmake +7 -0
  31. package/deps/rocksdb/rocksdb/cmake/modules/FindJeMalloc.cmake +29 -0
  32. package/deps/rocksdb/rocksdb/cmake/modules/FindNUMA.cmake +29 -0
  33. package/deps/rocksdb/rocksdb/cmake/modules/FindSnappy.cmake +29 -0
  34. package/deps/rocksdb/rocksdb/cmake/modules/FindTBB.cmake +33 -0
  35. package/deps/rocksdb/rocksdb/cmake/modules/Findgflags.cmake +29 -0
  36. package/deps/rocksdb/rocksdb/cmake/modules/Findlz4.cmake +29 -0
  37. package/deps/rocksdb/rocksdb/cmake/modules/Finduring.cmake +26 -0
  38. package/deps/rocksdb/rocksdb/cmake/modules/Findzstd.cmake +29 -0
  39. package/deps/rocksdb/rocksdb/cmake/modules/ReadVersion.cmake +10 -0
  40. package/deps/rocksdb/rocksdb/crash_test.mk +93 -0
  41. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +54 -31
  42. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.h +10 -6
  43. package/deps/rocksdb/rocksdb/db/blob/blob_counting_iterator.h +146 -0
  44. package/deps/rocksdb/rocksdb/db/blob/blob_counting_iterator_test.cc +326 -0
  45. package/deps/rocksdb/rocksdb/db/blob/blob_fetcher.cc +34 -0
  46. package/deps/rocksdb/rocksdb/db/blob/blob_fetcher.h +37 -0
  47. package/deps/rocksdb/rocksdb/db/blob/blob_file_addition.cc +4 -2
  48. package/deps/rocksdb/rocksdb/db/blob/blob_file_addition_test.cc +8 -4
  49. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.cc +99 -40
  50. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.h +20 -8
  51. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder_test.cc +95 -83
  52. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.cc +13 -10
  53. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.h +7 -4
  54. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache_test.cc +37 -37
  55. package/deps/rocksdb/rocksdb/db/blob/blob_file_completion_callback.h +101 -0
  56. package/deps/rocksdb/rocksdb/db/blob/blob_file_meta.cc +8 -1
  57. package/deps/rocksdb/rocksdb/db/blob/blob_file_meta.h +6 -0
  58. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.cc +209 -44
  59. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.h +37 -11
  60. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader_test.cc +382 -179
  61. package/deps/rocksdb/rocksdb/db/blob/blob_garbage_meter.cc +100 -0
  62. package/deps/rocksdb/rocksdb/db/blob/blob_garbage_meter.h +102 -0
  63. package/deps/rocksdb/rocksdb/db/blob/blob_garbage_meter_test.cc +196 -0
  64. package/deps/rocksdb/rocksdb/db/blob/blob_index.h +3 -0
  65. package/deps/rocksdb/rocksdb/db/blob/blob_log_format.h +2 -1
  66. package/deps/rocksdb/rocksdb/db/blob/blob_log_sequential_reader.cc +7 -5
  67. package/deps/rocksdb/rocksdb/db/blob/blob_log_sequential_reader.h +10 -3
  68. package/deps/rocksdb/rocksdb/db/blob/blob_log_writer.cc +12 -8
  69. package/deps/rocksdb/rocksdb/db/blob/blob_log_writer.h +5 -5
  70. package/deps/rocksdb/rocksdb/db/blob/db_blob_basic_test.cc +772 -9
  71. package/deps/rocksdb/rocksdb/db/blob/db_blob_compaction_test.cc +730 -0
  72. package/deps/rocksdb/rocksdb/db/blob/db_blob_corruption_test.cc +82 -0
  73. package/deps/rocksdb/rocksdb/db/blob/db_blob_index_test.cc +155 -17
  74. package/deps/rocksdb/rocksdb/db/blob/prefetch_buffer_collection.cc +21 -0
  75. package/deps/rocksdb/rocksdb/db/blob/prefetch_buffer_collection.h +38 -0
  76. package/deps/rocksdb/rocksdb/db/builder.cc +137 -89
  77. package/deps/rocksdb/rocksdb/db/builder.h +16 -37
  78. package/deps/rocksdb/rocksdb/db/c.cc +413 -208
  79. package/deps/rocksdb/rocksdb/db/c_test.c +227 -138
  80. package/deps/rocksdb/rocksdb/db/column_family.cc +118 -103
  81. package/deps/rocksdb/rocksdb/db/column_family.h +86 -44
  82. package/deps/rocksdb/rocksdb/db/column_family_test.cc +38 -24
  83. package/deps/rocksdb/rocksdb/db/compact_files_test.cc +81 -0
  84. package/deps/rocksdb/rocksdb/db/compaction/clipping_iterator.h +275 -0
  85. package/deps/rocksdb/rocksdb/db/compaction/clipping_iterator_test.cc +258 -0
  86. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +81 -28
  87. package/deps/rocksdb/rocksdb/db/compaction/compaction.h +43 -12
  88. package/deps/rocksdb/rocksdb/db/compaction/compaction_iteration_stats.h +12 -0
  89. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +406 -215
  90. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +147 -50
  91. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +167 -61
  92. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +1321 -156
  93. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +197 -28
  94. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_stats_test.cc +2 -3
  95. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +246 -43
  96. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +65 -26
  97. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.h +7 -7
  98. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +122 -9
  99. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.h +8 -2
  100. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +18 -6
  101. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.h +1 -1
  102. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +536 -44
  103. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +311 -30
  104. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.h +1 -1
  105. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_test.cc +849 -0
  106. package/deps/rocksdb/rocksdb/db/compaction/file_pri.h +92 -0
  107. package/deps/rocksdb/rocksdb/db/compaction/sst_partitioner.cc +46 -0
  108. package/deps/rocksdb/rocksdb/db/comparator_db_test.cc +1 -1
  109. package/deps/rocksdb/rocksdb/db/convenience.cc +6 -3
  110. package/deps/rocksdb/rocksdb/db/corruption_test.cc +383 -28
  111. package/deps/rocksdb/rocksdb/db/cuckoo_table_db_test.cc +7 -2
  112. package/deps/rocksdb/rocksdb/db/db_basic_test.cc +154 -45
  113. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +1095 -33
  114. package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +1249 -203
  115. package/deps/rocksdb/rocksdb/db/db_compaction_filter_test.cc +135 -9
  116. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +1348 -166
  117. package/deps/rocksdb/rocksdb/db/db_dynamic_level_test.cc +3 -5
  118. package/deps/rocksdb/rocksdb/db/db_encryption_test.cc +1 -1
  119. package/deps/rocksdb/rocksdb/db/db_filesnapshot.cc +312 -45
  120. package/deps/rocksdb/rocksdb/db/db_flush_test.cc +1734 -48
  121. package/deps/rocksdb/rocksdb/db/{compacted_db_impl.cc → db_impl/compacted_db_impl.cc} +24 -7
  122. package/deps/rocksdb/rocksdb/db/{compacted_db_impl.h → db_impl/compacted_db_impl.h} +1 -1
  123. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +644 -333
  124. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +365 -92
  125. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +578 -210
  126. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +38 -16
  127. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_experimental.cc +17 -10
  128. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +75 -74
  129. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +450 -183
  130. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +42 -9
  131. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +232 -15
  132. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.h +42 -4
  133. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +297 -100
  134. package/deps/rocksdb/rocksdb/db/db_info_dumper.cc +16 -15
  135. package/deps/rocksdb/rocksdb/db/db_inplace_update_test.cc +31 -1
  136. package/deps/rocksdb/rocksdb/db/db_io_failure_test.cc +6 -5
  137. package/deps/rocksdb/rocksdb/db/db_iter.cc +218 -153
  138. package/deps/rocksdb/rocksdb/db/db_iter.h +14 -12
  139. package/deps/rocksdb/rocksdb/db/db_iter_stress_test.cc +1 -1
  140. package/deps/rocksdb/rocksdb/db/db_iter_test.cc +84 -160
  141. package/deps/rocksdb/rocksdb/db/db_iterator_test.cc +47 -6
  142. package/deps/rocksdb/rocksdb/db/db_kv_checksum_test.cc +204 -0
  143. package/deps/rocksdb/rocksdb/db/db_log_iter_test.cc +21 -13
  144. package/deps/rocksdb/rocksdb/db/db_logical_block_size_cache_test.cc +17 -10
  145. package/deps/rocksdb/rocksdb/db/db_memtable_test.cc +38 -24
  146. package/deps/rocksdb/rocksdb/db/db_merge_operand_test.cc +184 -19
  147. package/deps/rocksdb/rocksdb/db/db_merge_operator_test.cc +1 -1
  148. package/deps/rocksdb/rocksdb/db/db_options_test.cc +183 -3
  149. package/deps/rocksdb/rocksdb/db/db_properties_test.cc +409 -9
  150. package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +92 -23
  151. package/deps/rocksdb/rocksdb/db/db_rate_limiter_test.cc +446 -0
  152. package/deps/rocksdb/rocksdb/db/{db_impl/db_secondary_test.cc → db_secondary_test.cc} +363 -35
  153. package/deps/rocksdb/rocksdb/db/db_sst_test.cc +520 -15
  154. package/deps/rocksdb/rocksdb/db/db_statistics_test.cc +50 -1
  155. package/deps/rocksdb/rocksdb/db/db_table_properties_test.cc +139 -4
  156. package/deps/rocksdb/rocksdb/db/db_tailing_iter_test.cc +1 -1
  157. package/deps/rocksdb/rocksdb/db/db_test.cc +669 -359
  158. package/deps/rocksdb/rocksdb/db/db_test2.cc +2110 -304
  159. package/deps/rocksdb/rocksdb/db/db_test_util.cc +76 -43
  160. package/deps/rocksdb/rocksdb/db/db_test_util.h +231 -103
  161. package/deps/rocksdb/rocksdb/db/db_universal_compaction_test.cc +19 -11
  162. package/deps/rocksdb/rocksdb/db/db_wal_test.cc +490 -71
  163. package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +980 -349
  164. package/deps/rocksdb/rocksdb/db/db_with_timestamp_compaction_test.cc +11 -12
  165. package/deps/rocksdb/rocksdb/db/db_write_buffer_manager_test.cc +793 -0
  166. package/deps/rocksdb/rocksdb/db/db_write_test.cc +2 -1
  167. package/deps/rocksdb/rocksdb/db/dbformat.cc +4 -12
  168. package/deps/rocksdb/rocksdb/db/dbformat.h +28 -18
  169. package/deps/rocksdb/rocksdb/db/dbformat_test.cc +3 -0
  170. package/deps/rocksdb/rocksdb/db/deletefile_test.cc +50 -15
  171. package/deps/rocksdb/rocksdb/db/error_handler.cc +127 -41
  172. package/deps/rocksdb/rocksdb/db/error_handler.h +12 -5
  173. package/deps/rocksdb/rocksdb/db/error_handler_fs_test.cc +524 -255
  174. package/deps/rocksdb/rocksdb/db/event_helpers.cc +136 -11
  175. package/deps/rocksdb/rocksdb/db/event_helpers.h +27 -2
  176. package/deps/rocksdb/rocksdb/db/experimental.cc +100 -0
  177. package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +307 -4
  178. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +137 -60
  179. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.h +12 -8
  180. package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +86 -55
  181. package/deps/rocksdb/rocksdb/db/fault_injection_test.cc +86 -5
  182. package/deps/rocksdb/rocksdb/db/filename_test.cc +63 -0
  183. package/deps/rocksdb/rocksdb/db/flush_job.cc +619 -64
  184. package/deps/rocksdb/rocksdb/db/flush_job.h +30 -7
  185. package/deps/rocksdb/rocksdb/db/flush_job_test.cc +33 -16
  186. package/deps/rocksdb/rocksdb/db/flush_scheduler.h +2 -1
  187. package/deps/rocksdb/rocksdb/db/forward_iterator.cc +18 -17
  188. package/deps/rocksdb/rocksdb/db/forward_iterator.h +5 -4
  189. package/deps/rocksdb/rocksdb/db/forward_iterator_bench.cc +0 -1
  190. package/deps/rocksdb/rocksdb/db/history_trimming_iterator.h +91 -0
  191. package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +25 -14
  192. package/deps/rocksdb/rocksdb/db/import_column_family_job.h +6 -5
  193. package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +1 -1
  194. package/deps/rocksdb/rocksdb/db/internal_stats.cc +471 -50
  195. package/deps/rocksdb/rocksdb/db/internal_stats.h +129 -25
  196. package/deps/rocksdb/rocksdb/db/job_context.h +22 -9
  197. package/deps/rocksdb/rocksdb/db/kv_checksum.h +394 -0
  198. package/deps/rocksdb/rocksdb/db/listener_test.cc +518 -41
  199. package/deps/rocksdb/rocksdb/db/log_format.h +4 -1
  200. package/deps/rocksdb/rocksdb/db/log_reader.cc +129 -6
  201. package/deps/rocksdb/rocksdb/db/log_reader.h +17 -1
  202. package/deps/rocksdb/rocksdb/db/log_test.cc +161 -11
  203. package/deps/rocksdb/rocksdb/db/log_writer.cc +92 -13
  204. package/deps/rocksdb/rocksdb/db/log_writer.h +18 -5
  205. package/deps/rocksdb/rocksdb/db/logs_with_prep_tracker.h +1 -1
  206. package/deps/rocksdb/rocksdb/db/lookup_key.h +0 -1
  207. package/deps/rocksdb/rocksdb/db/malloc_stats.cc +2 -2
  208. package/deps/rocksdb/rocksdb/db/manual_compaction_test.cc +21 -8
  209. package/deps/rocksdb/rocksdb/db/memtable.cc +144 -54
  210. package/deps/rocksdb/rocksdb/db/memtable.h +72 -15
  211. package/deps/rocksdb/rocksdb/db/memtable_list.cc +95 -47
  212. package/deps/rocksdb/rocksdb/db/memtable_list.h +33 -13
  213. package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +61 -31
  214. package/deps/rocksdb/rocksdb/db/merge_context.h +20 -8
  215. package/deps/rocksdb/rocksdb/db/merge_helper.cc +54 -11
  216. package/deps/rocksdb/rocksdb/db/merge_helper.h +17 -6
  217. package/deps/rocksdb/rocksdb/db/merge_helper_test.cc +13 -7
  218. package/deps/rocksdb/rocksdb/db/merge_test.cc +40 -19
  219. package/deps/rocksdb/rocksdb/db/obsolete_files_test.cc +14 -25
  220. package/deps/rocksdb/rocksdb/db/output_validator.cc +3 -0
  221. package/deps/rocksdb/rocksdb/db/output_validator.h +5 -4
  222. package/deps/rocksdb/rocksdb/db/perf_context_test.cc +32 -28
  223. package/deps/rocksdb/rocksdb/db/periodic_work_scheduler.cc +43 -29
  224. package/deps/rocksdb/rocksdb/db/periodic_work_scheduler.h +9 -7
  225. package/deps/rocksdb/rocksdb/db/periodic_work_scheduler_test.cc +21 -16
  226. package/deps/rocksdb/rocksdb/db/pinned_iterators_manager.h +1 -1
  227. package/deps/rocksdb/rocksdb/db/plain_table_db_test.cc +29 -36
  228. package/deps/rocksdb/rocksdb/db/pre_release_callback.h +1 -2
  229. package/deps/rocksdb/rocksdb/db/prefix_test.cc +4 -4
  230. package/deps/rocksdb/rocksdb/db/range_del_aggregator.h +2 -2
  231. package/deps/rocksdb/rocksdb/db/range_del_aggregator_bench.cc +11 -11
  232. package/deps/rocksdb/rocksdb/db/range_del_aggregator_test.cc +3 -2
  233. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.cc +14 -8
  234. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.h +17 -0
  235. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter_test.cc +4 -2
  236. package/deps/rocksdb/rocksdb/db/read_callback.h +1 -0
  237. package/deps/rocksdb/rocksdb/db/repair.cc +87 -58
  238. package/deps/rocksdb/rocksdb/db/repair_test.cc +35 -5
  239. package/deps/rocksdb/rocksdb/db/snapshot_impl.h +2 -1
  240. package/deps/rocksdb/rocksdb/db/table_cache.cc +95 -69
  241. package/deps/rocksdb/rocksdb/db/table_cache.h +63 -53
  242. package/deps/rocksdb/rocksdb/db/table_properties_collector.cc +4 -4
  243. package/deps/rocksdb/rocksdb/db/table_properties_collector.h +78 -10
  244. package/deps/rocksdb/rocksdb/db/table_properties_collector_test.cc +28 -33
  245. package/deps/rocksdb/rocksdb/db/transaction_log_impl.cc +30 -51
  246. package/deps/rocksdb/rocksdb/db/transaction_log_impl.h +12 -8
  247. package/deps/rocksdb/rocksdb/db/version_builder.cc +564 -341
  248. package/deps/rocksdb/rocksdb/db/version_builder.h +8 -8
  249. package/deps/rocksdb/rocksdb/db/version_builder_test.cc +327 -155
  250. package/deps/rocksdb/rocksdb/db/version_edit.cc +89 -27
  251. package/deps/rocksdb/rocksdb/db/version_edit.h +42 -17
  252. package/deps/rocksdb/rocksdb/db/version_edit_handler.cc +324 -43
  253. package/deps/rocksdb/rocksdb/db/version_edit_handler.h +79 -22
  254. package/deps/rocksdb/rocksdb/db/version_edit_test.cc +165 -20
  255. package/deps/rocksdb/rocksdb/db/version_set.cc +935 -1034
  256. package/deps/rocksdb/rocksdb/db/version_set.h +183 -122
  257. package/deps/rocksdb/rocksdb/db/version_set_test.cc +556 -138
  258. package/deps/rocksdb/rocksdb/db/version_util.h +68 -0
  259. package/deps/rocksdb/rocksdb/db/wal_manager.cc +23 -21
  260. package/deps/rocksdb/rocksdb/db/wal_manager.h +5 -2
  261. package/deps/rocksdb/rocksdb/db/wal_manager_test.cc +30 -27
  262. package/deps/rocksdb/rocksdb/db/write_batch.cc +704 -209
  263. package/deps/rocksdb/rocksdb/db/write_batch_internal.h +135 -2
  264. package/deps/rocksdb/rocksdb/db/write_batch_test.cc +209 -5
  265. package/deps/rocksdb/rocksdb/db/write_callback_test.cc +2 -0
  266. package/deps/rocksdb/rocksdb/db/write_controller.cc +47 -54
  267. package/deps/rocksdb/rocksdb/db/write_controller.h +12 -9
  268. package/deps/rocksdb/rocksdb/db/write_controller_test.cc +215 -103
  269. package/deps/rocksdb/rocksdb/db/write_thread.cc +11 -0
  270. package/deps/rocksdb/rocksdb/db/write_thread.h +14 -8
  271. package/deps/rocksdb/rocksdb/db_stress_tool/CMakeLists.txt +7 -4
  272. package/deps/rocksdb/rocksdb/db_stress_tool/batched_ops_stress.cc +10 -3
  273. package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +6 -0
  274. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress.cc +1 -1
  275. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.cc +19 -2
  276. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +78 -25
  277. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_compaction_filter.h +13 -2
  278. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +29 -12
  279. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_env_wrapper.h +5 -1
  280. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +199 -32
  281. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_listener.cc +188 -0
  282. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_listener.h +59 -10
  283. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +77 -109
  284. package/deps/rocksdb/rocksdb/{third-party/folly/folly/synchronization/WaitOptions.cpp → db_stress_tool/db_stress_stat.cc} +9 -4
  285. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_stat.h +7 -6
  286. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_table_properties_collector.h +1 -0
  287. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +699 -143
  288. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +20 -2
  289. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +49 -39
  290. package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.cc +631 -0
  291. package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.h +287 -0
  292. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +1565 -0
  293. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.h +374 -0
  294. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +149 -18
  295. package/deps/rocksdb/rocksdb/env/composite_env.cc +464 -0
  296. package/deps/rocksdb/rocksdb/env/composite_env_wrapper.h +98 -646
  297. package/deps/rocksdb/rocksdb/env/emulated_clock.h +114 -0
  298. package/deps/rocksdb/rocksdb/env/env.cc +632 -42
  299. package/deps/rocksdb/rocksdb/env/env_basic_test.cc +84 -36
  300. package/deps/rocksdb/rocksdb/env/env_chroot.cc +88 -286
  301. package/deps/rocksdb/rocksdb/env/env_chroot.h +34 -1
  302. package/deps/rocksdb/rocksdb/env/env_encryption.cc +469 -277
  303. package/deps/rocksdb/rocksdb/env/env_encryption_ctr.h +9 -30
  304. package/deps/rocksdb/rocksdb/env/env_posix.cc +110 -119
  305. package/deps/rocksdb/rocksdb/env/env_test.cc +1128 -39
  306. package/deps/rocksdb/rocksdb/env/file_system.cc +147 -8
  307. package/deps/rocksdb/rocksdb/env/file_system_tracer.cc +207 -136
  308. package/deps/rocksdb/rocksdb/env/file_system_tracer.h +86 -54
  309. package/deps/rocksdb/rocksdb/env/fs_posix.cc +192 -64
  310. package/deps/rocksdb/rocksdb/env/fs_readonly.h +107 -0
  311. package/deps/rocksdb/rocksdb/env/fs_remap.cc +339 -0
  312. package/deps/rocksdb/rocksdb/env/fs_remap.h +139 -0
  313. package/deps/rocksdb/rocksdb/env/io_posix.cc +245 -41
  314. package/deps/rocksdb/rocksdb/env/io_posix.h +66 -1
  315. package/deps/rocksdb/rocksdb/env/mock_env.cc +147 -149
  316. package/deps/rocksdb/rocksdb/env/mock_env.h +113 -11
  317. package/deps/rocksdb/rocksdb/env/mock_env_test.cc +2 -4
  318. package/deps/rocksdb/rocksdb/env/unique_id_gen.cc +164 -0
  319. package/deps/rocksdb/rocksdb/env/unique_id_gen.h +71 -0
  320. package/deps/rocksdb/rocksdb/file/delete_scheduler.cc +9 -5
  321. package/deps/rocksdb/rocksdb/file/delete_scheduler.h +6 -4
  322. package/deps/rocksdb/rocksdb/file/delete_scheduler_test.cc +19 -12
  323. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +459 -70
  324. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +205 -28
  325. package/deps/rocksdb/rocksdb/file/file_util.cc +39 -28
  326. package/deps/rocksdb/rocksdb/file/file_util.h +18 -27
  327. package/deps/rocksdb/rocksdb/file/filename.cc +59 -22
  328. package/deps/rocksdb/rocksdb/file/filename.h +13 -8
  329. package/deps/rocksdb/rocksdb/file/line_file_reader.cc +68 -0
  330. package/deps/rocksdb/rocksdb/file/line_file_reader.h +59 -0
  331. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +1130 -6
  332. package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +220 -36
  333. package/deps/rocksdb/rocksdb/file/random_access_file_reader.h +69 -17
  334. package/deps/rocksdb/rocksdb/file/random_access_file_reader_test.cc +13 -12
  335. package/deps/rocksdb/rocksdb/file/read_write_util.cc +3 -38
  336. package/deps/rocksdb/rocksdb/file/read_write_util.h +0 -4
  337. package/deps/rocksdb/rocksdb/file/readahead_file_info.h +33 -0
  338. package/deps/rocksdb/rocksdb/file/sequence_file_reader.cc +57 -9
  339. package/deps/rocksdb/rocksdb/file/sequence_file_reader.h +58 -6
  340. package/deps/rocksdb/rocksdb/file/sst_file_manager_impl.cc +29 -54
  341. package/deps/rocksdb/rocksdb/file/sst_file_manager_impl.h +22 -29
  342. package/deps/rocksdb/rocksdb/file/writable_file_writer.cc +424 -50
  343. package/deps/rocksdb/rocksdb/file/writable_file_writer.h +66 -19
  344. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +157 -66
  345. package/deps/rocksdb/rocksdb/include/rocksdb/c.h +224 -121
  346. package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +333 -30
  347. package/deps/rocksdb/rocksdb/include/rocksdb/cache_bench_tool.h +14 -0
  348. package/deps/rocksdb/rocksdb/include/rocksdb/cleanable.h +1 -1
  349. package/deps/rocksdb/rocksdb/include/rocksdb/compaction_filter.h +90 -50
  350. package/deps/rocksdb/rocksdb/include/rocksdb/compaction_job_stats.h +13 -5
  351. package/deps/rocksdb/rocksdb/include/rocksdb/comparator.h +20 -4
  352. package/deps/rocksdb/rocksdb/include/rocksdb/concurrent_task_limiter.h +8 -3
  353. package/deps/rocksdb/rocksdb/include/rocksdb/configurable.h +53 -12
  354. package/deps/rocksdb/rocksdb/include/rocksdb/convenience.h +31 -6
  355. package/deps/rocksdb/rocksdb/include/rocksdb/customizable.h +102 -7
  356. package/deps/rocksdb/rocksdb/include/rocksdb/data_structure.h +51 -0
  357. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +370 -262
  358. package/deps/rocksdb/rocksdb/include/rocksdb/env.h +286 -87
  359. package/deps/rocksdb/rocksdb/include/rocksdb/env_encryption.h +124 -64
  360. package/deps/rocksdb/rocksdb/include/rocksdb/experimental.h +27 -0
  361. package/deps/rocksdb/rocksdb/include/rocksdb/file_checksum.h +21 -4
  362. package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +384 -41
  363. package/deps/rocksdb/rocksdb/include/rocksdb/filter_policy.h +111 -143
  364. package/deps/rocksdb/rocksdb/include/rocksdb/flush_block_policy.h +20 -6
  365. package/deps/rocksdb/rocksdb/include/rocksdb/functor_wrapper.h +56 -0
  366. package/deps/rocksdb/rocksdb/include/rocksdb/io_status.h +15 -33
  367. package/deps/rocksdb/rocksdb/include/rocksdb/iostats_context.h +37 -1
  368. package/deps/rocksdb/rocksdb/include/rocksdb/iterator.h +1 -3
  369. package/deps/rocksdb/rocksdb/include/rocksdb/listener.h +314 -26
  370. package/deps/rocksdb/rocksdb/include/rocksdb/memory_allocator.h +11 -7
  371. package/deps/rocksdb/rocksdb/include/rocksdb/memtablerep.h +50 -15
  372. package/deps/rocksdb/rocksdb/include/rocksdb/merge_operator.h +10 -3
  373. package/deps/rocksdb/rocksdb/include/rocksdb/metadata.h +186 -96
  374. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +373 -103
  375. package/deps/rocksdb/rocksdb/include/rocksdb/perf_context.h +13 -3
  376. package/deps/rocksdb/rocksdb/include/rocksdb/persistent_cache.h +2 -2
  377. package/deps/rocksdb/rocksdb/include/rocksdb/rate_limiter.h +37 -7
  378. package/deps/rocksdb/rocksdb/include/rocksdb/rocksdb_namespace.h +6 -0
  379. package/deps/rocksdb/rocksdb/include/rocksdb/secondary_cache.h +87 -0
  380. package/deps/rocksdb/rocksdb/include/rocksdb/slice.h +5 -12
  381. package/deps/rocksdb/rocksdb/include/rocksdb/slice_transform.h +59 -30
  382. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_manager.h +11 -11
  383. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_writer.h +22 -0
  384. package/deps/rocksdb/rocksdb/include/rocksdb/sst_partitioner.h +17 -10
  385. package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +121 -41
  386. package/deps/rocksdb/rocksdb/include/rocksdb/stats_history.h +1 -0
  387. package/deps/rocksdb/rocksdb/include/rocksdb/status.h +114 -136
  388. package/deps/rocksdb/rocksdb/include/rocksdb/system_clock.h +116 -0
  389. package/deps/rocksdb/rocksdb/include/rocksdb/table.h +160 -18
  390. package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +57 -15
  391. package/deps/rocksdb/rocksdb/include/rocksdb/thread_status.h +3 -1
  392. package/deps/rocksdb/rocksdb/include/rocksdb/trace_reader_writer.h +10 -6
  393. package/deps/rocksdb/rocksdb/include/rocksdb/trace_record.h +247 -0
  394. package/deps/rocksdb/rocksdb/include/rocksdb/trace_record_result.h +187 -0
  395. package/deps/rocksdb/rocksdb/include/rocksdb/transaction_log.h +1 -1
  396. package/deps/rocksdb/rocksdb/include/rocksdb/types.h +14 -24
  397. package/deps/rocksdb/rocksdb/include/rocksdb/unique_id.h +46 -0
  398. package/deps/rocksdb/rocksdb/include/rocksdb/universal_compaction.h +14 -4
  399. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/agg_merge.h +138 -0
  400. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/backup_engine.h +631 -0
  401. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/cache_dump_load.h +142 -0
  402. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/checkpoint.h +12 -9
  403. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/customizable_util.h +368 -0
  404. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd.h +24 -0
  405. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd_execute_result.h +4 -0
  406. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/object_registry.h +418 -63
  407. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_type.h +143 -73
  408. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_util.h +2 -2
  409. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/replayer.h +87 -0
  410. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/sim_cache.h +2 -2
  411. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/stackable_db.h +43 -5
  412. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/table_properties_collectors.h +18 -23
  413. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction.h +26 -0
  414. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db.h +32 -6
  415. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db_mutex.h +1 -2
  416. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/write_batch_with_index.h +20 -1
  417. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +30 -3
  418. package/deps/rocksdb/rocksdb/include/rocksdb/wal_filter.h +11 -2
  419. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch.h +89 -11
  420. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch_base.h +11 -0
  421. package/deps/rocksdb/rocksdb/include/rocksdb/write_buffer_manager.h +108 -38
  422. package/deps/rocksdb/rocksdb/logging/auto_roll_logger.cc +40 -23
  423. package/deps/rocksdb/rocksdb/logging/auto_roll_logger.h +12 -5
  424. package/deps/rocksdb/rocksdb/logging/auto_roll_logger_test.cc +100 -49
  425. package/deps/rocksdb/rocksdb/logging/env_logger.h +7 -5
  426. package/deps/rocksdb/rocksdb/logging/env_logger_test.cc +0 -1
  427. package/deps/rocksdb/rocksdb/logging/posix_logger.h +3 -9
  428. package/deps/rocksdb/rocksdb/memory/arena.cc +3 -1
  429. package/deps/rocksdb/rocksdb/memory/arena.h +1 -1
  430. package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.cc +171 -106
  431. package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.h +31 -15
  432. package/deps/rocksdb/rocksdb/memory/memkind_kmem_allocator.cc +15 -4
  433. package/deps/rocksdb/rocksdb/memory/memkind_kmem_allocator.h +24 -8
  434. package/deps/rocksdb/rocksdb/memory/memory_allocator.cc +91 -0
  435. package/deps/rocksdb/rocksdb/memory/memory_allocator_test.cc +239 -0
  436. package/deps/rocksdb/rocksdb/memory/memory_usage.h +14 -1
  437. package/deps/rocksdb/rocksdb/memtable/hash_linklist_rep.cc +72 -9
  438. package/deps/rocksdb/rocksdb/memtable/hash_skiplist_rep.cc +52 -6
  439. package/deps/rocksdb/rocksdb/memtable/inlineskiplist.h +53 -0
  440. package/deps/rocksdb/rocksdb/memtable/inlineskiplist_test.cc +5 -5
  441. package/deps/rocksdb/rocksdb/memtable/memtablerep_bench.cc +17 -5
  442. package/deps/rocksdb/rocksdb/memtable/skiplist_test.cc +1 -1
  443. package/deps/rocksdb/rocksdb/memtable/skiplistrep.cc +87 -0
  444. package/deps/rocksdb/rocksdb/memtable/vectorrep.cc +20 -10
  445. package/deps/rocksdb/rocksdb/memtable/write_buffer_manager.cc +148 -94
  446. package/deps/rocksdb/rocksdb/memtable/write_buffer_manager_test.cc +160 -62
  447. package/deps/rocksdb/rocksdb/microbench/CMakeLists.txt +17 -0
  448. package/deps/rocksdb/rocksdb/microbench/db_basic_bench.cc +1360 -0
  449. package/deps/rocksdb/rocksdb/microbench/ribbon_bench.cc +153 -0
  450. package/deps/rocksdb/rocksdb/monitoring/histogram.cc +8 -15
  451. package/deps/rocksdb/rocksdb/monitoring/histogram.h +0 -1
  452. package/deps/rocksdb/rocksdb/monitoring/histogram_test.cc +18 -16
  453. package/deps/rocksdb/rocksdb/monitoring/histogram_windowing.cc +9 -7
  454. package/deps/rocksdb/rocksdb/monitoring/histogram_windowing.h +5 -3
  455. package/deps/rocksdb/rocksdb/monitoring/instrumented_mutex.cc +7 -5
  456. package/deps/rocksdb/rocksdb/monitoring/instrumented_mutex.h +37 -12
  457. package/deps/rocksdb/rocksdb/monitoring/iostats_context.cc +26 -6
  458. package/deps/rocksdb/rocksdb/monitoring/iostats_context_imp.h +6 -10
  459. package/deps/rocksdb/rocksdb/monitoring/perf_context.cc +14 -13
  460. package/deps/rocksdb/rocksdb/monitoring/perf_context_imp.h +19 -20
  461. package/deps/rocksdb/rocksdb/monitoring/perf_step_timer.h +18 -18
  462. package/deps/rocksdb/rocksdb/monitoring/statistics.cc +84 -2
  463. package/deps/rocksdb/rocksdb/monitoring/statistics.h +6 -0
  464. package/deps/rocksdb/rocksdb/monitoring/statistics_test.cc +47 -2
  465. package/deps/rocksdb/rocksdb/monitoring/stats_history_test.cc +67 -54
  466. package/deps/rocksdb/rocksdb/monitoring/thread_status_updater.cc +4 -1
  467. package/deps/rocksdb/rocksdb/monitoring/thread_status_util.cc +2 -1
  468. package/deps/rocksdb/rocksdb/monitoring/thread_status_util_debug.cc +2 -2
  469. package/deps/rocksdb/rocksdb/options/cf_options.cc +280 -212
  470. package/deps/rocksdb/rocksdb/options/cf_options.h +51 -57
  471. package/deps/rocksdb/rocksdb/options/configurable.cc +242 -138
  472. package/deps/rocksdb/rocksdb/options/configurable_helper.h +4 -68
  473. package/deps/rocksdb/rocksdb/options/configurable_test.cc +144 -21
  474. package/deps/rocksdb/rocksdb/options/configurable_test.h +2 -3
  475. package/deps/rocksdb/rocksdb/options/customizable.cc +67 -7
  476. package/deps/rocksdb/rocksdb/options/customizable_test.cc +1773 -151
  477. package/deps/rocksdb/rocksdb/options/db_options.cc +275 -47
  478. package/deps/rocksdb/rocksdb/options/db_options.h +36 -7
  479. package/deps/rocksdb/rocksdb/options/options.cc +49 -17
  480. package/deps/rocksdb/rocksdb/options/options_helper.cc +369 -352
  481. package/deps/rocksdb/rocksdb/options/options_helper.h +23 -23
  482. package/deps/rocksdb/rocksdb/options/options_parser.cc +18 -13
  483. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +67 -54
  484. package/deps/rocksdb/rocksdb/options/options_test.cc +1162 -187
  485. package/deps/rocksdb/rocksdb/port/jemalloc_helper.h +1 -1
  486. package/deps/rocksdb/rocksdb/port/lang.h +52 -0
  487. package/deps/rocksdb/rocksdb/port/port_example.h +1 -1
  488. package/deps/rocksdb/rocksdb/port/port_posix.cc +31 -2
  489. package/deps/rocksdb/rocksdb/port/port_posix.h +20 -2
  490. package/deps/rocksdb/rocksdb/port/stack_trace.cc +20 -4
  491. package/deps/rocksdb/rocksdb/port/sys_time.h +2 -2
  492. package/deps/rocksdb/rocksdb/port/win/env_default.cc +7 -7
  493. package/deps/rocksdb/rocksdb/port/win/env_win.cc +44 -74
  494. package/deps/rocksdb/rocksdb/port/win/env_win.h +25 -23
  495. package/deps/rocksdb/rocksdb/port/win/io_win.cc +32 -34
  496. package/deps/rocksdb/rocksdb/port/win/io_win.h +12 -6
  497. package/deps/rocksdb/rocksdb/port/win/port_win.cc +55 -35
  498. package/deps/rocksdb/rocksdb/port/win/port_win.h +22 -5
  499. package/deps/rocksdb/rocksdb/port/win/win_logger.cc +3 -3
  500. package/deps/rocksdb/rocksdb/port/win/win_logger.h +3 -5
  501. package/deps/rocksdb/rocksdb/port/win/win_thread.cc +7 -1
  502. package/deps/rocksdb/rocksdb/port/win/win_thread.h +12 -17
  503. package/deps/rocksdb/rocksdb/python.mk +9 -0
  504. package/deps/rocksdb/rocksdb/src.mk +82 -34
  505. package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.cc +3 -4
  506. package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.h +1 -1
  507. package/deps/rocksdb/rocksdb/table/block_based/block.cc +158 -80
  508. package/deps/rocksdb/rocksdb/table/block_based/block.h +64 -36
  509. package/deps/rocksdb/rocksdb/table/block_based/block_based_filter_block.cc +23 -14
  510. package/deps/rocksdb/rocksdb/table/block_based/block_based_filter_block.h +13 -5
  511. package/deps/rocksdb/rocksdb/table/block_based/block_based_filter_block_test.cc +3 -218
  512. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +603 -328
  513. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.h +28 -22
  514. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +220 -82
  515. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.h +8 -2
  516. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.cc +3 -4
  517. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.h +28 -4
  518. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +598 -492
  519. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +151 -96
  520. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_impl.h +31 -58
  521. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +330 -92
  522. package/deps/rocksdb/rocksdb/table/block_based/block_builder.cc +50 -19
  523. package/deps/rocksdb/rocksdb/table/block_based/block_builder.h +23 -0
  524. package/deps/rocksdb/rocksdb/table/block_based/block_like_traits.h +226 -0
  525. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.cc +56 -22
  526. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.h +42 -4
  527. package/deps/rocksdb/rocksdb/table/block_based/block_test.cc +5 -2
  528. package/deps/rocksdb/rocksdb/table/block_based/block_type.h +2 -0
  529. package/deps/rocksdb/rocksdb/table/block_based/cachable_entry.h +34 -20
  530. package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index_test.cc +9 -10
  531. package/deps/rocksdb/rocksdb/table/block_based/filter_block.h +26 -3
  532. package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.cc +2 -1
  533. package/deps/rocksdb/rocksdb/table/block_based/filter_policy.cc +844 -202
  534. package/deps/rocksdb/rocksdb/table/block_based/filter_policy_internal.h +281 -81
  535. package/deps/rocksdb/rocksdb/table/block_based/flush_block_policy.cc +62 -2
  536. package/deps/rocksdb/rocksdb/table/block_based/flush_block_policy.h +2 -3
  537. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.cc +28 -7
  538. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.h +22 -6
  539. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block_test.cc +28 -26
  540. package/deps/rocksdb/rocksdb/table/block_based/hash_index_reader.cc +1 -1
  541. package/deps/rocksdb/rocksdb/table/block_based/index_builder.cc +1 -2
  542. package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.cc +2 -1
  543. package/deps/rocksdb/rocksdb/table/block_based/mock_block_based_table.h +11 -4
  544. package/deps/rocksdb/rocksdb/table/block_based/parsed_full_filter_block.cc +2 -1
  545. package/deps/rocksdb/rocksdb/table/block_based/parsed_full_filter_block.h +2 -0
  546. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +68 -26
  547. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.h +44 -9
  548. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +12 -10
  549. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_iterator.cc +3 -4
  550. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_iterator.h +23 -4
  551. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +44 -19
  552. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.h +5 -1
  553. package/deps/rocksdb/rocksdb/table/block_based/reader_common.cc +16 -28
  554. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.cc +7 -4
  555. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.h +2 -2
  556. package/deps/rocksdb/rocksdb/table/block_fetcher.cc +77 -57
  557. package/deps/rocksdb/rocksdb/table/block_fetcher.h +23 -12
  558. package/deps/rocksdb/rocksdb/table/block_fetcher_test.cc +43 -56
  559. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.cc +8 -8
  560. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.h +2 -1
  561. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder_test.cc +52 -70
  562. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_factory.cc +5 -8
  563. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_factory.h +1 -1
  564. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader.cc +17 -11
  565. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader.h +2 -3
  566. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader_test.cc +42 -51
  567. package/deps/rocksdb/rocksdb/table/format.cc +258 -104
  568. package/deps/rocksdb/rocksdb/table/format.h +120 -109
  569. package/deps/rocksdb/rocksdb/table/get_context.cc +97 -65
  570. package/deps/rocksdb/rocksdb/table/get_context.h +19 -12
  571. package/deps/rocksdb/rocksdb/table/internal_iterator.h +14 -0
  572. package/deps/rocksdb/rocksdb/table/iterator_wrapper.h +8 -0
  573. package/deps/rocksdb/rocksdb/table/merger_test.cc +3 -2
  574. package/deps/rocksdb/rocksdb/table/merging_iterator.cc +11 -21
  575. package/deps/rocksdb/rocksdb/table/merging_iterator.h +3 -3
  576. package/deps/rocksdb/rocksdb/table/meta_blocks.cc +176 -171
  577. package/deps/rocksdb/rocksdb/table/meta_blocks.h +47 -33
  578. package/deps/rocksdb/rocksdb/table/mock_table.cc +7 -9
  579. package/deps/rocksdb/rocksdb/table/mock_table.h +3 -2
  580. package/deps/rocksdb/rocksdb/table/multiget_context.h +15 -8
  581. package/deps/rocksdb/rocksdb/table/persistent_cache_helper.cc +22 -29
  582. package/deps/rocksdb/rocksdb/table/persistent_cache_options.h +6 -3
  583. package/deps/rocksdb/rocksdb/table/plain/plain_table_bloom.h +5 -8
  584. package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.cc +29 -26
  585. package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.h +12 -16
  586. package/deps/rocksdb/rocksdb/table/plain/plain_table_factory.cc +145 -69
  587. package/deps/rocksdb/rocksdb/table/plain/plain_table_factory.h +1 -1
  588. package/deps/rocksdb/rocksdb/table/plain/plain_table_index.cc +7 -6
  589. package/deps/rocksdb/rocksdb/table/plain/plain_table_index.h +3 -4
  590. package/deps/rocksdb/rocksdb/table/plain/plain_table_key_coding.cc +3 -1
  591. package/deps/rocksdb/rocksdb/table/plain/plain_table_key_coding.h +1 -1
  592. package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.cc +13 -18
  593. package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.h +4 -9
  594. package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +55 -37
  595. package/deps/rocksdb/rocksdb/table/sst_file_dumper.h +10 -5
  596. package/deps/rocksdb/rocksdb/table/sst_file_reader.cc +11 -8
  597. package/deps/rocksdb/rocksdb/table/sst_file_reader_test.cc +222 -16
  598. package/deps/rocksdb/rocksdb/table/sst_file_writer.cc +106 -58
  599. package/deps/rocksdb/rocksdb/table/sst_file_writer_collectors.h +6 -5
  600. package/deps/rocksdb/rocksdb/table/table_builder.h +68 -44
  601. package/deps/rocksdb/rocksdb/table/table_factory.cc +37 -10
  602. package/deps/rocksdb/rocksdb/table/table_properties.cc +109 -54
  603. package/deps/rocksdb/rocksdb/table/table_properties_internal.h +4 -20
  604. package/deps/rocksdb/rocksdb/table/table_reader_bench.cc +33 -32
  605. package/deps/rocksdb/rocksdb/table/table_reader_caller.h +2 -0
  606. package/deps/rocksdb/rocksdb/table/table_test.cc +989 -326
  607. package/deps/rocksdb/rocksdb/table/two_level_iterator.cc +4 -0
  608. package/deps/rocksdb/rocksdb/table/unique_id.cc +166 -0
  609. package/deps/rocksdb/rocksdb/table/unique_id_impl.h +59 -0
  610. package/deps/rocksdb/rocksdb/test_util/mock_time_env.cc +1 -1
  611. package/deps/rocksdb/rocksdb/test_util/mock_time_env.h +13 -10
  612. package/deps/rocksdb/rocksdb/test_util/sync_point.cc +1 -2
  613. package/deps/rocksdb/rocksdb/test_util/sync_point.h +35 -16
  614. package/deps/rocksdb/rocksdb/test_util/sync_point_impl.cc +32 -10
  615. package/deps/rocksdb/rocksdb/test_util/sync_point_impl.h +31 -4
  616. package/deps/rocksdb/rocksdb/test_util/testharness.cc +53 -1
  617. package/deps/rocksdb/rocksdb/test_util/testharness.h +67 -3
  618. package/deps/rocksdb/rocksdb/test_util/testutil.cc +236 -66
  619. package/deps/rocksdb/rocksdb/test_util/testutil.h +63 -100
  620. package/deps/rocksdb/rocksdb/test_util/transaction_test_util.cc +12 -1
  621. package/deps/rocksdb/rocksdb/tools/blob_dump.cc +2 -2
  622. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer.cc +6 -3
  623. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer.h +1 -0
  624. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_test.cc +9 -3
  625. package/deps/rocksdb/rocksdb/tools/db_bench.cc +1 -1
  626. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +1420 -611
  627. package/deps/rocksdb/rocksdb/tools/db_bench_tool_test.cc +11 -8
  628. package/deps/rocksdb/rocksdb/tools/db_repl_stress.cc +11 -1
  629. package/deps/rocksdb/rocksdb/tools/io_tracer_parser_test.cc +4 -2
  630. package/deps/rocksdb/rocksdb/tools/io_tracer_parser_tool.cc +46 -22
  631. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +655 -179
  632. package/deps/rocksdb/rocksdb/tools/ldb_cmd_impl.h +58 -6
  633. package/deps/rocksdb/rocksdb/tools/ldb_cmd_test.cc +472 -29
  634. package/deps/rocksdb/rocksdb/tools/ldb_tool.cc +23 -2
  635. package/deps/rocksdb/rocksdb/tools/reduce_levels_test.cc +2 -2
  636. package/deps/rocksdb/rocksdb/tools/simulated_hybrid_file_system.cc +246 -0
  637. package/deps/rocksdb/rocksdb/tools/simulated_hybrid_file_system.h +126 -0
  638. package/deps/rocksdb/rocksdb/tools/sst_dump_test.cc +83 -29
  639. package/deps/rocksdb/rocksdb/tools/sst_dump_tool.cc +38 -17
  640. package/deps/rocksdb/rocksdb/tools/trace_analyzer_test.cc +191 -55
  641. package/deps/rocksdb/rocksdb/tools/trace_analyzer_tool.cc +219 -296
  642. package/deps/rocksdb/rocksdb/tools/trace_analyzer_tool.h +87 -53
  643. package/deps/rocksdb/rocksdb/tools/write_stress.cc +8 -7
  644. package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer.cc +6 -5
  645. package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer.h +5 -4
  646. package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer_test.cc +14 -9
  647. package/deps/rocksdb/rocksdb/trace_replay/io_tracer.cc +134 -60
  648. package/deps/rocksdb/rocksdb/trace_replay/io_tracer.h +49 -38
  649. package/deps/rocksdb/rocksdb/trace_replay/io_tracer_test.cc +152 -15
  650. package/deps/rocksdb/rocksdb/trace_replay/trace_record.cc +206 -0
  651. package/deps/rocksdb/rocksdb/trace_replay/trace_record_handler.cc +190 -0
  652. package/deps/rocksdb/rocksdb/trace_replay/trace_record_handler.h +46 -0
  653. package/deps/rocksdb/rocksdb/trace_replay/trace_record_result.cc +146 -0
  654. package/deps/rocksdb/rocksdb/trace_replay/trace_replay.cc +475 -344
  655. package/deps/rocksdb/rocksdb/trace_replay/trace_replay.h +83 -95
  656. package/deps/rocksdb/rocksdb/util/autovector.h +38 -18
  657. package/deps/rocksdb/rocksdb/util/autovector_test.cc +1 -1
  658. package/deps/rocksdb/rocksdb/util/bloom_impl.h +4 -0
  659. package/deps/rocksdb/rocksdb/util/bloom_test.cc +276 -94
  660. package/deps/rocksdb/rocksdb/util/build_version.cc.in +81 -4
  661. package/deps/rocksdb/rocksdb/util/cast_util.h +22 -0
  662. package/deps/rocksdb/rocksdb/util/channel.h +2 -0
  663. package/deps/rocksdb/rocksdb/util/coding.h +1 -33
  664. package/deps/rocksdb/rocksdb/util/compaction_job_stats_impl.cc +8 -0
  665. package/deps/rocksdb/rocksdb/util/comparator.cc +163 -3
  666. package/deps/rocksdb/rocksdb/util/compression.cc +122 -0
  667. package/deps/rocksdb/rocksdb/util/compression.h +212 -7
  668. package/deps/rocksdb/rocksdb/util/compression_context_cache.cc +1 -3
  669. package/deps/rocksdb/rocksdb/util/crc32c.cc +165 -2
  670. package/deps/rocksdb/rocksdb/util/crc32c.h +6 -0
  671. package/deps/rocksdb/rocksdb/util/crc32c_arm64.cc +14 -0
  672. package/deps/rocksdb/rocksdb/util/crc32c_ppc.h +3 -0
  673. package/deps/rocksdb/rocksdb/util/crc32c_test.cc +47 -0
  674. package/deps/rocksdb/rocksdb/util/defer.h +30 -1
  675. package/deps/rocksdb/rocksdb/util/defer_test.cc +11 -0
  676. package/deps/rocksdb/rocksdb/util/duplicate_detector.h +3 -1
  677. package/deps/rocksdb/rocksdb/util/dynamic_bloom.h +3 -3
  678. package/deps/rocksdb/rocksdb/util/dynamic_bloom_test.cc +5 -4
  679. package/deps/rocksdb/rocksdb/util/fastrange.h +2 -0
  680. package/deps/rocksdb/rocksdb/util/file_checksum_helper.cc +36 -0
  681. package/deps/rocksdb/rocksdb/util/file_checksum_helper.h +3 -1
  682. package/deps/rocksdb/rocksdb/util/file_reader_writer_test.cc +512 -52
  683. package/deps/rocksdb/rocksdb/util/filter_bench.cc +65 -10
  684. package/deps/rocksdb/rocksdb/util/gflags_compat.h +6 -1
  685. package/deps/rocksdb/rocksdb/util/hash.cc +121 -3
  686. package/deps/rocksdb/rocksdb/util/hash.h +31 -1
  687. package/deps/rocksdb/rocksdb/util/hash128.h +26 -0
  688. package/deps/rocksdb/rocksdb/util/hash_containers.h +51 -0
  689. package/deps/rocksdb/rocksdb/util/hash_test.cc +194 -2
  690. package/deps/rocksdb/rocksdb/util/heap.h +6 -1
  691. package/deps/rocksdb/rocksdb/util/kv_map.h +1 -1
  692. package/deps/rocksdb/rocksdb/util/log_write_bench.cc +8 -6
  693. package/deps/rocksdb/rocksdb/util/math.h +74 -7
  694. package/deps/rocksdb/rocksdb/util/math128.h +13 -1
  695. package/deps/rocksdb/rocksdb/util/murmurhash.h +3 -3
  696. package/deps/rocksdb/rocksdb/util/random.cc +9 -0
  697. package/deps/rocksdb/rocksdb/util/random.h +6 -0
  698. package/deps/rocksdb/rocksdb/util/rate_limiter.cc +298 -144
  699. package/deps/rocksdb/rocksdb/util/rate_limiter.h +68 -19
  700. package/deps/rocksdb/rocksdb/util/rate_limiter_test.cc +335 -23
  701. package/deps/rocksdb/rocksdb/util/repeatable_thread.h +10 -12
  702. package/deps/rocksdb/rocksdb/util/repeatable_thread_test.cc +18 -15
  703. package/deps/rocksdb/rocksdb/util/ribbon_alg.h +98 -74
  704. package/deps/rocksdb/rocksdb/util/ribbon_config.cc +506 -0
  705. package/deps/rocksdb/rocksdb/util/ribbon_config.h +182 -0
  706. package/deps/rocksdb/rocksdb/util/ribbon_impl.h +154 -79
  707. package/deps/rocksdb/rocksdb/util/ribbon_test.cc +742 -365
  708. package/deps/rocksdb/rocksdb/util/set_comparator.h +2 -0
  709. package/deps/rocksdb/rocksdb/util/slice.cc +198 -35
  710. package/deps/rocksdb/rocksdb/util/slice_test.cc +30 -1
  711. package/deps/rocksdb/rocksdb/util/status.cc +32 -29
  712. package/deps/rocksdb/rocksdb/util/stop_watch.h +18 -18
  713. package/deps/rocksdb/rocksdb/util/string_util.cc +85 -6
  714. package/deps/rocksdb/rocksdb/util/string_util.h +47 -2
  715. package/deps/rocksdb/rocksdb/util/thread_guard.h +41 -0
  716. package/deps/rocksdb/rocksdb/util/thread_local.h +2 -2
  717. package/deps/rocksdb/rocksdb/util/thread_local_test.cc +22 -24
  718. package/deps/rocksdb/rocksdb/util/threadpool_imp.cc +7 -6
  719. package/deps/rocksdb/rocksdb/util/timer.h +55 -46
  720. package/deps/rocksdb/rocksdb/util/timer_test.cc +50 -48
  721. package/deps/rocksdb/rocksdb/util/user_comparator_wrapper.h +4 -0
  722. package/deps/rocksdb/rocksdb/util/vector_iterator.h +31 -15
  723. package/deps/rocksdb/rocksdb/util/work_queue.h +2 -0
  724. package/deps/rocksdb/rocksdb/util/xxhash.cc +35 -1144
  725. package/deps/rocksdb/rocksdb/util/xxhash.h +5117 -373
  726. package/deps/rocksdb/rocksdb/util/xxph3.h +1762 -0
  727. package/deps/rocksdb/rocksdb/utilities/agg_merge/agg_merge.cc +238 -0
  728. package/deps/rocksdb/rocksdb/utilities/agg_merge/agg_merge.h +49 -0
  729. package/deps/rocksdb/rocksdb/utilities/agg_merge/agg_merge_test.cc +134 -0
  730. package/deps/rocksdb/rocksdb/utilities/agg_merge/test_agg_merge.cc +104 -0
  731. package/deps/rocksdb/rocksdb/utilities/agg_merge/test_agg_merge.h +47 -0
  732. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +3164 -0
  733. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_impl.h +29 -0
  734. package/deps/rocksdb/rocksdb/utilities/{backupable/backupable_db_test.cc → backup/backup_engine_test.cc} +1679 -485
  735. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_compaction_filter.cc +6 -4
  736. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_compaction_filter.h +14 -9
  737. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db.cc +2 -0
  738. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db.h +1 -0
  739. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_gc_stats.h +4 -0
  740. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.cc +37 -27
  741. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.h +8 -4
  742. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl_filesnapshot.cc +1 -1
  743. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_iterator.h +13 -10
  744. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_listener.h +5 -0
  745. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_test.cc +44 -25
  746. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.cc +3 -4
  747. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_file.cc +27 -19
  748. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_file.h +4 -2
  749. package/deps/rocksdb/rocksdb/utilities/cache_dump_load.cc +69 -0
  750. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.cc +489 -0
  751. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.h +366 -0
  752. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_compaction_filter.cc +67 -4
  753. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_compaction_filter.h +21 -6
  754. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_functional_test.cc +107 -7
  755. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_options.h +43 -0
  756. package/deps/rocksdb/rocksdb/utilities/cassandra/format.h +1 -1
  757. package/deps/rocksdb/rocksdb/utilities/cassandra/merge_operator.cc +24 -8
  758. package/deps/rocksdb/rocksdb/utilities/cassandra/merge_operator.h +7 -7
  759. package/deps/rocksdb/rocksdb/utilities/cassandra/serialize.h +5 -0
  760. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_impl.cc +99 -218
  761. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_impl.h +8 -24
  762. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_test.cc +114 -1
  763. package/deps/rocksdb/rocksdb/utilities/compaction_filters/layered_compaction_filter_base.h +6 -2
  764. package/deps/rocksdb/rocksdb/utilities/compaction_filters/remove_emptyvalue_compactionfilter.cc +0 -4
  765. package/deps/rocksdb/rocksdb/utilities/compaction_filters/remove_emptyvalue_compactionfilter.h +7 -6
  766. package/deps/rocksdb/rocksdb/utilities/compaction_filters.cc +56 -0
  767. package/deps/rocksdb/rocksdb/utilities/convenience/info_log_finder.cc +2 -2
  768. package/deps/rocksdb/rocksdb/utilities/counted_fs.cc +355 -0
  769. package/deps/rocksdb/rocksdb/utilities/counted_fs.h +152 -0
  770. package/deps/rocksdb/rocksdb/utilities/env_mirror.cc +13 -0
  771. package/deps/rocksdb/rocksdb/utilities/env_timed.cc +164 -122
  772. package/deps/rocksdb/rocksdb/utilities/env_timed.h +97 -0
  773. package/deps/rocksdb/rocksdb/utilities/fault_injection_env.cc +75 -17
  774. package/deps/rocksdb/rocksdb/utilities/fault_injection_env.h +19 -3
  775. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +539 -126
  776. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +162 -17
  777. package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.cc +110 -0
  778. package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.h +94 -0
  779. package/deps/rocksdb/rocksdb/utilities/memory/memory_test.cc +5 -2
  780. package/deps/rocksdb/rocksdb/utilities/memory_allocators.h +104 -0
  781. package/deps/rocksdb/rocksdb/utilities/merge_operators/bytesxor.h +5 -3
  782. package/deps/rocksdb/rocksdb/utilities/merge_operators/max.cc +4 -1
  783. package/deps/rocksdb/rocksdb/utilities/merge_operators/put.cc +11 -3
  784. package/deps/rocksdb/rocksdb/utilities/merge_operators/sortlist.cc +0 -2
  785. package/deps/rocksdb/rocksdb/utilities/merge_operators/sortlist.h +5 -1
  786. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend.cc +29 -10
  787. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend.h +6 -3
  788. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend2.cc +29 -14
  789. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend2.h +6 -3
  790. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend_test.cc +71 -18
  791. package/deps/rocksdb/rocksdb/utilities/merge_operators/uint64add.cc +15 -9
  792. package/deps/rocksdb/rocksdb/utilities/merge_operators.cc +120 -0
  793. package/deps/rocksdb/rocksdb/utilities/merge_operators.h +3 -23
  794. package/deps/rocksdb/rocksdb/utilities/object_registry.cc +267 -42
  795. package/deps/rocksdb/rocksdb/utilities/object_registry_test.cc +702 -76
  796. package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration.cc +1 -1
  797. package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration_test.cc +26 -5
  798. package/deps/rocksdb/rocksdb/utilities/options/options_util.cc +1 -1
  799. package/deps/rocksdb/rocksdb/utilities/options/options_util_test.cc +124 -1
  800. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier.cc +2 -3
  801. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier.h +8 -9
  802. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.cc +15 -13
  803. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.h +1 -1
  804. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_metadata.h +4 -4
  805. package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table_evictable.h +2 -2
  806. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_bench.cc +8 -9
  807. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_test.cc +1 -1
  808. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_tier.h +6 -3
  809. package/deps/rocksdb/rocksdb/utilities/persistent_cache/volatile_tier_impl.h +2 -2
  810. package/deps/rocksdb/rocksdb/utilities/simulator_cache/cache_simulator.cc +3 -0
  811. package/deps/rocksdb/rocksdb/utilities/simulator_cache/cache_simulator_test.cc +2 -0
  812. package/deps/rocksdb/rocksdb/utilities/simulator_cache/sim_cache.cc +43 -35
  813. package/deps/rocksdb/rocksdb/utilities/simulator_cache/sim_cache_test.cc +20 -18
  814. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector.cc +107 -2
  815. package/deps/rocksdb/rocksdb/utilities/trace/file_trace_reader_writer.cc +23 -15
  816. package/deps/rocksdb/rocksdb/utilities/trace/file_trace_reader_writer.h +2 -2
  817. package/deps/rocksdb/rocksdb/utilities/trace/replayer_impl.cc +316 -0
  818. package/deps/rocksdb/rocksdb/utilities/trace/replayer_impl.h +86 -0
  819. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager.cc +4 -5
  820. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager.h +4 -3
  821. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager_test.h +1 -1
  822. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_locking_test.cc +119 -3
  823. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/locktree.cc +20 -3
  824. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/locktree.h +20 -0
  825. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_external_pthread.h +3 -2
  826. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_time.h +4 -0
  827. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_manager.cc +38 -14
  828. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_manager.h +17 -10
  829. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_db_impl.h +1 -0
  830. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_test.cc +1 -2
  831. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +423 -34
  832. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.h +82 -2
  833. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction_db.cc +72 -40
  834. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction_db.h +32 -1
  835. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.cc +13 -5
  836. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.h +7 -3
  837. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +207 -43
  838. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.h +50 -7
  839. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_util.cc +28 -10
  840. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_util.h +11 -6
  841. package/deps/rocksdb/rocksdb/utilities/transactions/write_committed_transaction_ts_test.cc +516 -0
  842. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_transaction_test.cc +506 -15
  843. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.cc +27 -13
  844. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.cc +14 -14
  845. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.h +3 -0
  846. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_transaction_test.cc +2 -2
  847. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.cc +14 -5
  848. package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.cc +305 -27
  849. package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.h +55 -159
  850. package/deps/rocksdb/rocksdb/utilities/ttl/ttl_test.cc +209 -2
  851. package/deps/rocksdb/rocksdb/utilities/wal_filter.cc +23 -0
  852. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +157 -88
  853. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.cc +501 -114
  854. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.h +91 -316
  855. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +1212 -672
  856. package/deps/rocksdb/rocksdb.gyp +425 -446
  857. package/index.js +5 -87
  858. package/package-lock.json +23687 -0
  859. package/package.json +8 -9
  860. package/prebuilds/darwin-arm64/node.napi.node +0 -0
  861. package/prebuilds/darwin-x64/node.napi.node +0 -0
  862. package/prebuilds/{darwin-x64+arm64 → linux-x64}/node.napi.node +0 -0
  863. package/deps/rocksdb/rocksdb/README.md +0 -32
  864. package/deps/rocksdb/rocksdb/env/env_hdfs.cc +0 -648
  865. package/deps/rocksdb/rocksdb/hdfs/README +0 -23
  866. package/deps/rocksdb/rocksdb/hdfs/env_hdfs.h +0 -386
  867. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/backupable_db.h +0 -535
  868. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/env_librados.h +0 -175
  869. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/utility_db.h +0 -34
  870. package/deps/rocksdb/rocksdb/memory/memkind_kmem_allocator_test.cc +0 -102
  871. package/deps/rocksdb/rocksdb/memtable/hash_linklist_rep.h +0 -49
  872. package/deps/rocksdb/rocksdb/memtable/hash_skiplist_rep.h +0 -44
  873. package/deps/rocksdb/rocksdb/options/customizable_helper.h +0 -216
  874. package/deps/rocksdb/rocksdb/port/README +0 -10
  875. package/deps/rocksdb/rocksdb/third-party/folly/folly/CPortability.h +0 -27
  876. package/deps/rocksdb/rocksdb/third-party/folly/folly/ConstexprMath.h +0 -45
  877. package/deps/rocksdb/rocksdb/third-party/folly/folly/Indestructible.h +0 -166
  878. package/deps/rocksdb/rocksdb/third-party/folly/folly/Optional.h +0 -570
  879. package/deps/rocksdb/rocksdb/third-party/folly/folly/Portability.h +0 -92
  880. package/deps/rocksdb/rocksdb/third-party/folly/folly/ScopeGuard.h +0 -54
  881. package/deps/rocksdb/rocksdb/third-party/folly/folly/Traits.h +0 -152
  882. package/deps/rocksdb/rocksdb/third-party/folly/folly/Unit.h +0 -59
  883. package/deps/rocksdb/rocksdb/third-party/folly/folly/Utility.h +0 -141
  884. package/deps/rocksdb/rocksdb/third-party/folly/folly/chrono/Hardware.h +0 -33
  885. package/deps/rocksdb/rocksdb/third-party/folly/folly/container/Array.h +0 -74
  886. package/deps/rocksdb/rocksdb/third-party/folly/folly/detail/Futex-inl.h +0 -117
  887. package/deps/rocksdb/rocksdb/third-party/folly/folly/detail/Futex.cpp +0 -263
  888. package/deps/rocksdb/rocksdb/third-party/folly/folly/detail/Futex.h +0 -96
  889. package/deps/rocksdb/rocksdb/third-party/folly/folly/functional/Invoke.h +0 -40
  890. package/deps/rocksdb/rocksdb/third-party/folly/folly/hash/Hash.h +0 -29
  891. package/deps/rocksdb/rocksdb/third-party/folly/folly/lang/Align.h +0 -144
  892. package/deps/rocksdb/rocksdb/third-party/folly/folly/lang/Bits.h +0 -30
  893. package/deps/rocksdb/rocksdb/third-party/folly/folly/lang/Launder.h +0 -51
  894. package/deps/rocksdb/rocksdb/third-party/folly/folly/portability/Asm.h +0 -28
  895. package/deps/rocksdb/rocksdb/third-party/folly/folly/portability/SysSyscall.h +0 -10
  896. package/deps/rocksdb/rocksdb/third-party/folly/folly/portability/SysTypes.h +0 -26
  897. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicNotification-inl.h +0 -138
  898. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicNotification.cpp +0 -23
  899. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicNotification.h +0 -57
  900. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicUtil-inl.h +0 -260
  901. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicUtil.h +0 -52
  902. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/Baton.h +0 -328
  903. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/DistributedMutex-inl.h +0 -1703
  904. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/DistributedMutex.cpp +0 -16
  905. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/DistributedMutex.h +0 -304
  906. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/DistributedMutexSpecializations.h +0 -39
  907. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/ParkingLot.cpp +0 -26
  908. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/ParkingLot.h +0 -318
  909. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/WaitOptions.h +0 -57
  910. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/InlineFunctionRef.h +0 -219
  911. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/ProxyLockable-inl.h +0 -207
  912. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/ProxyLockable.h +0 -164
  913. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/Sleeper.h +0 -57
  914. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/Spin.h +0 -77
  915. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/test/DistributedMutexTest.cpp +0 -1145
  916. package/deps/rocksdb/rocksdb/util/build_version.h +0 -15
  917. package/deps/rocksdb/rocksdb/util/xxh3p.h +0 -1392
  918. package/deps/rocksdb/rocksdb/utilities/backupable/backupable_db.cc +0 -2354
  919. package/deps/rocksdb/rocksdb/utilities/env_librados.cc +0 -1497
  920. package/deps/rocksdb/rocksdb/utilities/env_librados_test.cc +0 -1146
  921. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/README +0 -13
  922. package/deps/snappy/snappy-1.1.7/README.md +0 -149
  923. package/prebuilds/linux-x64/node.napi.glibc.node +0 -0
@@ -10,15 +10,19 @@
10
10
  #ifndef ROCKSDB_LITE
11
11
 
12
12
  #include "rocksdb/utilities/write_batch_with_index.h"
13
+
13
14
  #include <map>
14
15
  #include <memory>
16
+
15
17
  #include "db/column_family.h"
16
18
  #include "port/stack_trace.h"
17
19
  #include "test_util/testharness.h"
20
+ #include "test_util/testutil.h"
18
21
  #include "util/random.h"
19
22
  #include "util/string_util.h"
20
23
  #include "utilities/merge_operators.h"
21
24
  #include "utilities/merge_operators/string_append/stringappend.h"
25
+ #include "utilities/write_batch_with_index/write_batch_with_index_internal.h"
22
26
 
23
27
  namespace ROCKSDB_NAMESPACE {
24
28
 
@@ -73,9 +77,242 @@ struct TestHandler : public WriteBatch::Handler {
73
77
  return Status::OK();
74
78
  }
75
79
  };
80
+
81
+ using KVMap = std::map<std::string, std::string>;
82
+
83
+ class KVIter : public Iterator {
84
+ public:
85
+ explicit KVIter(const KVMap* map) : map_(map), iter_(map_->end()) {}
86
+ bool Valid() const override { return iter_ != map_->end(); }
87
+ void SeekToFirst() override { iter_ = map_->begin(); }
88
+ void SeekToLast() override {
89
+ if (map_->empty()) {
90
+ iter_ = map_->end();
91
+ } else {
92
+ iter_ = map_->find(map_->rbegin()->first);
93
+ }
94
+ }
95
+ void Seek(const Slice& k) override {
96
+ iter_ = map_->lower_bound(k.ToString());
97
+ }
98
+ void SeekForPrev(const Slice& k) override {
99
+ iter_ = map_->upper_bound(k.ToString());
100
+ Prev();
101
+ }
102
+ void Next() override { ++iter_; }
103
+ void Prev() override {
104
+ if (iter_ == map_->begin()) {
105
+ iter_ = map_->end();
106
+ return;
107
+ }
108
+ --iter_;
109
+ }
110
+ Slice key() const override { return iter_->first; }
111
+ Slice value() const override { return iter_->second; }
112
+ Status status() const override { return Status::OK(); }
113
+
114
+ private:
115
+ const KVMap* const map_;
116
+ KVMap::const_iterator iter_;
117
+ };
118
+
119
+ static std::string PrintContents(WriteBatchWithIndex* batch,
120
+ ColumnFamilyHandle* column_family,
121
+ bool hex = false) {
122
+ std::string result;
123
+
124
+ WBWIIterator* iter;
125
+ if (column_family == nullptr) {
126
+ iter = batch->NewIterator();
127
+ } else {
128
+ iter = batch->NewIterator(column_family);
129
+ }
130
+
131
+ iter->SeekToFirst();
132
+ while (iter->Valid()) {
133
+ WriteEntry e = iter->Entry();
134
+
135
+ if (e.type == kPutRecord) {
136
+ result.append("PUT(");
137
+ result.append(e.key.ToString(hex));
138
+ result.append("):");
139
+ result.append(e.value.ToString(hex));
140
+ } else if (e.type == kMergeRecord) {
141
+ result.append("MERGE(");
142
+ result.append(e.key.ToString(hex));
143
+ result.append("):");
144
+ result.append(e.value.ToString(hex));
145
+ } else if (e.type == kSingleDeleteRecord) {
146
+ result.append("SINGLE-DEL(");
147
+ result.append(e.key.ToString(hex));
148
+ result.append(")");
149
+ } else {
150
+ assert(e.type == kDeleteRecord);
151
+ result.append("DEL(");
152
+ result.append(e.key.ToString(hex));
153
+ result.append(")");
154
+ }
155
+
156
+ result.append(",");
157
+ iter->Next();
158
+ }
159
+
160
+ delete iter;
161
+ return result;
162
+ }
163
+
164
+ static std::string PrintContents(WriteBatchWithIndex* batch, KVMap* base_map,
165
+ ColumnFamilyHandle* column_family) {
166
+ std::string result;
167
+
168
+ Iterator* iter;
169
+ if (column_family == nullptr) {
170
+ iter = batch->NewIteratorWithBase(new KVIter(base_map));
171
+ } else {
172
+ iter = batch->NewIteratorWithBase(column_family, new KVIter(base_map));
173
+ }
174
+
175
+ iter->SeekToFirst();
176
+ while (iter->Valid()) {
177
+ assert(iter->status().ok());
178
+
179
+ Slice key = iter->key();
180
+ Slice value = iter->value();
181
+
182
+ result.append(key.ToString());
183
+ result.append(":");
184
+ result.append(value.ToString());
185
+ result.append(",");
186
+
187
+ iter->Next();
188
+ }
189
+
190
+ delete iter;
191
+ return result;
192
+ }
193
+
194
+ void AssertIter(Iterator* iter, const std::string& key,
195
+ const std::string& value) {
196
+ ASSERT_OK(iter->status());
197
+ ASSERT_TRUE(iter->Valid());
198
+ ASSERT_EQ(key, iter->key().ToString());
199
+ ASSERT_EQ(value, iter->value().ToString());
200
+ }
201
+
202
+ void AssertItersMatch(Iterator* iter1, Iterator* iter2) {
203
+ ASSERT_EQ(iter1->Valid(), iter2->Valid());
204
+ if (iter1->Valid()) {
205
+ ASSERT_EQ(iter1->key().ToString(), iter2->key().ToString());
206
+ ASSERT_EQ(iter1->value().ToString(), iter2->value().ToString());
207
+ }
208
+ }
209
+
210
+ void AssertItersEqual(Iterator* iter1, Iterator* iter2) {
211
+ iter1->SeekToFirst();
212
+ iter2->SeekToFirst();
213
+ while (iter1->Valid()) {
214
+ ASSERT_EQ(iter1->Valid(), iter2->Valid());
215
+ ASSERT_EQ(iter1->key().ToString(), iter2->key().ToString());
216
+ ASSERT_EQ(iter1->value().ToString(), iter2->value().ToString());
217
+ iter1->Next();
218
+ iter2->Next();
219
+ }
220
+ ASSERT_EQ(iter1->Valid(), iter2->Valid());
221
+ }
222
+
223
+ void AssertIterEqual(WBWIIteratorImpl* wbwii,
224
+ const std::vector<std::string>& keys) {
225
+ wbwii->SeekToFirst();
226
+ for (auto k : keys) {
227
+ ASSERT_TRUE(wbwii->Valid());
228
+ ASSERT_EQ(wbwii->Entry().key, k);
229
+ wbwii->NextKey();
230
+ }
231
+ ASSERT_FALSE(wbwii->Valid());
232
+ wbwii->SeekToLast();
233
+ for (auto kit = keys.rbegin(); kit != keys.rend(); ++kit) {
234
+ ASSERT_TRUE(wbwii->Valid());
235
+ ASSERT_EQ(wbwii->Entry().key, *kit);
236
+ wbwii->PrevKey();
237
+ }
238
+ ASSERT_FALSE(wbwii->Valid());
239
+ }
76
240
  } // namespace anonymous
77
241
 
78
- class WriteBatchWithIndexTest : public testing::Test {};
242
+ class WBWIBaseTest : public testing::Test {
243
+ public:
244
+ explicit WBWIBaseTest(bool overwrite) : db_(nullptr) {
245
+ options_.merge_operator =
246
+ MergeOperators::CreateFromStringId("stringappend");
247
+ options_.create_if_missing = true;
248
+ dbname_ = test::PerThreadDBPath("write_batch_with_index_test");
249
+ DestroyDB(dbname_, options_);
250
+ batch_.reset(new WriteBatchWithIndex(BytewiseComparator(), 20, overwrite));
251
+ }
252
+
253
+ virtual ~WBWIBaseTest() {
254
+ if (db_ != nullptr) {
255
+ ReleaseSnapshot();
256
+ delete db_;
257
+ DestroyDB(dbname_, options_);
258
+ }
259
+ }
260
+
261
+ std::string AddToBatch(ColumnFamilyHandle* cf, const std::string& key) {
262
+ std::string result;
263
+ for (size_t i = 0; i < key.size(); i++) {
264
+ if (key[i] == 'd') {
265
+ batch_->Delete(cf, key);
266
+ result = "";
267
+ } else if (key[i] == 'p') {
268
+ result = key + ToString(i);
269
+ batch_->Put(cf, key, result);
270
+ } else if (key[i] == 'm') {
271
+ std::string value = key + ToString(i);
272
+ batch_->Merge(cf, key, value);
273
+ if (result.empty()) {
274
+ result = value;
275
+ } else {
276
+ result = result + "," + value;
277
+ }
278
+ }
279
+ }
280
+ return result;
281
+ }
282
+
283
+ virtual Status OpenDB() { return DB::Open(options_, dbname_, &db_); }
284
+
285
+ void ReleaseSnapshot() {
286
+ if (read_opts_.snapshot != nullptr) {
287
+ EXPECT_NE(db_, nullptr);
288
+ db_->ReleaseSnapshot(read_opts_.snapshot);
289
+ read_opts_.snapshot = nullptr;
290
+ }
291
+ }
292
+
293
+ public:
294
+ DB* db_;
295
+ std::string dbname_;
296
+ Options options_;
297
+ WriteOptions write_opts_;
298
+ ReadOptions read_opts_;
299
+ std::unique_ptr<WriteBatchWithIndex> batch_;
300
+ };
301
+
302
+ class WBWIKeepTest : public WBWIBaseTest {
303
+ public:
304
+ WBWIKeepTest() : WBWIBaseTest(false) {}
305
+ };
306
+
307
+ class WBWIOverwriteTest : public WBWIBaseTest {
308
+ public:
309
+ WBWIOverwriteTest() : WBWIBaseTest(true) {}
310
+ };
311
+ class WriteBatchWithIndexTest : public WBWIBaseTest,
312
+ public testing::WithParamInterface<bool> {
313
+ public:
314
+ WriteBatchWithIndexTest() : WBWIBaseTest(GetParam()) {}
315
+ };
79
316
 
80
317
  void TestValueAsSecondaryIndexHelper(std::vector<Entry> entries,
81
318
  WriteBatchWithIndex* batch) {
@@ -273,7 +510,7 @@ void TestValueAsSecondaryIndexHelper(std::vector<Entry> entries,
273
510
  }
274
511
  }
275
512
 
276
- TEST_F(WriteBatchWithIndexTest, TestValueAsSecondaryIndex) {
513
+ TEST_F(WBWIKeepTest, TestValueAsSecondaryIndex) {
277
514
  Entry entries[] = {
278
515
  {"aaa", "0005", kPutRecord},
279
516
  {"b", "0002", kPutRecord},
@@ -286,12 +523,12 @@ TEST_F(WriteBatchWithIndexTest, TestValueAsSecondaryIndex) {
286
523
  };
287
524
  std::vector<Entry> entries_list(entries, entries + 8);
288
525
 
289
- WriteBatchWithIndex batch(nullptr, 20);
526
+ batch_.reset(new WriteBatchWithIndex(nullptr, 20, false));
290
527
 
291
- TestValueAsSecondaryIndexHelper(entries_list, &batch);
528
+ TestValueAsSecondaryIndexHelper(entries_list, batch_.get());
292
529
 
293
530
  // Clear batch and re-run test with new values
294
- batch.Clear();
531
+ batch_->Clear();
295
532
 
296
533
  Entry new_entries[] = {
297
534
  {"aaa", "0005", kPutRecord},
@@ -306,30 +543,29 @@ TEST_F(WriteBatchWithIndexTest, TestValueAsSecondaryIndex) {
306
543
 
307
544
  entries_list = std::vector<Entry>(new_entries, new_entries + 8);
308
545
 
309
- TestValueAsSecondaryIndexHelper(entries_list, &batch);
546
+ TestValueAsSecondaryIndexHelper(entries_list, batch_.get());
310
547
  }
311
548
 
312
- TEST_F(WriteBatchWithIndexTest, TestComparatorForCF) {
549
+ TEST_P(WriteBatchWithIndexTest, TestComparatorForCF) {
313
550
  ColumnFamilyHandleImplDummy cf1(6, nullptr);
314
551
  ColumnFamilyHandleImplDummy reverse_cf(66, ReverseBytewiseComparator());
315
552
  ColumnFamilyHandleImplDummy cf2(88, BytewiseComparator());
316
- WriteBatchWithIndex batch(BytewiseComparator(), 20);
317
553
 
318
- ASSERT_OK(batch.Put(&cf1, "ddd", ""));
319
- ASSERT_OK(batch.Put(&cf2, "aaa", ""));
320
- ASSERT_OK(batch.Put(&cf2, "eee", ""));
321
- ASSERT_OK(batch.Put(&cf1, "ccc", ""));
322
- ASSERT_OK(batch.Put(&reverse_cf, "a11", ""));
323
- ASSERT_OK(batch.Put(&cf1, "bbb", ""));
554
+ ASSERT_OK(batch_->Put(&cf1, "ddd", ""));
555
+ ASSERT_OK(batch_->Put(&cf2, "aaa", ""));
556
+ ASSERT_OK(batch_->Put(&cf2, "eee", ""));
557
+ ASSERT_OK(batch_->Put(&cf1, "ccc", ""));
558
+ ASSERT_OK(batch_->Put(&reverse_cf, "a11", ""));
559
+ ASSERT_OK(batch_->Put(&cf1, "bbb", ""));
324
560
 
325
561
  Slice key_slices[] = {"a", "3", "3"};
326
562
  Slice value_slice = "";
327
- ASSERT_OK(batch.Put(&reverse_cf, SliceParts(key_slices, 3),
328
- SliceParts(&value_slice, 1)));
329
- ASSERT_OK(batch.Put(&reverse_cf, "a22", ""));
563
+ ASSERT_OK(batch_->Put(&reverse_cf, SliceParts(key_slices, 3),
564
+ SliceParts(&value_slice, 1)));
565
+ ASSERT_OK(batch_->Put(&reverse_cf, "a22", ""));
330
566
 
331
567
  {
332
- std::unique_ptr<WBWIIterator> iter(batch.NewIterator(&cf1));
568
+ std::unique_ptr<WBWIIterator> iter(batch_->NewIterator(&cf1));
333
569
  iter->Seek("");
334
570
  ASSERT_OK(iter->status());
335
571
  ASSERT_TRUE(iter->Valid());
@@ -348,7 +584,7 @@ TEST_F(WriteBatchWithIndexTest, TestComparatorForCF) {
348
584
  }
349
585
 
350
586
  {
351
- std::unique_ptr<WBWIIterator> iter(batch.NewIterator(&cf2));
587
+ std::unique_ptr<WBWIIterator> iter(batch_->NewIterator(&cf2));
352
588
  iter->Seek("");
353
589
  ASSERT_OK(iter->status());
354
590
  ASSERT_TRUE(iter->Valid());
@@ -363,7 +599,7 @@ TEST_F(WriteBatchWithIndexTest, TestComparatorForCF) {
363
599
  }
364
600
 
365
601
  {
366
- std::unique_ptr<WBWIIterator> iter(batch.NewIterator(&reverse_cf));
602
+ std::unique_ptr<WBWIIterator> iter(batch_->NewIterator(&reverse_cf));
367
603
  iter->Seek("");
368
604
  ASSERT_OK(iter->status());
369
605
  ASSERT_TRUE(!iter->Valid());
@@ -396,29 +632,28 @@ TEST_F(WriteBatchWithIndexTest, TestComparatorForCF) {
396
632
  }
397
633
  }
398
634
 
399
- TEST_F(WriteBatchWithIndexTest, TestOverwriteKey) {
635
+ TEST_F(WBWIOverwriteTest, TestOverwriteKey) {
400
636
  ColumnFamilyHandleImplDummy cf1(6, nullptr);
401
637
  ColumnFamilyHandleImplDummy reverse_cf(66, ReverseBytewiseComparator());
402
638
  ColumnFamilyHandleImplDummy cf2(88, BytewiseComparator());
403
- WriteBatchWithIndex batch(BytewiseComparator(), 20, true);
404
-
405
- ASSERT_OK(batch.Put(&cf1, "ddd", ""));
406
- ASSERT_OK(batch.Merge(&cf1, "ddd", ""));
407
- ASSERT_OK(batch.Delete(&cf1, "ddd"));
408
- ASSERT_OK(batch.Put(&cf2, "aaa", ""));
409
- ASSERT_OK(batch.Delete(&cf2, "aaa"));
410
- ASSERT_OK(batch.Put(&cf2, "aaa", "aaa"));
411
- ASSERT_OK(batch.Put(&cf2, "eee", "eee"));
412
- ASSERT_OK(batch.Put(&cf1, "ccc", ""));
413
- ASSERT_OK(batch.Put(&reverse_cf, "a11", ""));
414
- ASSERT_OK(batch.Delete(&cf1, "ccc"));
415
- ASSERT_OK(batch.Put(&reverse_cf, "a33", "a33"));
416
- ASSERT_OK(batch.Put(&reverse_cf, "a11", "a11"));
639
+
640
+ ASSERT_OK(batch_->Merge(&cf1, "ddd", ""));
641
+ ASSERT_OK(batch_->Put(&cf1, "ddd", ""));
642
+ ASSERT_OK(batch_->Delete(&cf1, "ddd"));
643
+ ASSERT_OK(batch_->Put(&cf2, "aaa", ""));
644
+ ASSERT_OK(batch_->Delete(&cf2, "aaa"));
645
+ ASSERT_OK(batch_->Put(&cf2, "aaa", "aaa"));
646
+ ASSERT_OK(batch_->Put(&cf2, "eee", "eee"));
647
+ ASSERT_OK(batch_->Put(&cf1, "ccc", ""));
648
+ ASSERT_OK(batch_->Put(&reverse_cf, "a11", ""));
649
+ ASSERT_OK(batch_->Delete(&cf1, "ccc"));
650
+ ASSERT_OK(batch_->Put(&reverse_cf, "a33", "a33"));
651
+ ASSERT_OK(batch_->Put(&reverse_cf, "a11", "a11"));
417
652
  Slice slices[] = {"a", "3", "3"};
418
- ASSERT_OK(batch.Delete(&reverse_cf, SliceParts(slices, 3)));
653
+ ASSERT_OK(batch_->Delete(&reverse_cf, SliceParts(slices, 3)));
419
654
 
420
655
  {
421
- std::unique_ptr<WBWIIterator> iter(batch.NewIterator(&cf1));
656
+ std::unique_ptr<WBWIIterator> iter(batch_->NewIterator(&cf1));
422
657
  iter->Seek("");
423
658
  ASSERT_OK(iter->status());
424
659
  ASSERT_TRUE(iter->Valid());
@@ -435,7 +670,7 @@ TEST_F(WriteBatchWithIndexTest, TestOverwriteKey) {
435
670
  }
436
671
 
437
672
  {
438
- std::unique_ptr<WBWIIterator> iter(batch.NewIterator(&cf2));
673
+ std::unique_ptr<WBWIIterator> iter(batch_->NewIterator(&cf2));
439
674
  iter->SeekToLast();
440
675
  ASSERT_OK(iter->status());
441
676
  ASSERT_TRUE(iter->Valid());
@@ -466,7 +701,7 @@ TEST_F(WriteBatchWithIndexTest, TestOverwriteKey) {
466
701
  }
467
702
 
468
703
  {
469
- std::unique_ptr<WBWIIterator> iter(batch.NewIterator(&reverse_cf));
704
+ std::unique_ptr<WBWIIterator> iter(batch_->NewIterator(&reverse_cf));
470
705
  iter->Seek("");
471
706
  ASSERT_OK(iter->status());
472
707
  ASSERT_TRUE(!iter->Valid());
@@ -500,64 +735,33 @@ TEST_F(WriteBatchWithIndexTest, TestOverwriteKey) {
500
735
  }
501
736
  }
502
737
 
503
- namespace {
504
- typedef std::map<std::string, std::string> KVMap;
505
-
506
- class KVIter : public Iterator {
507
- public:
508
- explicit KVIter(const KVMap* map) : map_(map), iter_(map_->end()) {}
509
- bool Valid() const override { return iter_ != map_->end(); }
510
- void SeekToFirst() override { iter_ = map_->begin(); }
511
- void SeekToLast() override {
512
- if (map_->empty()) {
513
- iter_ = map_->end();
514
- } else {
515
- iter_ = map_->find(map_->rbegin()->first);
516
- }
517
- }
518
- void Seek(const Slice& k) override {
519
- iter_ = map_->lower_bound(k.ToString());
520
- }
521
- void SeekForPrev(const Slice& k) override {
522
- iter_ = map_->upper_bound(k.ToString());
523
- Prev();
524
- }
525
- void Next() override { ++iter_; }
526
- void Prev() override {
527
- if (iter_ == map_->begin()) {
528
- iter_ = map_->end();
529
- return;
530
- }
531
- --iter_;
532
- }
533
-
534
- Slice key() const override { return iter_->first; }
535
- Slice value() const override { return iter_->second; }
536
- Status status() const override { return Status::OK(); }
537
-
538
- private:
539
- const KVMap* const map_;
540
- KVMap::const_iterator iter_;
541
- };
542
-
543
- void AssertIter(Iterator* iter, const std::string& key,
544
- const std::string& value) {
545
- ASSERT_OK(iter->status());
546
- ASSERT_TRUE(iter->Valid());
547
- ASSERT_EQ(key, iter->key().ToString());
548
- ASSERT_EQ(value, iter->value().ToString());
549
- }
550
-
551
- void AssertItersEqual(Iterator* iter1, Iterator* iter2) {
552
- ASSERT_EQ(iter1->Valid(), iter2->Valid());
553
- if (iter1->Valid()) {
554
- ASSERT_EQ(iter1->key().ToString(), iter2->key().ToString());
555
- ASSERT_EQ(iter1->value().ToString(), iter2->value().ToString());
556
- }
738
+ TEST_P(WriteBatchWithIndexTest, TestWBWIIterator) {
739
+ ColumnFamilyHandleImplDummy cf1(1, BytewiseComparator());
740
+ ColumnFamilyHandleImplDummy cf2(2, BytewiseComparator());
741
+ ASSERT_OK(batch_->Put(&cf1, "a", "a1"));
742
+ ASSERT_OK(batch_->Put(&cf1, "c", "c1"));
743
+ ASSERT_OK(batch_->Put(&cf1, "c", "c2"));
744
+ ASSERT_OK(batch_->Put(&cf1, "e", "e1"));
745
+ ASSERT_OK(batch_->Put(&cf1, "e", "e2"));
746
+ ASSERT_OK(batch_->Put(&cf1, "e", "e3"));
747
+ std::unique_ptr<WBWIIteratorImpl> iter1(
748
+ static_cast<WBWIIteratorImpl*>(batch_->NewIterator(&cf1)));
749
+ std::unique_ptr<WBWIIteratorImpl> iter2(
750
+ static_cast<WBWIIteratorImpl*>(batch_->NewIterator(&cf2)));
751
+ AssertIterEqual(iter1.get(), {"a", "c", "e"});
752
+ AssertIterEqual(iter2.get(), {});
753
+ ASSERT_OK(batch_->Put(&cf2, "a", "a2"));
754
+ ASSERT_OK(batch_->Merge(&cf2, "b", "b1"));
755
+ ASSERT_OK(batch_->Merge(&cf2, "b", "b2"));
756
+ ASSERT_OK(batch_->Delete(&cf2, "d"));
757
+ ASSERT_OK(batch_->Merge(&cf2, "d", "d2"));
758
+ ASSERT_OK(batch_->Merge(&cf2, "d", "d3"));
759
+ ASSERT_OK(batch_->Delete(&cf2, "f"));
760
+ AssertIterEqual(iter1.get(), {"a", "c", "e"});
761
+ AssertIterEqual(iter2.get(), {"a", "b", "d", "f"});
557
762
  }
558
- } // namespace
559
763
 
560
- TEST_F(WriteBatchWithIndexTest, TestRandomIteraratorWithBase) {
764
+ TEST_P(WriteBatchWithIndexTest, TestRandomIteraratorWithBase) {
561
765
  std::vector<std::string> source_strings = {"a", "b", "c", "d", "e",
562
766
  "f", "g", "h", "i", "j"};
563
767
  for (int rand_seed = 301; rand_seed < 366; rand_seed++) {
@@ -566,14 +770,13 @@ TEST_F(WriteBatchWithIndexTest, TestRandomIteraratorWithBase) {
566
770
  ColumnFamilyHandleImplDummy cf1(6, BytewiseComparator());
567
771
  ColumnFamilyHandleImplDummy cf2(2, BytewiseComparator());
568
772
  ColumnFamilyHandleImplDummy cf3(8, BytewiseComparator());
569
-
570
- WriteBatchWithIndex batch(BytewiseComparator(), 20, true);
773
+ batch_->Clear();
571
774
 
572
775
  if (rand_seed % 2 == 0) {
573
- ASSERT_OK(batch.Put(&cf2, "zoo", "bar"));
776
+ ASSERT_OK(batch_->Put(&cf2, "zoo", "bar"));
574
777
  }
575
778
  if (rand_seed % 4 == 1) {
576
- ASSERT_OK(batch.Put(&cf3, "zoo", "bar"));
779
+ ASSERT_OK(batch_->Put(&cf3, "zoo", "bar"));
577
780
  }
578
781
 
579
782
  KVMap map;
@@ -589,24 +792,24 @@ TEST_F(WriteBatchWithIndexTest, TestRandomIteraratorWithBase) {
589
792
  break;
590
793
  case 1:
591
794
  // only delta has it
592
- ASSERT_OK(batch.Put(&cf1, key, value));
795
+ ASSERT_OK(batch_->Put(&cf1, key, value));
593
796
  map[key] = value;
594
797
  merged_map[key] = value;
595
798
  break;
596
799
  case 2:
597
800
  // both has it. Delta should win
598
- ASSERT_OK(batch.Put(&cf1, key, value));
801
+ ASSERT_OK(batch_->Put(&cf1, key, value));
599
802
  map[key] = "wrong_value";
600
803
  merged_map[key] = value;
601
804
  break;
602
805
  case 3:
603
806
  // both has it. Delta is delete
604
- ASSERT_OK(batch.Delete(&cf1, key));
807
+ ASSERT_OK(batch_->Delete(&cf1, key));
605
808
  map[key] = "wrong_value";
606
809
  break;
607
810
  case 4:
608
811
  // only delta has it. Delta is delete
609
- ASSERT_OK(batch.Delete(&cf1, key));
812
+ ASSERT_OK(batch_->Delete(&cf1, key));
610
813
  map[key] = "wrong_value";
611
814
  break;
612
815
  default:
@@ -616,7 +819,7 @@ TEST_F(WriteBatchWithIndexTest, TestRandomIteraratorWithBase) {
616
819
  }
617
820
 
618
821
  std::unique_ptr<Iterator> iter(
619
- batch.NewIteratorWithBase(&cf1, new KVIter(&map)));
822
+ batch_->NewIteratorWithBase(&cf1, new KVIter(&map)));
620
823
  std::unique_ptr<Iterator> result_iter(new KVIter(&merged_map));
621
824
 
622
825
  bool is_valid = false;
@@ -672,7 +875,7 @@ TEST_F(WriteBatchWithIndexTest, TestRandomIteraratorWithBase) {
672
875
  }
673
876
  break;
674
877
  }
675
- AssertItersEqual(iter.get(), result_iter.get());
878
+ AssertItersMatch(iter.get(), result_iter.get());
676
879
  is_valid = iter->Valid();
677
880
  }
678
881
 
@@ -680,18 +883,16 @@ TEST_F(WriteBatchWithIndexTest, TestRandomIteraratorWithBase) {
680
883
  }
681
884
  }
682
885
 
683
- TEST_F(WriteBatchWithIndexTest, TestIteraratorWithBase) {
886
+ TEST_P(WriteBatchWithIndexTest, TestIteraratorWithBase) {
684
887
  ColumnFamilyHandleImplDummy cf1(6, BytewiseComparator());
685
888
  ColumnFamilyHandleImplDummy cf2(2, BytewiseComparator());
686
- WriteBatchWithIndex batch(BytewiseComparator(), 20, true);
687
-
688
889
  {
689
890
  KVMap map;
690
891
  map["a"] = "aa";
691
892
  map["c"] = "cc";
692
893
  map["e"] = "ee";
693
894
  std::unique_ptr<Iterator> iter(
694
- batch.NewIteratorWithBase(&cf1, new KVIter(&map)));
895
+ batch_->NewIteratorWithBase(&cf1, new KVIter(&map)));
695
896
 
696
897
  iter->SeekToFirst();
697
898
  AssertIter(iter.get(), "a", "aa");
@@ -724,12 +925,12 @@ TEST_F(WriteBatchWithIndexTest, TestIteraratorWithBase) {
724
925
  }
725
926
 
726
927
  // Test the case that there is one element in the write batch
727
- ASSERT_OK(batch.Put(&cf2, "zoo", "bar"));
728
- ASSERT_OK(batch.Put(&cf1, "a", "aa"));
928
+ ASSERT_OK(batch_->Put(&cf2, "zoo", "bar"));
929
+ ASSERT_OK(batch_->Put(&cf1, "a", "aa"));
729
930
  {
730
931
  KVMap empty_map;
731
932
  std::unique_ptr<Iterator> iter(
732
- batch.NewIteratorWithBase(&cf1, new KVIter(&empty_map)));
933
+ batch_->NewIteratorWithBase(&cf1, new KVIter(&empty_map)));
733
934
 
734
935
  iter->SeekToFirst();
735
936
  AssertIter(iter.get(), "a", "aa");
@@ -738,10 +939,10 @@ TEST_F(WriteBatchWithIndexTest, TestIteraratorWithBase) {
738
939
  ASSERT_TRUE(!iter->Valid());
739
940
  }
740
941
 
741
- ASSERT_OK(batch.Delete(&cf1, "b"));
742
- ASSERT_OK(batch.Put(&cf1, "c", "cc"));
743
- ASSERT_OK(batch.Put(&cf1, "d", "dd"));
744
- ASSERT_OK(batch.Delete(&cf1, "e"));
942
+ ASSERT_OK(batch_->Delete(&cf1, "b"));
943
+ ASSERT_OK(batch_->Put(&cf1, "c", "cc"));
944
+ ASSERT_OK(batch_->Put(&cf1, "d", "dd"));
945
+ ASSERT_OK(batch_->Delete(&cf1, "e"));
745
946
 
746
947
  {
747
948
  KVMap map;
@@ -749,7 +950,7 @@ TEST_F(WriteBatchWithIndexTest, TestIteraratorWithBase) {
749
950
  map["cc"] = "cccc";
750
951
  map["f"] = "ff";
751
952
  std::unique_ptr<Iterator> iter(
752
- batch.NewIteratorWithBase(&cf1, new KVIter(&map)));
953
+ batch_->NewIteratorWithBase(&cf1, new KVIter(&map)));
753
954
 
754
955
  iter->SeekToFirst();
755
956
  AssertIter(iter.get(), "a", "aa");
@@ -807,7 +1008,7 @@ TEST_F(WriteBatchWithIndexTest, TestIteraratorWithBase) {
807
1008
  {
808
1009
  KVMap empty_map;
809
1010
  std::unique_ptr<Iterator> iter(
810
- batch.NewIteratorWithBase(&cf1, new KVIter(&empty_map)));
1011
+ batch_->NewIteratorWithBase(&cf1, new KVIter(&empty_map)));
811
1012
 
812
1013
  iter->SeekToFirst();
813
1014
  AssertIter(iter.get(), "a", "aa");
@@ -843,18 +1044,17 @@ TEST_F(WriteBatchWithIndexTest, TestIteraratorWithBase) {
843
1044
  }
844
1045
  }
845
1046
 
846
- TEST_F(WriteBatchWithIndexTest, TestIteraratorWithBaseReverseCmp) {
1047
+ TEST_P(WriteBatchWithIndexTest, TestIteraratorWithBaseReverseCmp) {
847
1048
  ColumnFamilyHandleImplDummy cf1(6, ReverseBytewiseComparator());
848
1049
  ColumnFamilyHandleImplDummy cf2(2, ReverseBytewiseComparator());
849
- WriteBatchWithIndex batch(BytewiseComparator(), 20, true);
850
1050
 
851
1051
  // Test the case that there is one element in the write batch
852
- ASSERT_OK(batch.Put(&cf2, "zoo", "bar"));
853
- ASSERT_OK(batch.Put(&cf1, "a", "aa"));
1052
+ ASSERT_OK(batch_->Put(&cf2, "zoo", "bar"));
1053
+ ASSERT_OK(batch_->Put(&cf1, "a", "aa"));
854
1054
  {
855
1055
  KVMap empty_map;
856
1056
  std::unique_ptr<Iterator> iter(
857
- batch.NewIteratorWithBase(&cf1, new KVIter(&empty_map)));
1057
+ batch_->NewIteratorWithBase(&cf1, new KVIter(&empty_map)));
858
1058
 
859
1059
  iter->SeekToFirst();
860
1060
  AssertIter(iter.get(), "a", "aa");
@@ -863,11 +1063,11 @@ TEST_F(WriteBatchWithIndexTest, TestIteraratorWithBaseReverseCmp) {
863
1063
  ASSERT_TRUE(!iter->Valid());
864
1064
  }
865
1065
 
866
- ASSERT_OK(batch.Put(&cf1, "c", "cc"));
1066
+ ASSERT_OK(batch_->Put(&cf1, "c", "cc"));
867
1067
  {
868
1068
  KVMap map;
869
1069
  std::unique_ptr<Iterator> iter(
870
- batch.NewIteratorWithBase(&cf1, new KVIter(&map)));
1070
+ batch_->NewIteratorWithBase(&cf1, new KVIter(&map)));
871
1071
 
872
1072
  iter->SeekToFirst();
873
1073
  AssertIter(iter.get(), "c", "cc");
@@ -896,11 +1096,12 @@ TEST_F(WriteBatchWithIndexTest, TestIteraratorWithBaseReverseCmp) {
896
1096
  }
897
1097
 
898
1098
  // default column family
899
- ASSERT_OK(batch.Put("a", "b"));
1099
+ ASSERT_OK(batch_->Put("a", "b"));
900
1100
  {
901
1101
  KVMap map;
902
1102
  map["b"] = "";
903
- std::unique_ptr<Iterator> iter(batch.NewIteratorWithBase(new KVIter(&map)));
1103
+ std::unique_ptr<Iterator> iter(
1104
+ batch_->NewIteratorWithBase(new KVIter(&map)));
904
1105
 
905
1106
  iter->SeekToFirst();
906
1107
  AssertIter(iter.get(), "a", "b");
@@ -929,416 +1130,331 @@ TEST_F(WriteBatchWithIndexTest, TestIteraratorWithBaseReverseCmp) {
929
1130
  }
930
1131
  }
931
1132
 
932
- TEST_F(WriteBatchWithIndexTest, TestGetFromBatch) {
1133
+ TEST_P(WriteBatchWithIndexTest, TestGetFromBatch) {
933
1134
  Options options;
934
- WriteBatchWithIndex batch;
935
1135
  Status s;
936
1136
  std::string value;
937
1137
 
938
- s = batch.GetFromBatch(options, "b", &value);
1138
+ s = batch_->GetFromBatch(options_, "b", &value);
939
1139
  ASSERT_TRUE(s.IsNotFound());
940
1140
 
941
- ASSERT_OK(batch.Put("a", "a"));
942
- ASSERT_OK(batch.Put("b", "b"));
943
- ASSERT_OK(batch.Put("c", "c"));
944
- ASSERT_OK(batch.Put("a", "z"));
945
- ASSERT_OK(batch.Delete("c"));
946
- ASSERT_OK(batch.Delete("d"));
947
- ASSERT_OK(batch.Delete("e"));
948
- ASSERT_OK(batch.Put("e", "e"));
1141
+ ASSERT_OK(batch_->Put("a", "a"));
1142
+ ASSERT_OK(batch_->Put("b", "b"));
1143
+ ASSERT_OK(batch_->Put("c", "c"));
1144
+ ASSERT_OK(batch_->Put("a", "z"));
1145
+ ASSERT_OK(batch_->Delete("c"));
1146
+ ASSERT_OK(batch_->Delete("d"));
1147
+ ASSERT_OK(batch_->Delete("e"));
1148
+ ASSERT_OK(batch_->Put("e", "e"));
949
1149
 
950
- s = batch.GetFromBatch(options, "b", &value);
1150
+ s = batch_->GetFromBatch(options_, "b", &value);
951
1151
  ASSERT_OK(s);
952
1152
  ASSERT_EQ("b", value);
953
1153
 
954
- s = batch.GetFromBatch(options, "a", &value);
1154
+ s = batch_->GetFromBatch(options_, "a", &value);
955
1155
  ASSERT_OK(s);
956
1156
  ASSERT_EQ("z", value);
957
1157
 
958
- s = batch.GetFromBatch(options, "c", &value);
1158
+ s = batch_->GetFromBatch(options_, "c", &value);
959
1159
  ASSERT_TRUE(s.IsNotFound());
960
1160
 
961
- s = batch.GetFromBatch(options, "d", &value);
1161
+ s = batch_->GetFromBatch(options_, "d", &value);
962
1162
  ASSERT_TRUE(s.IsNotFound());
963
1163
 
964
- s = batch.GetFromBatch(options, "x", &value);
1164
+ s = batch_->GetFromBatch(options_, "x", &value);
965
1165
  ASSERT_TRUE(s.IsNotFound());
966
1166
 
967
- s = batch.GetFromBatch(options, "e", &value);
1167
+ s = batch_->GetFromBatch(options_, "e", &value);
968
1168
  ASSERT_OK(s);
969
1169
  ASSERT_EQ("e", value);
970
1170
 
971
- ASSERT_OK(batch.Merge("z", "z"));
1171
+ ASSERT_OK(batch_->Merge("z", "z"));
972
1172
 
973
- s = batch.GetFromBatch(options, "z", &value);
1173
+ s = batch_->GetFromBatch(options_, "z", &value);
974
1174
  ASSERT_NOK(s); // No merge operator specified.
975
1175
 
976
- s = batch.GetFromBatch(options, "b", &value);
1176
+ s = batch_->GetFromBatch(options_, "b", &value);
977
1177
  ASSERT_OK(s);
978
1178
  ASSERT_EQ("b", value);
979
1179
  }
980
1180
 
981
- TEST_F(WriteBatchWithIndexTest, TestGetFromBatchMerge) {
982
- DB* db;
983
- Options options;
984
- options.merge_operator = MergeOperators::CreateFromStringId("stringappend");
985
- options.create_if_missing = true;
986
-
987
- std::string dbname = test::PerThreadDBPath("write_batch_with_index_test");
988
-
989
- EXPECT_OK(DestroyDB(dbname, options));
990
- Status s = DB::Open(options, dbname, &db);
1181
+ TEST_P(WriteBatchWithIndexTest, TestGetFromBatchMerge) {
1182
+ Status s = OpenDB();
991
1183
  ASSERT_OK(s);
992
1184
 
993
- ColumnFamilyHandle* column_family = db->DefaultColumnFamily();
994
- WriteBatchWithIndex batch;
1185
+ ColumnFamilyHandle* column_family = db_->DefaultColumnFamily();
995
1186
  std::string value;
996
1187
 
997
- s = batch.GetFromBatch(options, "x", &value);
1188
+ s = batch_->GetFromBatch(options_, "x", &value);
998
1189
  ASSERT_TRUE(s.IsNotFound());
999
1190
 
1000
- ASSERT_OK(batch.Put("x", "X"));
1191
+ ASSERT_OK(batch_->Put("x", "X"));
1001
1192
  std::string expected = "X";
1002
1193
 
1003
1194
  for (int i = 0; i < 5; i++) {
1004
- ASSERT_OK(batch.Merge("x", ToString(i)));
1195
+ ASSERT_OK(batch_->Merge("x", ToString(i)));
1005
1196
  expected = expected + "," + ToString(i);
1006
1197
 
1007
1198
  if (i % 2 == 0) {
1008
- ASSERT_OK(batch.Put("y", ToString(i / 2)));
1199
+ ASSERT_OK(batch_->Put("y", ToString(i / 2)));
1009
1200
  }
1010
1201
 
1011
- ASSERT_OK(batch.Merge("z", "z"));
1202
+ ASSERT_OK(batch_->Merge("z", "z"));
1012
1203
 
1013
- s = batch.GetFromBatch(column_family, options, "x", &value);
1204
+ s = batch_->GetFromBatch(column_family, options_, "x", &value);
1014
1205
  ASSERT_OK(s);
1015
1206
  ASSERT_EQ(expected, value);
1016
1207
 
1017
- s = batch.GetFromBatch(column_family, options, "y", &value);
1208
+ s = batch_->GetFromBatch(column_family, options_, "y", &value);
1018
1209
  ASSERT_OK(s);
1019
1210
  ASSERT_EQ(ToString(i / 2), value);
1020
1211
 
1021
- s = batch.GetFromBatch(column_family, options, "z", &value);
1212
+ s = batch_->GetFromBatch(column_family, options_, "z", &value);
1022
1213
  ASSERT_TRUE(s.IsMergeInProgress());
1023
1214
  }
1024
-
1025
- delete db;
1026
- EXPECT_OK(DestroyDB(dbname, options));
1027
1215
  }
1028
1216
 
1029
- TEST_F(WriteBatchWithIndexTest, TestGetFromBatchMerge2) {
1030
- DB* db;
1031
- Options options;
1032
- options.merge_operator = MergeOperators::CreateFromStringId("stringappend");
1033
- options.create_if_missing = true;
1034
-
1035
- std::string dbname = test::PerThreadDBPath("write_batch_with_index_test");
1036
-
1037
- EXPECT_OK(DestroyDB(dbname, options));
1038
- Status s = DB::Open(options, dbname, &db);
1217
+ TEST_F(WBWIOverwriteTest, TestGetFromBatchMerge2) {
1218
+ Status s = OpenDB();
1039
1219
  ASSERT_OK(s);
1040
1220
 
1041
- ColumnFamilyHandle* column_family = db->DefaultColumnFamily();
1042
-
1043
- // Test batch with overwrite_key=true
1044
- WriteBatchWithIndex batch(BytewiseComparator(), 0, true);
1221
+ ColumnFamilyHandle* column_family = db_->DefaultColumnFamily();
1045
1222
  std::string value;
1046
1223
 
1047
- s = batch.GetFromBatch(column_family, options, "X", &value);
1224
+ s = batch_->GetFromBatch(column_family, options_, "X", &value);
1048
1225
  ASSERT_TRUE(s.IsNotFound());
1049
1226
 
1050
- ASSERT_OK(batch.Put(column_family, "X", "x"));
1051
- s = batch.GetFromBatch(column_family, options, "X", &value);
1052
- ASSERT_OK(s);
1227
+ ASSERT_OK(batch_->Put(column_family, "X", "x"));
1228
+ ASSERT_OK(batch_->GetFromBatch(column_family, options_, "X", &value));
1053
1229
  ASSERT_EQ("x", value);
1054
1230
 
1055
- ASSERT_OK(batch.Put(column_family, "X", "x2"));
1056
- s = batch.GetFromBatch(column_family, options, "X", &value);
1057
- ASSERT_OK(s);
1231
+ ASSERT_OK(batch_->Put(column_family, "X", "x2"));
1232
+ ASSERT_OK(batch_->GetFromBatch(column_family, options_, "X", &value));
1058
1233
  ASSERT_EQ("x2", value);
1059
1234
 
1060
- ASSERT_OK(batch.Merge(column_family, "X", "aaa"));
1061
- s = batch.GetFromBatch(column_family, options, "X", &value);
1062
- ASSERT_TRUE(s.IsMergeInProgress());
1235
+ ASSERT_OK(batch_->Merge(column_family, "X", "aaa"));
1236
+ ASSERT_OK(batch_->GetFromBatch(column_family, options_, "X", &value));
1237
+ ASSERT_EQ("x2,aaa", value);
1063
1238
 
1064
- ASSERT_OK(batch.Merge(column_family, "X", "bbb"));
1065
- s = batch.GetFromBatch(column_family, options, "X", &value);
1066
- ASSERT_TRUE(s.IsMergeInProgress());
1239
+ ASSERT_OK(batch_->Merge(column_family, "X", "bbb"));
1240
+ ASSERT_OK(batch_->GetFromBatch(column_family, options_, "X", &value));
1241
+ ASSERT_EQ("x2,aaa,bbb", value);
1067
1242
 
1068
- ASSERT_OK(batch.Put(column_family, "X", "x3"));
1069
- s = batch.GetFromBatch(column_family, options, "X", &value);
1070
- ASSERT_OK(s);
1243
+ ASSERT_OK(batch_->Put(column_family, "X", "x3"));
1244
+ ASSERT_OK(batch_->GetFromBatch(column_family, options_, "X", &value));
1071
1245
  ASSERT_EQ("x3", value);
1072
1246
 
1073
- ASSERT_OK(batch.Merge(column_family, "X", "ccc"));
1074
- s = batch.GetFromBatch(column_family, options, "X", &value);
1075
- ASSERT_TRUE(s.IsMergeInProgress());
1247
+ ASSERT_OK(batch_->Merge(column_family, "X", "ccc"));
1248
+ ASSERT_OK(batch_->GetFromBatch(column_family, options_, "X", &value));
1249
+ ASSERT_EQ("x3,ccc", value);
1076
1250
 
1077
- ASSERT_OK(batch.Delete(column_family, "X"));
1078
- s = batch.GetFromBatch(column_family, options, "X", &value);
1251
+ ASSERT_OK(batch_->Delete(column_family, "X"));
1252
+ s = batch_->GetFromBatch(column_family, options_, "X", &value);
1079
1253
  ASSERT_TRUE(s.IsNotFound());
1080
1254
 
1081
- ASSERT_OK(batch.Merge(column_family, "X", "ddd"));
1082
- s = batch.GetFromBatch(column_family, options, "X", &value);
1083
- ASSERT_TRUE(s.IsMergeInProgress());
1084
-
1085
- delete db;
1086
- EXPECT_OK(DestroyDB(dbname, options));
1255
+ batch_->Merge(column_family, "X", "ddd");
1256
+ ASSERT_OK(batch_->GetFromBatch(column_family, options_, "X", &value));
1257
+ ASSERT_EQ("ddd", value);
1087
1258
  }
1088
1259
 
1089
- TEST_F(WriteBatchWithIndexTest, TestGetFromBatchAndDB) {
1090
- DB* db;
1091
- Options options;
1092
- options.create_if_missing = true;
1093
- std::string dbname = test::PerThreadDBPath("write_batch_with_index_test");
1094
-
1095
- EXPECT_OK(DestroyDB(dbname, options));
1096
- Status s = DB::Open(options, dbname, &db);
1097
- ASSERT_OK(s);
1260
+ TEST_P(WriteBatchWithIndexTest, TestGetFromBatchAndDB) {
1261
+ ASSERT_OK(OpenDB());
1098
1262
 
1099
- WriteBatchWithIndex batch;
1100
- ReadOptions read_options;
1101
- WriteOptions write_options;
1102
1263
  std::string value;
1103
1264
 
1104
- s = db->Put(write_options, "a", "a");
1105
- ASSERT_OK(s);
1265
+ ASSERT_OK(db_->Put(write_opts_, "a", "a"));
1266
+ ASSERT_OK(db_->Put(write_opts_, "b", "b"));
1267
+ ASSERT_OK(db_->Put(write_opts_, "c", "c"));
1106
1268
 
1107
- s = db->Put(write_options, "b", "b");
1108
- ASSERT_OK(s);
1269
+ ASSERT_OK(batch_->Put("a", "batch_->a"));
1270
+ ASSERT_OK(batch_->Delete("b"));
1109
1271
 
1110
- s = db->Put(write_options, "c", "c");
1111
- ASSERT_OK(s);
1272
+ ASSERT_OK(batch_->GetFromBatchAndDB(db_, read_opts_, "a", &value));
1273
+ ASSERT_EQ("batch_->a", value);
1112
1274
 
1113
- ASSERT_OK(batch.Put("a", "batch.a"));
1114
- ASSERT_OK(batch.Delete("b"));
1115
-
1116
- s = batch.GetFromBatchAndDB(db, read_options, "a", &value);
1117
- ASSERT_OK(s);
1118
- ASSERT_EQ("batch.a", value);
1119
-
1120
- s = batch.GetFromBatchAndDB(db, read_options, "b", &value);
1275
+ Status s = batch_->GetFromBatchAndDB(db_, read_opts_, "b", &value);
1121
1276
  ASSERT_TRUE(s.IsNotFound());
1122
1277
 
1123
- s = batch.GetFromBatchAndDB(db, read_options, "c", &value);
1124
- ASSERT_OK(s);
1278
+ ASSERT_OK(batch_->GetFromBatchAndDB(db_, read_opts_, "c", &value));
1125
1279
  ASSERT_EQ("c", value);
1126
1280
 
1127
- s = batch.GetFromBatchAndDB(db, read_options, "x", &value);
1281
+ s = batch_->GetFromBatchAndDB(db_, read_opts_, "x", &value);
1128
1282
  ASSERT_TRUE(s.IsNotFound());
1129
1283
 
1130
- ASSERT_OK(db->Delete(write_options, "x"));
1284
+ ASSERT_OK(db_->Delete(write_opts_, "x"));
1131
1285
 
1132
- s = batch.GetFromBatchAndDB(db, read_options, "x", &value);
1286
+ s = batch_->GetFromBatchAndDB(db_, read_opts_, "x", &value);
1133
1287
  ASSERT_TRUE(s.IsNotFound());
1134
-
1135
- delete db;
1136
- EXPECT_OK(DestroyDB(dbname, options));
1137
1288
  }
1138
1289
 
1139
- TEST_F(WriteBatchWithIndexTest, TestGetFromBatchAndDBMerge) {
1140
- DB* db;
1141
- Options options;
1142
-
1143
- options.create_if_missing = true;
1144
- std::string dbname = test::PerThreadDBPath("write_batch_with_index_test");
1145
-
1146
- options.merge_operator = MergeOperators::CreateFromStringId("stringappend");
1147
-
1148
- EXPECT_OK(DestroyDB(dbname, options));
1149
- Status s = DB::Open(options, dbname, &db);
1290
+ TEST_P(WriteBatchWithIndexTest, TestGetFromBatchAndDBMerge) {
1291
+ Status s = OpenDB();
1150
1292
  ASSERT_OK(s);
1151
1293
 
1152
- WriteBatchWithIndex batch;
1153
- ReadOptions read_options;
1154
- WriteOptions write_options;
1155
1294
  std::string value;
1156
1295
 
1157
- s = db->Put(write_options, "a", "a0");
1158
- ASSERT_OK(s);
1159
-
1160
- s = db->Put(write_options, "b", "b0");
1161
- ASSERT_OK(s);
1162
-
1163
- s = db->Merge(write_options, "b", "b1");
1164
- ASSERT_OK(s);
1296
+ ASSERT_OK(db_->Put(write_opts_, "a", "a0"));
1297
+ ASSERT_OK(db_->Put(write_opts_, "b", "b0"));
1298
+ ASSERT_OK(db_->Merge(write_opts_, "b", "b1"));
1299
+ ASSERT_OK(db_->Merge(write_opts_, "c", "c0"));
1300
+ ASSERT_OK(db_->Merge(write_opts_, "d", "d0"));
1165
1301
 
1166
- s = db->Merge(write_options, "c", "c0");
1167
- ASSERT_OK(s);
1302
+ ASSERT_OK(batch_->Merge("a", "a1"));
1303
+ ASSERT_OK(batch_->Merge("a", "a2"));
1304
+ ASSERT_OK(batch_->Merge("b", "b2"));
1305
+ ASSERT_OK(batch_->Merge("d", "d1"));
1306
+ ASSERT_OK(batch_->Merge("e", "e0"));
1168
1307
 
1169
- s = db->Merge(write_options, "d", "d0");
1170
- ASSERT_OK(s);
1171
-
1172
- ASSERT_OK(batch.Merge("a", "a1"));
1173
- ASSERT_OK(batch.Merge("a", "a2"));
1174
- ASSERT_OK(batch.Merge("b", "b2"));
1175
- ASSERT_OK(batch.Merge("d", "d1"));
1176
- ASSERT_OK(batch.Merge("e", "e0"));
1177
-
1178
- s = batch.GetFromBatchAndDB(db, read_options, "a", &value);
1179
- ASSERT_OK(s);
1308
+ ASSERT_OK(batch_->GetFromBatchAndDB(db_, read_opts_, "a", &value));
1180
1309
  ASSERT_EQ("a0,a1,a2", value);
1181
1310
 
1182
- s = batch.GetFromBatchAndDB(db, read_options, "b", &value);
1183
- ASSERT_OK(s);
1311
+ ASSERT_OK(batch_->GetFromBatchAndDB(db_, read_opts_, "b", &value));
1184
1312
  ASSERT_EQ("b0,b1,b2", value);
1185
1313
 
1186
- s = batch.GetFromBatchAndDB(db, read_options, "c", &value);
1187
- ASSERT_OK(s);
1314
+ ASSERT_OK(batch_->GetFromBatchAndDB(db_, read_opts_, "c", &value));
1188
1315
  ASSERT_EQ("c0", value);
1189
1316
 
1190
- s = batch.GetFromBatchAndDB(db, read_options, "d", &value);
1191
- ASSERT_OK(s);
1317
+ ASSERT_OK(batch_->GetFromBatchAndDB(db_, read_opts_, "d", &value));
1192
1318
  ASSERT_EQ("d0,d1", value);
1193
1319
 
1194
- s = batch.GetFromBatchAndDB(db, read_options, "e", &value);
1195
- ASSERT_OK(s);
1320
+ ASSERT_OK(batch_->GetFromBatchAndDB(db_, read_opts_, "e", &value));
1196
1321
  ASSERT_EQ("e0", value);
1197
1322
 
1198
- s = db->Delete(write_options, "x");
1199
- ASSERT_OK(s);
1323
+ ASSERT_OK(db_->Delete(write_opts_, "x"));
1200
1324
 
1201
- s = batch.GetFromBatchAndDB(db, read_options, "x", &value);
1325
+ s = batch_->GetFromBatchAndDB(db_, read_opts_, "x", &value);
1202
1326
  ASSERT_TRUE(s.IsNotFound());
1203
1327
 
1204
- const Snapshot* snapshot = db->GetSnapshot();
1328
+ const Snapshot* snapshot = db_->GetSnapshot();
1205
1329
  ReadOptions snapshot_read_options;
1206
1330
  snapshot_read_options.snapshot = snapshot;
1207
1331
 
1208
- s = db->Delete(write_options, "a");
1209
- ASSERT_OK(s);
1332
+ ASSERT_OK(db_->Delete(write_opts_, "a"));
1210
1333
 
1211
- s = batch.GetFromBatchAndDB(db, read_options, "a", &value);
1212
- ASSERT_OK(s);
1334
+ ASSERT_OK(batch_->GetFromBatchAndDB(db_, read_opts_, "a", &value));
1213
1335
  ASSERT_EQ("a1,a2", value);
1214
1336
 
1215
- s = batch.GetFromBatchAndDB(db, snapshot_read_options, "a", &value);
1216
- ASSERT_OK(s);
1337
+ ASSERT_OK(
1338
+ s = batch_->GetFromBatchAndDB(db_, snapshot_read_options, "a", &value));
1217
1339
  ASSERT_EQ("a0,a1,a2", value);
1218
1340
 
1219
- ASSERT_OK(batch.Delete("a"));
1341
+ ASSERT_OK(batch_->Delete("a"));
1220
1342
 
1221
- s = batch.GetFromBatchAndDB(db, read_options, "a", &value);
1343
+ s = batch_->GetFromBatchAndDB(db_, read_opts_, "a", &value);
1222
1344
  ASSERT_TRUE(s.IsNotFound());
1223
1345
 
1224
- s = batch.GetFromBatchAndDB(db, snapshot_read_options, "a", &value);
1346
+ s = batch_->GetFromBatchAndDB(db_, snapshot_read_options, "a", &value);
1225
1347
  ASSERT_TRUE(s.IsNotFound());
1226
1348
 
1227
- s = db->Merge(write_options, "c", "c1");
1228
- ASSERT_OK(s);
1349
+ ASSERT_OK(s = db_->Merge(write_opts_, "c", "c1"));
1229
1350
 
1230
- s = batch.GetFromBatchAndDB(db, read_options, "c", &value);
1231
- ASSERT_OK(s);
1351
+ ASSERT_OK(s = batch_->GetFromBatchAndDB(db_, read_opts_, "c", &value));
1232
1352
  ASSERT_EQ("c0,c1", value);
1233
1353
 
1234
- s = batch.GetFromBatchAndDB(db, snapshot_read_options, "c", &value);
1235
- ASSERT_OK(s);
1354
+ ASSERT_OK(
1355
+ s = batch_->GetFromBatchAndDB(db_, snapshot_read_options, "c", &value));
1236
1356
  ASSERT_EQ("c0", value);
1237
1357
 
1238
- s = db->Put(write_options, "e", "e1");
1239
- ASSERT_OK(s);
1240
-
1241
- s = batch.GetFromBatchAndDB(db, read_options, "e", &value);
1242
- ASSERT_OK(s);
1358
+ ASSERT_OK(db_->Put(write_opts_, "e", "e1"));
1359
+ ASSERT_OK(batch_->GetFromBatchAndDB(db_, read_opts_, "e", &value));
1243
1360
  ASSERT_EQ("e1,e0", value);
1244
1361
 
1245
- s = batch.GetFromBatchAndDB(db, snapshot_read_options, "e", &value);
1246
- ASSERT_OK(s);
1362
+ ASSERT_OK(batch_->GetFromBatchAndDB(db_, snapshot_read_options, "e", &value));
1247
1363
  ASSERT_EQ("e0", value);
1248
1364
 
1249
- s = db->Delete(write_options, "e");
1250
- ASSERT_OK(s);
1251
-
1252
- s = batch.GetFromBatchAndDB(db, read_options, "e", &value);
1253
- ASSERT_OK(s);
1365
+ ASSERT_OK(s = db_->Delete(write_opts_, "e"));
1366
+ ASSERT_OK(batch_->GetFromBatchAndDB(db_, read_opts_, "e", &value));
1254
1367
  ASSERT_EQ("e0", value);
1255
1368
 
1256
- s = batch.GetFromBatchAndDB(db, snapshot_read_options, "e", &value);
1257
- ASSERT_OK(s);
1369
+ ASSERT_OK(batch_->GetFromBatchAndDB(db_, snapshot_read_options, "e", &value));
1258
1370
  ASSERT_EQ("e0", value);
1259
1371
 
1260
- db->ReleaseSnapshot(snapshot);
1261
- delete db;
1262
- EXPECT_OK(DestroyDB(dbname, options));
1372
+ db_->ReleaseSnapshot(snapshot);
1263
1373
  }
1264
1374
 
1265
- TEST_F(WriteBatchWithIndexTest, TestGetFromBatchAndDBMerge2) {
1266
- DB* db;
1267
- Options options;
1268
-
1269
- options.create_if_missing = true;
1270
- std::string dbname = test::PerThreadDBPath("write_batch_with_index_test");
1271
-
1272
- options.merge_operator = MergeOperators::CreateFromStringId("stringappend");
1273
-
1274
- EXPECT_OK(DestroyDB(dbname, options));
1275
- Status s = DB::Open(options, dbname, &db);
1375
+ TEST_F(WBWIOverwriteTest, TestGetFromBatchAndDBMerge2) {
1376
+ Status s = OpenDB();
1276
1377
  ASSERT_OK(s);
1277
1378
 
1278
- // Test batch with overwrite_key=true
1279
- WriteBatchWithIndex batch(BytewiseComparator(), 0, true);
1280
-
1281
- ReadOptions read_options;
1282
- WriteOptions write_options;
1283
1379
  std::string value;
1284
1380
 
1285
- s = batch.GetFromBatchAndDB(db, read_options, "A", &value);
1381
+ s = batch_->GetFromBatchAndDB(db_, read_opts_, "A", &value);
1286
1382
  ASSERT_TRUE(s.IsNotFound());
1287
1383
 
1288
- ASSERT_OK(batch.Merge("A", "xxx"));
1384
+ ASSERT_OK(batch_->Merge("A", "xxx"));
1385
+ ASSERT_OK(batch_->GetFromBatchAndDB(db_, read_opts_, "A", &value));
1386
+ ASSERT_EQ(value, "xxx");
1289
1387
 
1290
- s = batch.GetFromBatchAndDB(db, read_options, "A", &value);
1291
- ASSERT_TRUE(s.IsMergeInProgress());
1388
+ ASSERT_OK(batch_->Merge("A", "yyy"));
1389
+ ASSERT_OK(batch_->GetFromBatchAndDB(db_, read_opts_, "A", &value));
1390
+ ASSERT_EQ(value, "xxx,yyy");
1292
1391
 
1293
- ASSERT_OK(batch.Merge("A", "yyy"));
1392
+ ASSERT_OK(db_->Put(write_opts_, "A", "a0"));
1393
+ ASSERT_OK(batch_->GetFromBatchAndDB(db_, read_opts_, "A", &value));
1394
+ ASSERT_EQ(value, "a0,xxx,yyy");
1294
1395
 
1295
- s = batch.GetFromBatchAndDB(db, read_options, "A", &value);
1296
- ASSERT_TRUE(s.IsMergeInProgress());
1297
-
1298
- s = db->Put(write_options, "A", "a0");
1299
- ASSERT_OK(s);
1396
+ ASSERT_OK(batch_->Delete("A"));
1300
1397
 
1301
- s = batch.GetFromBatchAndDB(db, read_options, "A", &value);
1302
- ASSERT_TRUE(s.IsMergeInProgress());
1303
-
1304
- ASSERT_OK(batch.Delete("A"));
1305
-
1306
- s = batch.GetFromBatchAndDB(db, read_options, "A", &value);
1398
+ s = batch_->GetFromBatchAndDB(db_, read_opts_, "A", &value);
1307
1399
  ASSERT_TRUE(s.IsNotFound());
1308
-
1309
- delete db;
1310
- EXPECT_OK(DestroyDB(dbname, options));
1311
1400
  }
1312
1401
 
1313
- TEST_F(WriteBatchWithIndexTest, TestGetFromBatchAndDBMerge3) {
1314
- DB* db;
1315
- Options options;
1402
+ TEST_P(WriteBatchWithIndexTest, TestGetFromBatchAndDBMerge3) {
1403
+ Status s = OpenDB();
1404
+ ASSERT_OK(s);
1316
1405
 
1317
- options.create_if_missing = true;
1318
- std::string dbname = test::PerThreadDBPath("write_batch_with_index_test");
1406
+ FlushOptions flush_options;
1407
+ std::string value;
1319
1408
 
1320
- options.merge_operator = MergeOperators::CreateFromStringId("stringappend");
1409
+ ASSERT_OK(db_->Put(write_opts_, "A", "1"));
1410
+ ASSERT_OK(db_->Flush(flush_options, db_->DefaultColumnFamily()));
1411
+ ASSERT_OK(batch_->Merge("A", "2"));
1321
1412
 
1322
- EXPECT_OK(DestroyDB(dbname, options));
1323
- Status s = DB::Open(options, dbname, &db);
1413
+ ASSERT_OK(batch_->GetFromBatchAndDB(db_, read_opts_, "A", &value));
1414
+ ASSERT_EQ(value, "1,2");
1415
+ }
1416
+
1417
+ TEST_P(WriteBatchWithIndexTest, TestPinnedGetFromBatchAndDB) {
1418
+ Status s = OpenDB();
1324
1419
  ASSERT_OK(s);
1325
1420
 
1326
- ReadOptions read_options;
1327
- WriteOptions write_options;
1328
- FlushOptions flush_options;
1329
- std::string value;
1421
+ PinnableSlice value;
1422
+
1423
+ ASSERT_OK(db_->Put(write_opts_, "a", "a0"));
1424
+ ASSERT_OK(db_->Put(write_opts_, "b", "b0"));
1425
+ ASSERT_OK(db_->Merge(write_opts_, "b", "b1"));
1426
+ ASSERT_OK(db_->Merge(write_opts_, "c", "c0"));
1427
+ ASSERT_OK(db_->Merge(write_opts_, "d", "d0"));
1428
+ ASSERT_OK(batch_->Merge("a", "a1"));
1429
+ ASSERT_OK(batch_->Merge("a", "a2"));
1430
+ ASSERT_OK(batch_->Merge("b", "b2"));
1431
+ ASSERT_OK(batch_->Merge("d", "d1"));
1432
+ ASSERT_OK(batch_->Merge("e", "e0"));
1433
+
1434
+ for (int i = 0; i < 2; i++) {
1435
+ if (i == 1) {
1436
+ // Do it again with a flushed DB...
1437
+ ASSERT_OK(db_->Flush(FlushOptions(), db_->DefaultColumnFamily()));
1438
+ }
1439
+ ASSERT_OK(batch_->GetFromBatchAndDB(db_, read_opts_, "a", &value));
1440
+ ASSERT_EQ("a0,a1,a2", value.ToString());
1330
1441
 
1331
- WriteBatchWithIndex batch;
1442
+ ASSERT_OK(batch_->GetFromBatchAndDB(db_, read_opts_, "b", &value));
1443
+ ASSERT_EQ("b0,b1,b2", value.ToString());
1332
1444
 
1333
- ASSERT_OK(db->Put(write_options, "A", "1"));
1334
- ASSERT_OK(db->Flush(flush_options, db->DefaultColumnFamily()));
1335
- ASSERT_OK(batch.Merge("A", "2"));
1445
+ ASSERT_OK(batch_->GetFromBatchAndDB(db_, read_opts_, "c", &value));
1446
+ ASSERT_EQ("c0", value.ToString());
1336
1447
 
1337
- ASSERT_OK(batch.GetFromBatchAndDB(db, read_options, "A", &value));
1338
- ASSERT_EQ(value, "1,2");
1448
+ ASSERT_OK(batch_->GetFromBatchAndDB(db_, read_opts_, "d", &value));
1449
+ ASSERT_EQ("d0,d1", value.ToString());
1450
+
1451
+ ASSERT_OK(batch_->GetFromBatchAndDB(db_, read_opts_, "e", &value));
1452
+ ASSERT_EQ("e0", value.ToString());
1453
+ ASSERT_OK(db_->Delete(write_opts_, "x"));
1339
1454
 
1340
- delete db;
1341
- EXPECT_OK(DestroyDB(dbname, options));
1455
+ s = batch_->GetFromBatchAndDB(db_, read_opts_, "x", &value);
1456
+ ASSERT_TRUE(s.IsNotFound());
1457
+ }
1342
1458
  }
1343
1459
 
1344
1460
  void AssertKey(std::string key, WBWIIterator* iter) {
@@ -1353,25 +1469,24 @@ void AssertValue(std::string value, WBWIIterator* iter) {
1353
1469
 
1354
1470
  // Tests that we can write to the WBWI while we iterate (from a single thread).
1355
1471
  // iteration should see the newest writes
1356
- TEST_F(WriteBatchWithIndexTest, MutateWhileIteratingCorrectnessTest) {
1357
- WriteBatchWithIndex batch(BytewiseComparator(), 0, true);
1472
+ TEST_F(WBWIOverwriteTest, MutateWhileIteratingCorrectnessTest) {
1358
1473
  for (char c = 'a'; c <= 'z'; ++c) {
1359
- ASSERT_OK(batch.Put(std::string(1, c), std::string(1, c)));
1474
+ ASSERT_OK(batch_->Put(std::string(1, c), std::string(1, c)));
1360
1475
  }
1361
1476
 
1362
- std::unique_ptr<WBWIIterator> iter(batch.NewIterator());
1477
+ std::unique_ptr<WBWIIterator> iter(batch_->NewIterator());
1363
1478
  iter->Seek("k");
1364
1479
  AssertKey("k", iter.get());
1365
1480
  iter->Next();
1366
1481
  AssertKey("l", iter.get());
1367
- ASSERT_OK(batch.Put("ab", "cc"));
1482
+ ASSERT_OK(batch_->Put("ab", "cc"));
1368
1483
  iter->Next();
1369
1484
  AssertKey("m", iter.get());
1370
- ASSERT_OK(batch.Put("mm", "kk"));
1485
+ ASSERT_OK(batch_->Put("mm", "kk"));
1371
1486
  iter->Next();
1372
1487
  AssertKey("mm", iter.get());
1373
1488
  AssertValue("kk", iter.get());
1374
- ASSERT_OK(batch.Delete("mm"));
1489
+ ASSERT_OK(batch_->Delete("mm"));
1375
1490
 
1376
1491
  iter->Next();
1377
1492
  AssertKey("n", iter.get());
@@ -1381,7 +1496,7 @@ TEST_F(WriteBatchWithIndexTest, MutateWhileIteratingCorrectnessTest) {
1381
1496
 
1382
1497
  iter->Seek("ab");
1383
1498
  AssertKey("ab", iter.get());
1384
- ASSERT_OK(batch.Delete("x"));
1499
+ ASSERT_OK(batch_->Delete("x"));
1385
1500
  iter->Seek("x");
1386
1501
  AssertKey("x", iter.get());
1387
1502
  ASSERT_EQ(kDeleteRecord, iter->Entry().type);
@@ -1400,10 +1515,10 @@ void AssertIterValue(std::string value, Iterator* iter) {
1400
1515
  }
1401
1516
 
1402
1517
  // same thing as above, but testing IteratorWithBase
1403
- TEST_F(WriteBatchWithIndexTest, MutateWhileIteratingBaseCorrectnessTest) {
1518
+ TEST_F(WBWIOverwriteTest, MutateWhileIteratingBaseCorrectnessTest) {
1404
1519
  WriteBatchWithIndex batch(BytewiseComparator(), 0, true);
1405
1520
  for (char c = 'a'; c <= 'z'; ++c) {
1406
- ASSERT_OK(batch.Put(std::string(1, c), std::string(1, c)));
1521
+ ASSERT_OK(batch_->Put(std::string(1, c), std::string(1, c)));
1407
1522
  }
1408
1523
 
1409
1524
  KVMap map;
@@ -1412,20 +1527,19 @@ TEST_F(WriteBatchWithIndexTest, MutateWhileIteratingBaseCorrectnessTest) {
1412
1527
  map["ee"] = "ee";
1413
1528
  map["em"] = "me";
1414
1529
 
1415
- std::unique_ptr<Iterator> iter(
1416
- batch.NewIteratorWithBase(new KVIter(&map)));
1530
+ std::unique_ptr<Iterator> iter(batch_->NewIteratorWithBase(new KVIter(&map)));
1417
1531
  iter->Seek("k");
1418
1532
  AssertIterKey("k", iter.get());
1419
1533
  iter->Next();
1420
1534
  AssertIterKey("l", iter.get());
1421
- ASSERT_OK(batch.Put("ab", "cc"));
1535
+ ASSERT_OK(batch_->Put("ab", "cc"));
1422
1536
  iter->Next();
1423
1537
  AssertIterKey("m", iter.get());
1424
- ASSERT_OK(batch.Put("mm", "kk"));
1538
+ ASSERT_OK(batch_->Put("mm", "kk"));
1425
1539
  iter->Next();
1426
1540
  AssertIterKey("mm", iter.get());
1427
1541
  AssertIterValue("kk", iter.get());
1428
- ASSERT_OK(batch.Delete("mm"));
1542
+ ASSERT_OK(batch_->Delete("mm"));
1429
1543
  iter->Next();
1430
1544
  AssertIterKey("n", iter.get());
1431
1545
  iter->Prev();
@@ -1438,13 +1552,13 @@ TEST_F(WriteBatchWithIndexTest, MutateWhileIteratingBaseCorrectnessTest) {
1438
1552
  AssertIterKey("aa", iter.get());
1439
1553
  iter->Prev();
1440
1554
  AssertIterKey("a", iter.get());
1441
- ASSERT_OK(batch.Delete("aa"));
1555
+ ASSERT_OK(batch_->Delete("aa"));
1442
1556
  iter->Next();
1443
1557
  AssertIterKey("ab", iter.get());
1444
1558
  iter->Prev();
1445
1559
  AssertIterKey("a", iter.get());
1446
1560
 
1447
- ASSERT_OK(batch.Delete("x"));
1561
+ ASSERT_OK(batch_->Delete("x"));
1448
1562
  iter->Seek("x");
1449
1563
  AssertIterKey("y", iter.get());
1450
1564
  iter->Next();
@@ -1453,11 +1567,11 @@ TEST_F(WriteBatchWithIndexTest, MutateWhileIteratingBaseCorrectnessTest) {
1453
1567
  iter->Prev();
1454
1568
  AssertIterKey("w", iter.get());
1455
1569
 
1456
- ASSERT_OK(batch.Delete("e"));
1570
+ ASSERT_OK(batch_->Delete("e"));
1457
1571
  iter->Seek("e");
1458
1572
  AssertIterKey("ee", iter.get());
1459
1573
  AssertIterValue("ee", iter.get());
1460
- ASSERT_OK(batch.Put("ee", "xx"));
1574
+ ASSERT_OK(batch_->Put("ee", "xx"));
1461
1575
  // still the same value
1462
1576
  AssertIterValue("ee", iter.get());
1463
1577
  iter->Next();
@@ -1470,10 +1584,9 @@ TEST_F(WriteBatchWithIndexTest, MutateWhileIteratingBaseCorrectnessTest) {
1470
1584
  }
1471
1585
 
1472
1586
  // stress testing mutations with IteratorWithBase
1473
- TEST_F(WriteBatchWithIndexTest, MutateWhileIteratingBaseStressTest) {
1474
- WriteBatchWithIndex batch(BytewiseComparator(), 0, true);
1587
+ TEST_F(WBWIOverwriteTest, MutateWhileIteratingBaseStressTest) {
1475
1588
  for (char c = 'a'; c <= 'z'; ++c) {
1476
- ASSERT_OK(batch.Put(std::string(1, c), std::string(1, c)));
1589
+ ASSERT_OK(batch_->Put(std::string(1, c), std::string(1, c)));
1477
1590
  }
1478
1591
 
1479
1592
  KVMap map;
@@ -1481,8 +1594,7 @@ TEST_F(WriteBatchWithIndexTest, MutateWhileIteratingBaseStressTest) {
1481
1594
  map[std::string(2, c)] = std::string(2, c);
1482
1595
  }
1483
1596
 
1484
- std::unique_ptr<Iterator> iter(
1485
- batch.NewIteratorWithBase(new KVIter(&map)));
1597
+ std::unique_ptr<Iterator> iter(batch_->NewIteratorWithBase(new KVIter(&map)));
1486
1598
 
1487
1599
  Random rnd(301);
1488
1600
  for (int i = 0; i < 1000000; ++i) {
@@ -1490,16 +1602,16 @@ TEST_F(WriteBatchWithIndexTest, MutateWhileIteratingBaseStressTest) {
1490
1602
  char c = static_cast<char>(rnd.Uniform(26) + 'a');
1491
1603
  switch (random) {
1492
1604
  case 0:
1493
- ASSERT_OK(batch.Put(std::string(1, c), "xxx"));
1605
+ ASSERT_OK(batch_->Put(std::string(1, c), "xxx"));
1494
1606
  break;
1495
1607
  case 1:
1496
- ASSERT_OK(batch.Put(std::string(2, c), "xxx"));
1608
+ ASSERT_OK(batch_->Put(std::string(2, c), "xxx"));
1497
1609
  break;
1498
1610
  case 2:
1499
- ASSERT_OK(batch.Delete(std::string(1, c)));
1611
+ ASSERT_OK(batch_->Delete(std::string(1, c)));
1500
1612
  break;
1501
1613
  case 3:
1502
- ASSERT_OK(batch.Delete(std::string(2, c)));
1614
+ ASSERT_OK(batch_->Delete(std::string(2, c)));
1503
1615
  break;
1504
1616
  case 4:
1505
1617
  iter->Seek(std::string(1, c));
@@ -1524,330 +1636,758 @@ TEST_F(WriteBatchWithIndexTest, MutateWhileIteratingBaseStressTest) {
1524
1636
  ASSERT_OK(iter->status());
1525
1637
  }
1526
1638
 
1527
- static void PrintContents(WriteBatchWithIndex* batch,
1528
- ColumnFamilyHandle* column_family,
1529
- std::string* result) {
1530
- WBWIIterator* iter;
1531
- if (column_family == nullptr) {
1532
- iter = batch->NewIterator();
1533
- } else {
1534
- iter = batch->NewIterator(column_family);
1535
- }
1536
-
1537
- iter->SeekToFirst();
1538
- while (iter->Valid()) {
1539
- ASSERT_OK(iter->status());
1540
-
1541
- WriteEntry e = iter->Entry();
1542
-
1543
- if (e.type == kPutRecord) {
1544
- result->append("PUT(");
1545
- result->append(e.key.ToString());
1546
- result->append("):");
1547
- result->append(e.value.ToString());
1548
- } else if (e.type == kMergeRecord) {
1549
- result->append("MERGE(");
1550
- result->append(e.key.ToString());
1551
- result->append("):");
1552
- result->append(e.value.ToString());
1553
- } else if (e.type == kSingleDeleteRecord) {
1554
- result->append("SINGLE-DEL(");
1555
- result->append(e.key.ToString());
1556
- result->append(")");
1557
- } else {
1558
- assert(e.type == kDeleteRecord);
1559
- result->append("DEL(");
1560
- result->append(e.key.ToString());
1561
- result->append(")");
1562
- }
1563
-
1564
- result->append(",");
1565
- iter->Next();
1566
- }
1567
-
1568
- ASSERT_OK(iter->status());
1569
-
1570
- delete iter;
1571
- }
1572
-
1573
- static std::string PrintContents(WriteBatchWithIndex* batch,
1574
- ColumnFamilyHandle* column_family) {
1575
- std::string result;
1576
- PrintContents(batch, column_family, &result);
1577
- return result;
1578
- }
1579
-
1580
- static void PrintContents(WriteBatchWithIndex* batch, KVMap* base_map,
1581
- ColumnFamilyHandle* column_family,
1582
- std::string* result) {
1583
- Iterator* iter;
1584
- if (column_family == nullptr) {
1585
- iter = batch->NewIteratorWithBase(new KVIter(base_map));
1586
- } else {
1587
- iter = batch->NewIteratorWithBase(column_family, new KVIter(base_map));
1588
- }
1589
-
1639
+ TEST_P(WriteBatchWithIndexTest, TestNewIteratorWithBaseFromWbwi) {
1640
+ ColumnFamilyHandleImplDummy cf1(6, BytewiseComparator());
1641
+ KVMap map;
1642
+ map["a"] = "aa";
1643
+ map["c"] = "cc";
1644
+ map["e"] = "ee";
1645
+ std::unique_ptr<Iterator> iter(
1646
+ batch_->NewIteratorWithBase(&cf1, new KVIter(&map)));
1647
+ ASSERT_NE(nullptr, iter);
1590
1648
  iter->SeekToFirst();
1591
- while (iter->Valid()) {
1592
- ASSERT_OK(iter->status());
1593
-
1594
- Slice key = iter->key();
1595
- Slice value = iter->value();
1596
-
1597
- result->append(key.ToString());
1598
- result->append(":");
1599
- result->append(value.ToString());
1600
- result->append(",");
1601
-
1602
- iter->Next();
1603
- }
1604
-
1649
+ ASSERT_TRUE(iter->Valid());
1605
1650
  ASSERT_OK(iter->status());
1606
-
1607
- delete iter;
1608
- }
1609
-
1610
- static std::string PrintContents(WriteBatchWithIndex* batch, KVMap* base_map,
1611
- ColumnFamilyHandle* column_family) {
1612
- std::string result;
1613
- PrintContents(batch, base_map, column_family, &result);
1614
- return result;
1615
1651
  }
1616
1652
 
1617
- TEST_F(WriteBatchWithIndexTest, SavePointTest) {
1618
- WriteBatchWithIndex batch;
1653
+ TEST_P(WriteBatchWithIndexTest, SavePointTest) {
1619
1654
  ColumnFamilyHandleImplDummy cf1(1, BytewiseComparator());
1655
+ KVMap empty_map;
1656
+ std::unique_ptr<Iterator> cf0_iter(
1657
+ batch_->NewIteratorWithBase(new KVIter(&empty_map)));
1658
+ std::unique_ptr<Iterator> cf1_iter(
1659
+ batch_->NewIteratorWithBase(&cf1, new KVIter(&empty_map)));
1620
1660
  Status s;
1621
-
1622
- ASSERT_OK(batch.Put("A", "a"));
1623
- ASSERT_OK(batch.Put("B", "b"));
1624
- ASSERT_OK(batch.Put("A", "aa"));
1625
- ASSERT_OK(batch.Put(&cf1, "A", "a1"));
1626
- ASSERT_OK(batch.Delete(&cf1, "B"));
1627
- ASSERT_OK(batch.Put(&cf1, "C", "c1"));
1628
- ASSERT_OK(batch.Put(&cf1, "E", "e1"));
1629
-
1630
- batch.SetSavePoint(); // 1
1631
-
1632
- ASSERT_OK(batch.Put("C", "cc"));
1633
- ASSERT_OK(batch.Put("B", "bb"));
1634
- ASSERT_OK(batch.Delete("A"));
1635
- ASSERT_OK(batch.Put(&cf1, "B", "b1"));
1636
- ASSERT_OK(batch.Delete(&cf1, "A"));
1637
- ASSERT_OK(batch.SingleDelete(&cf1, "E"));
1638
- batch.SetSavePoint(); // 2
1639
-
1640
- ASSERT_OK(batch.Put("A", "aaa"));
1641
- ASSERT_OK(batch.Put("A", "xxx"));
1642
- ASSERT_OK(batch.Delete("B"));
1643
- ASSERT_OK(batch.Put(&cf1, "B", "b2"));
1644
- ASSERT_OK(batch.Delete(&cf1, "C"));
1645
- batch.SetSavePoint(); // 3
1646
- batch.SetSavePoint(); // 4
1647
- ASSERT_OK(batch.SingleDelete("D"));
1648
- ASSERT_OK(batch.Delete(&cf1, "D"));
1649
- ASSERT_OK(batch.Delete(&cf1, "E"));
1650
-
1651
- ASSERT_EQ(
1652
- "PUT(A):a,PUT(A):aa,DEL(A),PUT(A):aaa,PUT(A):xxx,PUT(B):b,PUT(B):bb,DEL("
1653
- "B)"
1654
- ",PUT(C):cc,SINGLE-DEL(D),",
1655
- PrintContents(&batch, nullptr));
1656
-
1657
- ASSERT_EQ(
1658
- "PUT(A):a1,DEL(A),DEL(B),PUT(B):b1,PUT(B):b2,PUT(C):c1,DEL(C),"
1659
- "DEL(D),PUT(E):e1,SINGLE-DEL(E),DEL(E),",
1660
- PrintContents(&batch, &cf1));
1661
-
1662
- ASSERT_OK(batch.RollbackToSavePoint()); // rollback to 4
1663
- ASSERT_EQ(
1664
- "PUT(A):a,PUT(A):aa,DEL(A),PUT(A):aaa,PUT(A):xxx,PUT(B):b,PUT(B):bb,DEL("
1665
- "B)"
1666
- ",PUT(C):cc,",
1667
- PrintContents(&batch, nullptr));
1668
-
1669
- ASSERT_EQ(
1670
- "PUT(A):a1,DEL(A),DEL(B),PUT(B):b1,PUT(B):b2,PUT(C):c1,DEL(C),"
1671
- "PUT(E):e1,SINGLE-DEL(E),",
1672
- PrintContents(&batch, &cf1));
1673
-
1674
- ASSERT_OK(batch.RollbackToSavePoint()); // rollback to 3
1675
- ASSERT_EQ(
1676
- "PUT(A):a,PUT(A):aa,DEL(A),PUT(A):aaa,PUT(A):xxx,PUT(B):b,PUT(B):bb,DEL("
1677
- "B)"
1678
- ",PUT(C):cc,",
1679
- PrintContents(&batch, nullptr));
1680
-
1681
- ASSERT_EQ(
1682
- "PUT(A):a1,DEL(A),DEL(B),PUT(B):b1,PUT(B):b2,PUT(C):c1,DEL(C),"
1683
- "PUT(E):e1,SINGLE-DEL(E),",
1684
- PrintContents(&batch, &cf1));
1685
-
1686
- ASSERT_OK(batch.RollbackToSavePoint()); // rollback to 2
1687
- ASSERT_EQ("PUT(A):a,PUT(A):aa,DEL(A),PUT(B):b,PUT(B):bb,PUT(C):cc,",
1688
- PrintContents(&batch, nullptr));
1689
-
1690
- ASSERT_EQ(
1691
- "PUT(A):a1,DEL(A),DEL(B),PUT(B):b1,PUT(C):c1,"
1692
- "PUT(E):e1,SINGLE-DEL(E),",
1693
- PrintContents(&batch, &cf1));
1694
-
1695
- batch.SetSavePoint(); // 5
1696
- ASSERT_OK(batch.Put("X", "x"));
1697
-
1698
- ASSERT_EQ("PUT(A):a,PUT(A):aa,DEL(A),PUT(B):b,PUT(B):bb,PUT(C):cc,PUT(X):x,",
1699
- PrintContents(&batch, nullptr));
1700
-
1701
- ASSERT_OK(batch.RollbackToSavePoint()); // rollback to 5
1702
- ASSERT_EQ("PUT(A):a,PUT(A):aa,DEL(A),PUT(B):b,PUT(B):bb,PUT(C):cc,",
1703
- PrintContents(&batch, nullptr));
1704
-
1705
- ASSERT_EQ(
1706
- "PUT(A):a1,DEL(A),DEL(B),PUT(B):b1,PUT(C):c1,"
1707
- "PUT(E):e1,SINGLE-DEL(E),",
1708
- PrintContents(&batch, &cf1));
1709
-
1710
- ASSERT_OK(batch.RollbackToSavePoint()); // rollback to 1
1711
- ASSERT_EQ("PUT(A):a,PUT(A):aa,PUT(B):b,", PrintContents(&batch, nullptr));
1712
-
1713
- ASSERT_EQ("PUT(A):a1,DEL(B),PUT(C):c1,PUT(E):e1,",
1714
- PrintContents(&batch, &cf1));
1715
-
1716
- s = batch.RollbackToSavePoint(); // no savepoint found
1661
+ KVMap kvm_cf0_0 = {{"A", "aa"}, {"B", "b"}};
1662
+ KVMap kvm_cf1_0 = {{"A", "a1"}, {"C", "c1"}, {"E", "e1"}};
1663
+ KVIter kvi_cf0_0(&kvm_cf0_0);
1664
+ KVIter kvi_cf1_0(&kvm_cf1_0);
1665
+
1666
+ ASSERT_OK(batch_->Put("A", "a"));
1667
+ ASSERT_OK(batch_->Put("B", "b"));
1668
+ ASSERT_OK(batch_->Put("A", "aa"));
1669
+ ASSERT_OK(batch_->Put(&cf1, "A", "a1"));
1670
+ ASSERT_OK(batch_->Delete(&cf1, "B"));
1671
+ ASSERT_OK(batch_->Put(&cf1, "C", "c1"));
1672
+ ASSERT_OK(batch_->Put(&cf1, "E", "e1"));
1673
+
1674
+ AssertItersEqual(cf0_iter.get(), &kvi_cf0_0);
1675
+ AssertItersEqual(cf1_iter.get(), &kvi_cf1_0);
1676
+ batch_->SetSavePoint(); // 1
1677
+
1678
+ KVMap kvm_cf0_1 = {{"B", "bb"}, {"C", "cc"}};
1679
+ KVMap kvm_cf1_1 = {{"B", "b1"}, {"C", "c1"}};
1680
+ KVIter kvi_cf0_1(&kvm_cf0_1);
1681
+ KVIter kvi_cf1_1(&kvm_cf1_1);
1682
+
1683
+ ASSERT_OK(batch_->Put("C", "cc"));
1684
+ ASSERT_OK(batch_->Put("B", "bb"));
1685
+ ASSERT_OK(batch_->Delete("A"));
1686
+ ASSERT_OK(batch_->Put(&cf1, "B", "b1"));
1687
+ ASSERT_OK(batch_->Delete(&cf1, "A"));
1688
+ ASSERT_OK(batch_->SingleDelete(&cf1, "E"));
1689
+ batch_->SetSavePoint(); // 2
1690
+ AssertItersEqual(cf0_iter.get(), &kvi_cf0_1);
1691
+ AssertItersEqual(cf1_iter.get(), &kvi_cf1_1);
1692
+
1693
+ KVMap kvm_cf0_2 = {{"A", "xxx"}, {"C", "cc"}};
1694
+ KVMap kvm_cf1_2 = {{"B", "b2"}};
1695
+ KVIter kvi_cf0_2(&kvm_cf0_2);
1696
+ KVIter kvi_cf1_2(&kvm_cf1_2);
1697
+
1698
+ ASSERT_OK(batch_->Put("A", "aaa"));
1699
+ ASSERT_OK(batch_->Put("A", "xxx"));
1700
+ ASSERT_OK(batch_->Delete("B"));
1701
+ ASSERT_OK(batch_->Put(&cf1, "B", "b2"));
1702
+ ASSERT_OK(batch_->Delete(&cf1, "C"));
1703
+ batch_->SetSavePoint(); // 3
1704
+ batch_->SetSavePoint(); // 4
1705
+ AssertItersEqual(cf0_iter.get(), &kvi_cf0_2);
1706
+ AssertItersEqual(cf1_iter.get(), &kvi_cf1_2);
1707
+
1708
+ KVMap kvm_cf0_4 = {{"A", "xxx"}, {"C", "cc"}};
1709
+ KVMap kvm_cf1_4 = {{"B", "b2"}};
1710
+ KVIter kvi_cf0_4(&kvm_cf0_4);
1711
+ KVIter kvi_cf1_4(&kvm_cf1_4);
1712
+ ASSERT_OK(batch_->SingleDelete("D"));
1713
+ ASSERT_OK(batch_->Delete(&cf1, "D"));
1714
+ ASSERT_OK(batch_->Delete(&cf1, "E"));
1715
+ AssertItersEqual(cf0_iter.get(), &kvi_cf0_4);
1716
+ AssertItersEqual(cf1_iter.get(), &kvi_cf1_4);
1717
+
1718
+ ASSERT_OK(batch_->RollbackToSavePoint()); // rollback to 4
1719
+ AssertItersEqual(cf0_iter.get(), &kvi_cf0_2);
1720
+ AssertItersEqual(cf1_iter.get(), &kvi_cf1_2);
1721
+
1722
+ ASSERT_OK(batch_->RollbackToSavePoint()); // rollback to 3
1723
+ AssertItersEqual(cf0_iter.get(), &kvi_cf0_2);
1724
+ AssertItersEqual(cf1_iter.get(), &kvi_cf1_2);
1725
+
1726
+ ASSERT_OK(batch_->RollbackToSavePoint()); // rollback to 2
1727
+ AssertItersEqual(cf0_iter.get(), &kvi_cf0_1);
1728
+ AssertItersEqual(cf1_iter.get(), &kvi_cf1_1);
1729
+
1730
+ batch_->SetSavePoint(); // 5
1731
+ ASSERT_OK(batch_->Put("X", "x"));
1732
+
1733
+ KVMap kvm_cf0_5 = {{"B", "bb"}, {"C", "cc"}, {"X", "x"}};
1734
+ KVIter kvi_cf0_5(&kvm_cf0_5);
1735
+ KVIter kvi_cf1_5(&kvm_cf1_1);
1736
+ AssertItersEqual(cf0_iter.get(), &kvi_cf0_5);
1737
+ AssertItersEqual(cf1_iter.get(), &kvi_cf1_5);
1738
+
1739
+ ASSERT_OK(batch_->RollbackToSavePoint()); // rollback to 5
1740
+ AssertItersEqual(cf0_iter.get(), &kvi_cf0_1);
1741
+ AssertItersEqual(cf1_iter.get(), &kvi_cf1_1);
1742
+
1743
+ ASSERT_OK(batch_->RollbackToSavePoint()); // rollback to 1
1744
+ AssertItersEqual(cf0_iter.get(), &kvi_cf0_0);
1745
+ AssertItersEqual(cf1_iter.get(), &kvi_cf1_0);
1746
+
1747
+ s = batch_->RollbackToSavePoint(); // no savepoint found
1717
1748
  ASSERT_TRUE(s.IsNotFound());
1718
- ASSERT_EQ("PUT(A):a,PUT(A):aa,PUT(B):b,", PrintContents(&batch, nullptr));
1719
-
1720
- ASSERT_EQ("PUT(A):a1,DEL(B),PUT(C):c1,PUT(E):e1,",
1721
- PrintContents(&batch, &cf1));
1749
+ AssertItersEqual(cf0_iter.get(), &kvi_cf0_0);
1750
+ AssertItersEqual(cf1_iter.get(), &kvi_cf1_0);
1722
1751
 
1723
- batch.SetSavePoint(); // 6
1752
+ batch_->SetSavePoint(); // 6
1724
1753
 
1725
- batch.Clear();
1726
- ASSERT_EQ("", PrintContents(&batch, nullptr));
1727
- ASSERT_EQ("", PrintContents(&batch, &cf1));
1754
+ batch_->Clear();
1755
+ ASSERT_EQ("", PrintContents(batch_.get(), nullptr));
1756
+ ASSERT_EQ("", PrintContents(batch_.get(), &cf1));
1728
1757
 
1729
- s = batch.RollbackToSavePoint(); // rollback to 6
1758
+ s = batch_->RollbackToSavePoint(); // rollback to 6
1730
1759
  ASSERT_TRUE(s.IsNotFound());
1731
1760
  }
1732
1761
 
1733
- TEST_F(WriteBatchWithIndexTest, SingleDeleteTest) {
1734
- WriteBatchWithIndex batch;
1762
+ TEST_P(WriteBatchWithIndexTest, SingleDeleteTest) {
1735
1763
  Status s;
1736
1764
  std::string value;
1737
- DBOptions db_options;
1738
1765
 
1739
- ASSERT_OK(batch.SingleDelete("A"));
1766
+ ASSERT_OK(batch_->SingleDelete("A"));
1740
1767
 
1741
- s = batch.GetFromBatch(db_options, "A", &value);
1768
+ s = batch_->GetFromBatch(options_, "A", &value);
1742
1769
  ASSERT_TRUE(s.IsNotFound());
1743
- s = batch.GetFromBatch(db_options, "B", &value);
1770
+ s = batch_->GetFromBatch(options_, "B", &value);
1744
1771
  ASSERT_TRUE(s.IsNotFound());
1745
- value = PrintContents(&batch, nullptr);
1746
- ASSERT_EQ("SINGLE-DEL(A),", value);
1747
1772
 
1748
- batch.Clear();
1749
- ASSERT_OK(batch.Put("A", "a"));
1750
- ASSERT_OK(batch.Put("A", "a2"));
1751
- ASSERT_OK(batch.Put("B", "b"));
1752
- ASSERT_OK(batch.SingleDelete("A"));
1773
+ batch_->Clear();
1774
+ ASSERT_OK(batch_->Put("A", "a"));
1775
+ ASSERT_OK(batch_->Put("A", "a2"));
1776
+ ASSERT_OK(batch_->Put("B", "b"));
1777
+ ASSERT_OK(batch_->SingleDelete("A"));
1753
1778
 
1754
- s = batch.GetFromBatch(db_options, "A", &value);
1779
+ s = batch_->GetFromBatch(options_, "A", &value);
1755
1780
  ASSERT_TRUE(s.IsNotFound());
1756
- s = batch.GetFromBatch(db_options, "B", &value);
1781
+ s = batch_->GetFromBatch(options_, "B", &value);
1757
1782
  ASSERT_OK(s);
1758
1783
  ASSERT_EQ("b", value);
1759
1784
 
1760
- value = PrintContents(&batch, nullptr);
1761
- ASSERT_EQ("PUT(A):a,PUT(A):a2,SINGLE-DEL(A),PUT(B):b,", value);
1785
+ ASSERT_OK(batch_->Put("C", "c"));
1786
+ ASSERT_OK(batch_->Put("A", "a3"));
1787
+ ASSERT_OK(batch_->Delete("B"));
1788
+ ASSERT_OK(batch_->SingleDelete("B"));
1789
+ ASSERT_OK(batch_->SingleDelete("C"));
1762
1790
 
1763
- ASSERT_OK(batch.Put("C", "c"));
1764
- ASSERT_OK(batch.Put("A", "a3"));
1765
- ASSERT_OK(batch.Delete("B"));
1766
- ASSERT_OK(batch.SingleDelete("B"));
1767
- ASSERT_OK(batch.SingleDelete("C"));
1768
-
1769
- s = batch.GetFromBatch(db_options, "A", &value);
1791
+ s = batch_->GetFromBatch(options_, "A", &value);
1770
1792
  ASSERT_OK(s);
1771
1793
  ASSERT_EQ("a3", value);
1772
- s = batch.GetFromBatch(db_options, "B", &value);
1794
+ s = batch_->GetFromBatch(options_, "B", &value);
1773
1795
  ASSERT_TRUE(s.IsNotFound());
1774
- s = batch.GetFromBatch(db_options, "C", &value);
1796
+ s = batch_->GetFromBatch(options_, "C", &value);
1775
1797
  ASSERT_TRUE(s.IsNotFound());
1776
- s = batch.GetFromBatch(db_options, "D", &value);
1798
+ s = batch_->GetFromBatch(options_, "D", &value);
1777
1799
  ASSERT_TRUE(s.IsNotFound());
1778
1800
 
1779
- value = PrintContents(&batch, nullptr);
1780
- ASSERT_EQ(
1781
- "PUT(A):a,PUT(A):a2,SINGLE-DEL(A),PUT(A):a3,PUT(B):b,DEL(B),SINGLE-DEL(B)"
1782
- ",PUT(C):c,SINGLE-DEL(C),",
1783
- value);
1784
-
1785
- ASSERT_OK(batch.Put("B", "b4"));
1786
- ASSERT_OK(batch.Put("C", "c4"));
1787
- ASSERT_OK(batch.Put("D", "d4"));
1788
- ASSERT_OK(batch.SingleDelete("D"));
1789
- ASSERT_OK(batch.SingleDelete("D"));
1790
- ASSERT_OK(batch.Delete("A"));
1801
+ ASSERT_OK(batch_->Put("B", "b4"));
1802
+ ASSERT_OK(batch_->Put("C", "c4"));
1803
+ ASSERT_OK(batch_->Put("D", "d4"));
1804
+ ASSERT_OK(batch_->SingleDelete("D"));
1805
+ ASSERT_OK(batch_->SingleDelete("D"));
1806
+ ASSERT_OK(batch_->Delete("A"));
1791
1807
 
1792
- s = batch.GetFromBatch(db_options, "A", &value);
1808
+ s = batch_->GetFromBatch(options_, "A", &value);
1793
1809
  ASSERT_TRUE(s.IsNotFound());
1794
- s = batch.GetFromBatch(db_options, "B", &value);
1810
+ s = batch_->GetFromBatch(options_, "B", &value);
1795
1811
  ASSERT_OK(s);
1796
1812
  ASSERT_EQ("b4", value);
1797
- s = batch.GetFromBatch(db_options, "C", &value);
1813
+ s = batch_->GetFromBatch(options_, "C", &value);
1798
1814
  ASSERT_OK(s);
1799
1815
  ASSERT_EQ("c4", value);
1800
- s = batch.GetFromBatch(db_options, "D", &value);
1816
+ s = batch_->GetFromBatch(options_, "D", &value);
1801
1817
  ASSERT_TRUE(s.IsNotFound());
1802
-
1803
- value = PrintContents(&batch, nullptr);
1804
- ASSERT_EQ(
1805
- "PUT(A):a,PUT(A):a2,SINGLE-DEL(A),PUT(A):a3,DEL(A),PUT(B):b,DEL(B),"
1806
- "SINGLE-DEL(B),PUT(B):b4,PUT(C):c,SINGLE-DEL(C),PUT(C):c4,PUT(D):d4,"
1807
- "SINGLE-DEL(D),SINGLE-DEL(D),",
1808
- value);
1809
1818
  }
1810
1819
 
1811
- TEST_F(WriteBatchWithIndexTest, SingleDeleteDeltaIterTest) {
1820
+ TEST_P(WriteBatchWithIndexTest, SingleDeleteDeltaIterTest) {
1812
1821
  std::string value;
1813
- DBOptions db_options;
1814
- WriteBatchWithIndex batch(BytewiseComparator(), 20, true /* overwrite_key */);
1815
-
1816
- ASSERT_OK(batch.Put("A", "a"));
1817
- ASSERT_OK(batch.Put("A", "a2"));
1818
- ASSERT_OK(batch.Put("B", "b"));
1819
- ASSERT_OK(batch.SingleDelete("A"));
1820
- ASSERT_OK(batch.Delete("B"));
1822
+ ASSERT_OK(batch_->Put("A", "a"));
1823
+ ASSERT_OK(batch_->Put("A", "a2"));
1824
+ ASSERT_OK(batch_->Put("B", "b"));
1825
+ ASSERT_OK(batch_->SingleDelete("A"));
1826
+ ASSERT_OK(batch_->Delete("B"));
1821
1827
 
1822
1828
  KVMap map;
1823
- value = PrintContents(&batch, &map, nullptr);
1829
+ value = PrintContents(batch_.get(), &map, nullptr);
1824
1830
  ASSERT_EQ("", value);
1825
1831
 
1826
1832
  map["A"] = "aa";
1827
1833
  map["C"] = "cc";
1828
1834
  map["D"] = "dd";
1829
1835
 
1830
- ASSERT_OK(batch.SingleDelete("B"));
1831
- ASSERT_OK(batch.SingleDelete("C"));
1832
- ASSERT_OK(batch.SingleDelete("Z"));
1836
+ ASSERT_OK(batch_->SingleDelete("B"));
1837
+ ASSERT_OK(batch_->SingleDelete("C"));
1838
+ ASSERT_OK(batch_->SingleDelete("Z"));
1833
1839
 
1834
- value = PrintContents(&batch, &map, nullptr);
1840
+ value = PrintContents(batch_.get(), &map, nullptr);
1835
1841
  ASSERT_EQ("D:dd,", value);
1836
1842
 
1837
- ASSERT_OK(batch.Put("A", "a3"));
1838
- ASSERT_OK(batch.Put("B", "b3"));
1839
- ASSERT_OK(batch.SingleDelete("A"));
1840
- ASSERT_OK(batch.SingleDelete("A"));
1841
- ASSERT_OK(batch.SingleDelete("D"));
1842
- ASSERT_OK(batch.SingleDelete("D"));
1843
- ASSERT_OK(batch.Delete("D"));
1843
+ ASSERT_OK(batch_->Put("A", "a3"));
1844
+ ASSERT_OK(batch_->Put("B", "b3"));
1845
+ ASSERT_OK(batch_->SingleDelete("A"));
1846
+ ASSERT_OK(batch_->SingleDelete("A"));
1847
+ ASSERT_OK(batch_->SingleDelete("D"));
1848
+ ASSERT_OK(batch_->SingleDelete("D"));
1849
+ ASSERT_OK(batch_->Delete("D"));
1844
1850
 
1845
1851
  map["E"] = "ee";
1846
1852
 
1847
- value = PrintContents(&batch, &map, nullptr);
1853
+ value = PrintContents(batch_.get(), &map, nullptr);
1848
1854
  ASSERT_EQ("B:b3,E:ee,", value);
1849
1855
  }
1850
1856
 
1857
+ TEST_P(WriteBatchWithIndexTest, MultiGetTest) {
1858
+ // MultiGet a lot of keys in order to force std::vector reallocations
1859
+ std::vector<std::string> keys;
1860
+ for (int i = 0; i < 100; ++i) {
1861
+ keys.emplace_back(std::to_string(i));
1862
+ }
1863
+
1864
+ ASSERT_OK(OpenDB());
1865
+ ColumnFamilyHandle* cf0 = db_->DefaultColumnFamily();
1866
+
1867
+ // Write some data to the db for the even numbered keys
1868
+ {
1869
+ WriteBatch wb;
1870
+ for (size_t i = 0; i < keys.size(); i += 2) {
1871
+ std::string val = "val" + std::to_string(i);
1872
+ ASSERT_OK(wb.Put(cf0, keys[i], val));
1873
+ }
1874
+ ASSERT_OK(db_->Write(write_opts_, &wb));
1875
+ for (size_t i = 0; i < keys.size(); i += 2) {
1876
+ std::string value;
1877
+ ASSERT_OK(db_->Get(read_opts_, cf0, keys[i], &value));
1878
+ }
1879
+ }
1880
+
1881
+ // Write some data to the batch
1882
+ for (size_t i = 0; i < keys.size(); ++i) {
1883
+ if ((i % 5) == 0) {
1884
+ ASSERT_OK(batch_->Delete(cf0, keys[i]));
1885
+ } else if ((i % 7) == 0) {
1886
+ std::string val = "new" + std::to_string(i);
1887
+ ASSERT_OK(batch_->Put(cf0, keys[i], val));
1888
+ }
1889
+ if (i > 0 && (i % 3) == 0) {
1890
+ ASSERT_OK(batch_->Merge(cf0, keys[i], "merge"));
1891
+ }
1892
+ }
1893
+
1894
+ std::vector<Slice> key_slices;
1895
+ for (size_t i = 0; i < keys.size(); ++i) {
1896
+ key_slices.emplace_back(keys[i]);
1897
+ }
1898
+ std::vector<PinnableSlice> values(keys.size());
1899
+ std::vector<Status> statuses(keys.size());
1900
+
1901
+ batch_->MultiGetFromBatchAndDB(db_, read_opts_, cf0, key_slices.size(),
1902
+ key_slices.data(), values.data(),
1903
+ statuses.data(), false);
1904
+ for (size_t i = 0; i < keys.size(); ++i) {
1905
+ if (i == 0) {
1906
+ ASSERT_TRUE(statuses[i].IsNotFound());
1907
+ } else if ((i % 3) == 0) {
1908
+ ASSERT_OK(statuses[i]);
1909
+ if ((i % 5) == 0) { // Merge after Delete
1910
+ ASSERT_EQ(values[i], "merge");
1911
+ } else if ((i % 7) == 0) { // Merge after Put
1912
+ std::string val = "new" + std::to_string(i);
1913
+ ASSERT_EQ(values[i], val + ",merge");
1914
+ } else if ((i % 2) == 0) {
1915
+ std::string val = "val" + std::to_string(i);
1916
+ ASSERT_EQ(values[i], val + ",merge");
1917
+ } else {
1918
+ ASSERT_EQ(values[i], "merge");
1919
+ }
1920
+ } else if ((i % 5) == 0) {
1921
+ ASSERT_TRUE(statuses[i].IsNotFound());
1922
+ } else if ((i % 7) == 0) {
1923
+ ASSERT_OK(statuses[i]);
1924
+ ASSERT_EQ(values[i], "new" + std::to_string(i));
1925
+ } else if ((i % 2) == 0) {
1926
+ ASSERT_OK(statuses[i]);
1927
+ ASSERT_EQ(values[i], "val" + std::to_string(i));
1928
+ } else {
1929
+ ASSERT_TRUE(statuses[i].IsNotFound());
1930
+ }
1931
+ }
1932
+ }
1933
+ TEST_P(WriteBatchWithIndexTest, MultiGetTest2) {
1934
+ // MultiGet a lot of keys in order to force std::vector reallocations
1935
+ const int num_keys = 700;
1936
+ const int keys_per_pass = 100;
1937
+ std::vector<std::string> keys;
1938
+ for (size_t i = 0; i < num_keys; ++i) {
1939
+ keys.emplace_back(std::to_string(i));
1940
+ }
1941
+ ASSERT_OK(OpenDB());
1942
+ ColumnFamilyHandle* cf0 = db_->DefaultColumnFamily();
1943
+
1944
+ // Keys 0- 99 have a PUT in the batch but not DB
1945
+ // Keys 100-199 have a PUT in the DB
1946
+ // Keys 200-299 Have a PUT/DELETE
1947
+ // Keys 300-399 Have a PUT/DELETE/MERGE
1948
+ // Keys 400-499 have a PUT/MERGE
1949
+ // Keys 500-599 have a MERGE only
1950
+ // Keys 600-699 were never written
1951
+ {
1952
+ WriteBatch wb;
1953
+ for (size_t i = 100; i < 500; i++) {
1954
+ std::string val = std::to_string(i);
1955
+ ASSERT_OK(wb.Put(cf0, keys[i], val));
1956
+ }
1957
+ ASSERT_OK(db_->Write(write_opts_, &wb));
1958
+ }
1959
+ ASSERT_OK(db_->Flush(FlushOptions(), cf0));
1960
+ for (size_t i = 0; i < 100; i++) {
1961
+ ASSERT_OK(batch_->Put(cf0, keys[i], keys[i]));
1962
+ }
1963
+ for (size_t i = 200; i < 400; i++) {
1964
+ ASSERT_OK(batch_->Delete(cf0, keys[i]));
1965
+ }
1966
+ for (size_t i = 300; i < 600; i++) {
1967
+ std::string val = std::to_string(i) + "m";
1968
+ ASSERT_OK(batch_->Merge(cf0, keys[i], val));
1969
+ }
1970
+
1971
+ Random rnd(301);
1972
+ std::vector<PinnableSlice> values(keys_per_pass);
1973
+ std::vector<Status> statuses(keys_per_pass);
1974
+ for (int pass = 0; pass < 40; pass++) {
1975
+ std::vector<Slice> key_slices;
1976
+ for (size_t i = 0; i < keys_per_pass; i++) {
1977
+ int random = rnd.Uniform(num_keys);
1978
+ key_slices.emplace_back(keys[random]);
1979
+ }
1980
+ batch_->MultiGetFromBatchAndDB(db_, read_opts_, cf0, keys_per_pass,
1981
+ key_slices.data(), values.data(),
1982
+ statuses.data(), false);
1983
+ for (size_t i = 0; i < keys_per_pass; i++) {
1984
+ int key = ParseInt(key_slices[i].ToString());
1985
+ switch (key / 100) {
1986
+ case 0: // 0-99 PUT only
1987
+ ASSERT_OK(statuses[i]);
1988
+ ASSERT_EQ(values[i], key_slices[i].ToString());
1989
+ break;
1990
+ case 1: // 100-199 PUT only
1991
+ ASSERT_OK(statuses[i]);
1992
+ ASSERT_EQ(values[i], key_slices[i].ToString());
1993
+ break;
1994
+ case 2: // 200-299 Deleted
1995
+ ASSERT_TRUE(statuses[i].IsNotFound());
1996
+ break;
1997
+ case 3: // 300-399 Delete+Merge
1998
+ ASSERT_OK(statuses[i]);
1999
+ ASSERT_EQ(values[i], key_slices[i].ToString() + "m");
2000
+ break;
2001
+ case 4: // 400-400 Put+ Merge
2002
+ ASSERT_OK(statuses[i]);
2003
+ ASSERT_EQ(values[i], key_slices[i].ToString() + "," +
2004
+ key_slices[i].ToString() + "m");
2005
+ break;
2006
+ case 5: // Merge only
2007
+ ASSERT_OK(statuses[i]);
2008
+ ASSERT_EQ(values[i], key_slices[i].ToString() + "m");
2009
+ break;
2010
+ case 6: // Never written
2011
+ ASSERT_TRUE(statuses[i].IsNotFound());
2012
+ break;
2013
+ default:
2014
+ assert(false);
2015
+ } // end switch
2016
+ } // End for each key
2017
+ } // end for passes
2018
+ }
2019
+
2020
+ // This test has merges, but the merge does not play into the final result
2021
+ TEST_P(WriteBatchWithIndexTest, FakeMergeWithIteratorTest) {
2022
+ ASSERT_OK(OpenDB());
2023
+ ColumnFamilyHandle* cf0 = db_->DefaultColumnFamily();
2024
+
2025
+ // The map we are starting with
2026
+ KVMap input = {
2027
+ {"odm", "odm0"},
2028
+ {"omd", "omd0"},
2029
+ {"omp", "omp0"},
2030
+ };
2031
+ KVMap result = {
2032
+ {"odm", "odm2"}, // Orig, Delete, Merge
2033
+ {"mp", "mp1"}, // Merge, Put
2034
+ {"omp", "omp2"}, // Origi, Merge, Put
2035
+ {"mmp", "mmp2"} // Merge, Merge, Put
2036
+ };
2037
+
2038
+ for (auto& iter : result) {
2039
+ EXPECT_EQ(AddToBatch(cf0, iter.first), iter.second);
2040
+ }
2041
+ AddToBatch(cf0, "md"); // Merge, Delete
2042
+ AddToBatch(cf0, "mmd"); // Merge, Merge, Delete
2043
+ AddToBatch(cf0, "omd"); // Orig, Merge, Delete
2044
+
2045
+ KVIter kvi(&result);
2046
+ // First try just the batch
2047
+ std::unique_ptr<Iterator> iter(
2048
+ batch_->NewIteratorWithBase(cf0, new KVIter(&input)));
2049
+ AssertItersEqual(iter.get(), &kvi);
2050
+ }
2051
+
2052
+ TEST_P(WriteBatchWithIndexTest, IteratorMergeTest) {
2053
+ ASSERT_OK(OpenDB());
2054
+ ColumnFamilyHandle* cf0 = db_->DefaultColumnFamily();
2055
+
2056
+ KVMap result = {
2057
+ {"m", "m0"}, // Merge
2058
+ {"mm", "mm0,mm1"}, // Merge, Merge
2059
+ {"dm", "dm1"}, // Delete, Merge
2060
+ {"dmm", "dmm1,dmm2"}, // Delete, Merge, Merge
2061
+ {"mdm", "mdm2"}, // Merge, Delete, Merge
2062
+ {"mpm", "mpm1,mpm2"}, // Merge, Put, Merge
2063
+ {"pm", "pm0,pm1"}, // Put, Merge
2064
+ {"pmm", "pmm0,pmm1,pmm2"}, // Put, Merge, Merge
2065
+ };
2066
+
2067
+ for (auto& iter : result) {
2068
+ EXPECT_EQ(AddToBatch(cf0, iter.first), iter.second);
2069
+ }
2070
+
2071
+ KVIter kvi(&result);
2072
+ // First try just the batch
2073
+ KVMap empty_map;
2074
+ std::unique_ptr<Iterator> iter(
2075
+ batch_->NewIteratorWithBase(cf0, new KVIter(&empty_map)));
2076
+ AssertItersEqual(iter.get(), &kvi);
2077
+ }
2078
+
2079
+ TEST_P(WriteBatchWithIndexTest, IteratorMergeTestWithOrig) {
2080
+ ASSERT_OK(OpenDB());
2081
+ ColumnFamilyHandle* cf0 = db_->DefaultColumnFamily();
2082
+ KVMap original;
2083
+ KVMap results = {
2084
+ {"m", "om,m0"}, // Merge
2085
+ {"mm", "omm,mm0,mm1"}, // Merge, Merge
2086
+ {"dm", "dm1"}, // Delete, Merge
2087
+ {"dmm", "dmm1,dmm2"}, // Delete, Merge, Merge
2088
+ {"mdm", "mdm2"}, // Merge, Delete, Merge
2089
+ {"mpm", "mpm1,mpm2"}, // Merge, Put, Merge
2090
+ {"pm", "pm0,pm1"}, // Put, Merge
2091
+ {"pmm", "pmm0,pmm1,pmm2"}, // Put, Merge, Merge
2092
+ };
2093
+
2094
+ for (auto& iter : results) {
2095
+ AddToBatch(cf0, iter.first);
2096
+ original[iter.first] = "o" + iter.first;
2097
+ }
2098
+
2099
+ KVIter kvi(&results);
2100
+ // First try just the batch
2101
+ std::unique_ptr<Iterator> iter(
2102
+ batch_->NewIteratorWithBase(cf0, new KVIter(&original)));
2103
+ AssertItersEqual(iter.get(), &kvi);
2104
+ }
2105
+
2106
+ TEST_P(WriteBatchWithIndexTest, GetFromBatchAfterMerge) {
2107
+ std::string value;
2108
+ Status s;
2109
+
2110
+ ASSERT_OK(OpenDB());
2111
+ ASSERT_OK(db_->Put(write_opts_, "o", "aa"));
2112
+ batch_->Merge("o", "bb"); // Merging bb under key "o"
2113
+ batch_->Merge("m", "cc"); // Merging bc under key "m"
2114
+ s = batch_->GetFromBatch(options_, "m", &value);
2115
+ ASSERT_EQ(s.code(), Status::Code::kMergeInProgress);
2116
+ s = batch_->GetFromBatch(options_, "o", &value);
2117
+ ASSERT_EQ(s.code(), Status::Code::kMergeInProgress);
2118
+
2119
+ ASSERT_OK(db_->Write(write_opts_, batch_->GetWriteBatch()));
2120
+ ASSERT_OK(db_->Get(read_opts_, "o", &value));
2121
+ ASSERT_EQ(value, "aa,bb");
2122
+ ASSERT_OK(db_->Get(read_opts_, "m", &value));
2123
+ ASSERT_EQ(value, "cc");
2124
+ }
2125
+
2126
+ TEST_P(WriteBatchWithIndexTest, GetFromBatchAndDBAfterMerge) {
2127
+ std::string value;
2128
+
2129
+ ASSERT_OK(OpenDB());
2130
+ ASSERT_OK(db_->Put(write_opts_, "o", "aa"));
2131
+ ASSERT_OK(batch_->Merge("o", "bb")); // Merging bb under key "o"
2132
+ ASSERT_OK(batch_->Merge("m", "cc")); // Merging bc under key "m"
2133
+ ASSERT_OK(batch_->GetFromBatchAndDB(db_, read_opts_, "o", &value));
2134
+ ASSERT_EQ(value, "aa,bb");
2135
+ ASSERT_OK(batch_->GetFromBatchAndDB(db_, read_opts_, "m", &value));
2136
+ ASSERT_EQ(value, "cc");
2137
+ }
2138
+
2139
+ TEST_F(WBWIKeepTest, GetAfterPut) {
2140
+ std::string value;
2141
+ ASSERT_OK(OpenDB());
2142
+ ColumnFamilyHandle* cf0 = db_->DefaultColumnFamily();
2143
+
2144
+ ASSERT_OK(db_->Put(write_opts_, "key", "orig"));
2145
+
2146
+ ASSERT_OK(batch_->Put("key", "aa")); // Writing aa under key
2147
+ ASSERT_OK(batch_->GetFromBatch(cf0, options_, "key", &value));
2148
+ ASSERT_EQ(value, "aa");
2149
+ ASSERT_OK(batch_->GetFromBatchAndDB(db_, read_opts_, "key", &value));
2150
+ ASSERT_EQ(value, "aa");
2151
+
2152
+ ASSERT_OK(batch_->Merge("key", "bb")); // Merging bb under key
2153
+ ASSERT_OK(batch_->GetFromBatch(cf0, options_, "key", &value));
2154
+ ASSERT_EQ(value, "aa,bb");
2155
+ ASSERT_OK(batch_->GetFromBatchAndDB(db_, read_opts_, "key", &value));
2156
+ ASSERT_EQ(value, "aa,bb");
2157
+
2158
+ ASSERT_OK(batch_->Merge("key", "cc")); // Merging cc under key
2159
+ ASSERT_OK(batch_->GetFromBatch(cf0, options_, "key", &value));
2160
+ ASSERT_EQ(value, "aa,bb,cc");
2161
+ ASSERT_OK(batch_->GetFromBatchAndDB(db_, read_opts_, "key", &value));
2162
+ ASSERT_EQ(value, "aa,bb,cc");
2163
+ }
2164
+
2165
+ TEST_P(WriteBatchWithIndexTest, GetAfterMergePut) {
2166
+ std::string value;
2167
+ ASSERT_OK(OpenDB());
2168
+ ColumnFamilyHandle* cf0 = db_->DefaultColumnFamily();
2169
+ ASSERT_OK(db_->Put(write_opts_, "key", "orig"));
2170
+
2171
+ ASSERT_OK(batch_->Merge("key", "aa")); // Merging aa under key
2172
+ Status s = batch_->GetFromBatch(cf0, options_, "key", &value);
2173
+ ASSERT_EQ(s.code(), Status::Code::kMergeInProgress);
2174
+ ASSERT_OK(batch_->GetFromBatchAndDB(db_, read_opts_, "key", &value));
2175
+ ASSERT_EQ(value, "orig,aa");
2176
+
2177
+ ASSERT_OK(batch_->Merge("key", "bb")); // Merging bb under key
2178
+ s = batch_->GetFromBatch(cf0, options_, "key", &value);
2179
+ ASSERT_EQ(s.code(), Status::Code::kMergeInProgress);
2180
+ ASSERT_OK(batch_->GetFromBatchAndDB(db_, read_opts_, "key", &value));
2181
+ ASSERT_EQ(value, "orig,aa,bb");
2182
+
2183
+ ASSERT_OK(batch_->Put("key", "cc")); // Writing cc under key
2184
+ ASSERT_OK(batch_->GetFromBatch(cf0, options_, "key", &value));
2185
+ ASSERT_EQ(value, "cc");
2186
+ ASSERT_OK(batch_->GetFromBatchAndDB(db_, read_opts_, "key", &value));
2187
+ ASSERT_EQ(value, "cc");
2188
+
2189
+ ASSERT_OK(batch_->Merge("key", "dd")); // Merging dd under key
2190
+ ASSERT_OK(batch_->GetFromBatch(cf0, options_, "key", &value));
2191
+ ASSERT_EQ(value, "cc,dd");
2192
+ ASSERT_OK(batch_->GetFromBatchAndDB(db_, read_opts_, "key", &value));
2193
+ ASSERT_EQ(value, "cc,dd");
2194
+ }
2195
+
2196
+ TEST_P(WriteBatchWithIndexTest, GetAfterMergeDelete) {
2197
+ std::string value;
2198
+ ASSERT_OK(OpenDB());
2199
+ ColumnFamilyHandle* cf0 = db_->DefaultColumnFamily();
2200
+
2201
+ ASSERT_OK(batch_->Merge("key", "aa")); // Merging aa under key
2202
+ Status s = batch_->GetFromBatch(cf0, options_, "key", &value);
2203
+ ASSERT_EQ(s.code(), Status::Code::kMergeInProgress);
2204
+ ASSERT_OK(batch_->GetFromBatchAndDB(db_, read_opts_, "key", &value));
2205
+ ASSERT_EQ(value, "aa");
2206
+
2207
+ ASSERT_OK(batch_->Merge("key", "bb")); // Merging bb under key
2208
+ s = batch_->GetFromBatch(cf0, options_, "key", &value);
2209
+ ASSERT_EQ(s.code(), Status::Code::kMergeInProgress);
2210
+ ASSERT_OK(batch_->GetFromBatchAndDB(db_, read_opts_, "key", &value));
2211
+ ASSERT_EQ(value, "aa,bb");
2212
+
2213
+ ASSERT_OK(batch_->Delete("key")); // Delete key from batch
2214
+ s = batch_->GetFromBatch(cf0, options_, "key", &value);
2215
+ ASSERT_TRUE(s.IsNotFound());
2216
+ s = batch_->GetFromBatchAndDB(db_, read_opts_, "key", &value);
2217
+ ASSERT_TRUE(s.IsNotFound());
2218
+
2219
+ ASSERT_OK(batch_->Merge("key", "cc")); // Merging cc under key
2220
+ ASSERT_OK(batch_->GetFromBatch(cf0, options_, "key", &value));
2221
+ ASSERT_EQ(value, "cc");
2222
+ ASSERT_OK(batch_->GetFromBatchAndDB(db_, read_opts_, "key", &value));
2223
+ ASSERT_EQ(value, "cc");
2224
+ ASSERT_OK(batch_->Merge("key", "dd")); // Merging dd under key
2225
+ ASSERT_OK(batch_->GetFromBatch(cf0, options_, "key", &value));
2226
+ ASSERT_EQ(value, "cc,dd");
2227
+ ASSERT_OK(batch_->GetFromBatchAndDB(db_, read_opts_, "key", &value));
2228
+ ASSERT_EQ(value, "cc,dd");
2229
+ }
2230
+
2231
+ TEST_F(WBWIOverwriteTest, TestBadMergeOperator) {
2232
+ class FailingMergeOperator : public MergeOperator {
2233
+ public:
2234
+ FailingMergeOperator() {}
2235
+
2236
+ bool FullMergeV2(const MergeOperationInput& /*merge_in*/,
2237
+ MergeOperationOutput* /*merge_out*/) const override {
2238
+ return false;
2239
+ }
2240
+
2241
+ const char* Name() const override { return "Failing"; }
2242
+ };
2243
+ options_.merge_operator.reset(new FailingMergeOperator());
2244
+ ASSERT_OK(OpenDB());
2245
+
2246
+ ColumnFamilyHandle* column_family = db_->DefaultColumnFamily();
2247
+ std::string value;
2248
+
2249
+ ASSERT_OK(db_->Put(write_opts_, "a", "a0"));
2250
+ ASSERT_OK(batch_->Put("b", "b0"));
2251
+
2252
+ ASSERT_OK(batch_->Merge("a", "a1"));
2253
+ ASSERT_NOK(batch_->GetFromBatchAndDB(db_, read_opts_, "a", &value));
2254
+ ASSERT_NOK(batch_->GetFromBatch(column_family, options_, "a", &value));
2255
+ ASSERT_OK(batch_->GetFromBatchAndDB(db_, read_opts_, "b", &value));
2256
+ ASSERT_OK(batch_->GetFromBatch(column_family, options_, "b", &value));
2257
+ }
2258
+
2259
+ TEST_P(WriteBatchWithIndexTest, ColumnFamilyWithTimestamp) {
2260
+ ColumnFamilyHandleImplDummy cf2(2,
2261
+ test::BytewiseComparatorWithU64TsWrapper());
2262
+
2263
+ // Sanity checks
2264
+ ASSERT_TRUE(batch_->Put(&cf2, "key", "ts", "value").IsNotSupported());
2265
+ ASSERT_TRUE(batch_->Put(/*column_family=*/nullptr, "key", "ts", "value")
2266
+ .IsInvalidArgument());
2267
+ ASSERT_TRUE(batch_->Delete(&cf2, "key", "ts").IsNotSupported());
2268
+ ASSERT_TRUE(batch_->Delete(/*column_family=*/nullptr, "key", "ts")
2269
+ .IsInvalidArgument());
2270
+ ASSERT_TRUE(batch_->SingleDelete(&cf2, "key", "ts").IsNotSupported());
2271
+ ASSERT_TRUE(batch_->SingleDelete(/*column_family=*/nullptr, "key", "ts")
2272
+ .IsInvalidArgument());
2273
+ {
2274
+ std::string value;
2275
+ ASSERT_TRUE(batch_
2276
+ ->GetFromBatchAndDB(
2277
+ /*db=*/nullptr, ReadOptions(), &cf2, "key", &value)
2278
+ .IsInvalidArgument());
2279
+ }
2280
+ {
2281
+ constexpr size_t num_keys = 2;
2282
+ std::array<Slice, num_keys> keys{{Slice(), Slice()}};
2283
+ std::array<PinnableSlice, num_keys> pinnable_vals{
2284
+ {PinnableSlice(), PinnableSlice()}};
2285
+ std::array<Status, num_keys> statuses{{Status(), Status()}};
2286
+ constexpr bool sorted_input = false;
2287
+ batch_->MultiGetFromBatchAndDB(/*db=*/nullptr, ReadOptions(), &cf2,
2288
+ num_keys, keys.data(), pinnable_vals.data(),
2289
+ statuses.data(), sorted_input);
2290
+ for (const auto& s : statuses) {
2291
+ ASSERT_TRUE(s.IsInvalidArgument());
2292
+ }
2293
+ }
2294
+
2295
+ constexpr uint32_t kMaxKey = 10;
2296
+
2297
+ const auto ts_sz_lookup = [&cf2](uint32_t id) {
2298
+ if (cf2.GetID() == id) {
2299
+ return sizeof(uint64_t);
2300
+ } else {
2301
+ return std::numeric_limits<size_t>::max();
2302
+ }
2303
+ };
2304
+
2305
+ // Put keys
2306
+ for (uint32_t i = 0; i < kMaxKey; ++i) {
2307
+ std::string key;
2308
+ PutFixed32(&key, i);
2309
+ Status s = batch_->Put(&cf2, key, "value" + std::to_string(i));
2310
+ ASSERT_OK(s);
2311
+ }
2312
+
2313
+ WriteBatch* wb = batch_->GetWriteBatch();
2314
+ assert(wb);
2315
+ ASSERT_OK(
2316
+ wb->UpdateTimestamps(std::string(sizeof(uint64_t), '\0'), ts_sz_lookup));
2317
+
2318
+ // Point lookup
2319
+ for (uint32_t i = 0; i < kMaxKey; ++i) {
2320
+ std::string value;
2321
+ std::string key;
2322
+ PutFixed32(&key, i);
2323
+ Status s = batch_->GetFromBatch(&cf2, Options(), key, &value);
2324
+ ASSERT_OK(s);
2325
+ ASSERT_EQ("value" + std::to_string(i), value);
2326
+ }
2327
+
2328
+ // Iterator
2329
+ {
2330
+ std::unique_ptr<WBWIIterator> it(batch_->NewIterator(&cf2));
2331
+ uint32_t start = 0;
2332
+ for (it->SeekToFirst(); it->Valid(); it->Next(), ++start) {
2333
+ std::string key;
2334
+ PutFixed32(&key, start);
2335
+ ASSERT_OK(it->status());
2336
+ ASSERT_EQ(key, it->Entry().key);
2337
+ ASSERT_EQ("value" + std::to_string(start), it->Entry().value);
2338
+ ASSERT_EQ(WriteType::kPutRecord, it->Entry().type);
2339
+ }
2340
+ ASSERT_EQ(kMaxKey, start);
2341
+ }
2342
+
2343
+ // Delete the keys with Delete() or SingleDelete()
2344
+ for (uint32_t i = 0; i < kMaxKey; ++i) {
2345
+ std::string key;
2346
+ PutFixed32(&key, i);
2347
+ Status s;
2348
+ if (0 == (i % 2)) {
2349
+ s = batch_->Delete(&cf2, key);
2350
+ } else {
2351
+ s = batch_->SingleDelete(&cf2, key);
2352
+ }
2353
+ ASSERT_OK(s);
2354
+ }
2355
+
2356
+ ASSERT_OK(wb->UpdateTimestamps(std::string(sizeof(uint64_t), '\xfe'),
2357
+ ts_sz_lookup));
2358
+
2359
+ for (uint32_t i = 0; i < kMaxKey; ++i) {
2360
+ std::string value;
2361
+ std::string key;
2362
+ PutFixed32(&key, i);
2363
+ Status s = batch_->GetFromBatch(&cf2, Options(), key, &value);
2364
+ ASSERT_TRUE(s.IsNotFound());
2365
+ }
2366
+
2367
+ // Iterator
2368
+ {
2369
+ const bool overwrite = GetParam();
2370
+ std::unique_ptr<WBWIIterator> it(batch_->NewIterator(&cf2));
2371
+ uint32_t start = 0;
2372
+ for (it->SeekToFirst(); it->Valid(); it->Next(), ++start) {
2373
+ std::string key;
2374
+ PutFixed32(&key, start);
2375
+ ASSERT_EQ(key, it->Entry().key);
2376
+ if (!overwrite) {
2377
+ ASSERT_EQ(WriteType::kPutRecord, it->Entry().type);
2378
+ it->Next();
2379
+ ASSERT_TRUE(it->Valid());
2380
+ }
2381
+ if (0 == (start % 2)) {
2382
+ ASSERT_EQ(WriteType::kDeleteRecord, it->Entry().type);
2383
+ } else {
2384
+ ASSERT_EQ(WriteType::kSingleDeleteRecord, it->Entry().type);
2385
+ }
2386
+ }
2387
+ }
2388
+ }
2389
+
2390
+ INSTANTIATE_TEST_CASE_P(WBWI, WriteBatchWithIndexTest, testing::Bool());
1851
2391
  } // namespace ROCKSDB_NAMESPACE
1852
2392
 
1853
2393
  int main(int argc, char** argv) {