@nxtedition/rocksdb 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1088) hide show
  1. package/CHANGELOG.md +294 -0
  2. package/LICENSE +21 -0
  3. package/README.md +102 -0
  4. package/UPGRADING.md +91 -0
  5. package/binding.cc +1276 -0
  6. package/binding.gyp +73 -0
  7. package/binding.js +1 -0
  8. package/chained-batch.js +44 -0
  9. package/deps/rocksdb/build_version.cc +4 -0
  10. package/deps/rocksdb/rocksdb/CMakeLists.txt +1356 -0
  11. package/deps/rocksdb/rocksdb/COPYING +339 -0
  12. package/deps/rocksdb/rocksdb/LICENSE.Apache +202 -0
  13. package/deps/rocksdb/rocksdb/LICENSE.leveldb +29 -0
  14. package/deps/rocksdb/rocksdb/Makefile +2521 -0
  15. package/deps/rocksdb/rocksdb/TARGETS +2100 -0
  16. package/deps/rocksdb/rocksdb/cache/cache.cc +63 -0
  17. package/deps/rocksdb/rocksdb/cache/cache_bench.cc +381 -0
  18. package/deps/rocksdb/rocksdb/cache/cache_helpers.h +114 -0
  19. package/deps/rocksdb/rocksdb/cache/cache_test.cc +775 -0
  20. package/deps/rocksdb/rocksdb/cache/clock_cache.cc +769 -0
  21. package/deps/rocksdb/rocksdb/cache/clock_cache.h +16 -0
  22. package/deps/rocksdb/rocksdb/cache/lru_cache.cc +574 -0
  23. package/deps/rocksdb/rocksdb/cache/lru_cache.h +339 -0
  24. package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +199 -0
  25. package/deps/rocksdb/rocksdb/cache/sharded_cache.cc +162 -0
  26. package/deps/rocksdb/rocksdb/cache/sharded_cache.h +111 -0
  27. package/deps/rocksdb/rocksdb/cmake/RocksDBConfig.cmake.in +54 -0
  28. package/deps/rocksdb/rocksdb/cmake/modules/CxxFlags.cmake +7 -0
  29. package/deps/rocksdb/rocksdb/cmake/modules/FindJeMalloc.cmake +29 -0
  30. package/deps/rocksdb/rocksdb/cmake/modules/FindNUMA.cmake +29 -0
  31. package/deps/rocksdb/rocksdb/cmake/modules/FindSnappy.cmake +29 -0
  32. package/deps/rocksdb/rocksdb/cmake/modules/FindTBB.cmake +33 -0
  33. package/deps/rocksdb/rocksdb/cmake/modules/Findgflags.cmake +29 -0
  34. package/deps/rocksdb/rocksdb/cmake/modules/Findlz4.cmake +29 -0
  35. package/deps/rocksdb/rocksdb/cmake/modules/Findzstd.cmake +29 -0
  36. package/deps/rocksdb/rocksdb/cmake/modules/ReadVersion.cmake +10 -0
  37. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +108 -0
  38. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.h +115 -0
  39. package/deps/rocksdb/rocksdb/db/blob/blob_constants.h +16 -0
  40. package/deps/rocksdb/rocksdb/db/blob/blob_file_addition.cc +154 -0
  41. package/deps/rocksdb/rocksdb/db/blob/blob_file_addition.h +67 -0
  42. package/deps/rocksdb/rocksdb/db/blob/blob_file_addition_test.cc +206 -0
  43. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.cc +316 -0
  44. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.h +91 -0
  45. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder_test.cc +660 -0
  46. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.cc +99 -0
  47. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.h +49 -0
  48. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache_test.cc +268 -0
  49. package/deps/rocksdb/rocksdb/db/blob/blob_file_garbage.cc +134 -0
  50. package/deps/rocksdb/rocksdb/db/blob/blob_file_garbage.h +57 -0
  51. package/deps/rocksdb/rocksdb/db/blob/blob_file_garbage_test.cc +173 -0
  52. package/deps/rocksdb/rocksdb/db/blob/blob_file_meta.cc +55 -0
  53. package/deps/rocksdb/rocksdb/db/blob/blob_file_meta.h +164 -0
  54. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.cc +423 -0
  55. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.h +81 -0
  56. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader_test.cc +771 -0
  57. package/deps/rocksdb/rocksdb/db/blob/blob_index.h +184 -0
  58. package/deps/rocksdb/rocksdb/db/blob/blob_log_format.cc +145 -0
  59. package/deps/rocksdb/rocksdb/db/blob/blob_log_format.h +148 -0
  60. package/deps/rocksdb/rocksdb/db/blob/blob_log_sequential_reader.cc +132 -0
  61. package/deps/rocksdb/rocksdb/db/blob/blob_log_sequential_reader.h +76 -0
  62. package/deps/rocksdb/rocksdb/db/blob/blob_log_writer.cc +168 -0
  63. package/deps/rocksdb/rocksdb/db/blob/blob_log_writer.h +83 -0
  64. package/deps/rocksdb/rocksdb/db/blob/db_blob_basic_test.cc +307 -0
  65. package/deps/rocksdb/rocksdb/db/blob/db_blob_index_test.cc +464 -0
  66. package/deps/rocksdb/rocksdb/db/builder.cc +358 -0
  67. package/deps/rocksdb/rocksdb/db/builder.h +95 -0
  68. package/deps/rocksdb/rocksdb/db/c.cc +5281 -0
  69. package/deps/rocksdb/rocksdb/db/c_test.c +2883 -0
  70. package/deps/rocksdb/rocksdb/db/column_family.cc +1602 -0
  71. package/deps/rocksdb/rocksdb/db/column_family.h +787 -0
  72. package/deps/rocksdb/rocksdb/db/column_family_test.cc +3427 -0
  73. package/deps/rocksdb/rocksdb/db/compact_files_test.cc +425 -0
  74. package/deps/rocksdb/rocksdb/db/compacted_db_impl.cc +169 -0
  75. package/deps/rocksdb/rocksdb/db/compacted_db_impl.h +118 -0
  76. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +591 -0
  77. package/deps/rocksdb/rocksdb/db/compaction/compaction.h +389 -0
  78. package/deps/rocksdb/rocksdb/db/compaction/compaction_iteration_stats.h +37 -0
  79. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +1023 -0
  80. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +353 -0
  81. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +1254 -0
  82. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +1917 -0
  83. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +208 -0
  84. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_stats_test.cc +1037 -0
  85. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +1224 -0
  86. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +1135 -0
  87. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.h +318 -0
  88. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +255 -0
  89. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.h +57 -0
  90. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +510 -0
  91. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.h +33 -0
  92. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +2190 -0
  93. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +1103 -0
  94. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.h +32 -0
  95. package/deps/rocksdb/rocksdb/db/compaction/sst_partitioner.cc +44 -0
  96. package/deps/rocksdb/rocksdb/db/comparator_db_test.cc +660 -0
  97. package/deps/rocksdb/rocksdb/db/convenience.cc +78 -0
  98. package/deps/rocksdb/rocksdb/db/corruption_test.cc +921 -0
  99. package/deps/rocksdb/rocksdb/db/cuckoo_table_db_test.cc +359 -0
  100. package/deps/rocksdb/rocksdb/db/db_basic_test.cc +3820 -0
  101. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +1058 -0
  102. package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +2128 -0
  103. package/deps/rocksdb/rocksdb/db/db_compaction_filter_test.cc +851 -0
  104. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +6292 -0
  105. package/deps/rocksdb/rocksdb/db/db_dynamic_level_test.cc +509 -0
  106. package/deps/rocksdb/rocksdb/db/db_encryption_test.cc +130 -0
  107. package/deps/rocksdb/rocksdb/db/db_filesnapshot.cc +137 -0
  108. package/deps/rocksdb/rocksdb/db/db_flush_test.cc +1119 -0
  109. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +5057 -0
  110. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +2274 -0
  111. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +3421 -0
  112. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +298 -0
  113. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_experimental.cc +151 -0
  114. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +967 -0
  115. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +1806 -0
  116. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +270 -0
  117. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.h +146 -0
  118. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +683 -0
  119. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.h +333 -0
  120. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +2024 -0
  121. package/deps/rocksdb/rocksdb/db/db_impl/db_secondary_test.cc +932 -0
  122. package/deps/rocksdb/rocksdb/db/db_info_dumper.cc +137 -0
  123. package/deps/rocksdb/rocksdb/db/db_info_dumper.h +15 -0
  124. package/deps/rocksdb/rocksdb/db/db_inplace_update_test.cc +178 -0
  125. package/deps/rocksdb/rocksdb/db/db_io_failure_test.cc +592 -0
  126. package/deps/rocksdb/rocksdb/db/db_iter.cc +1493 -0
  127. package/deps/rocksdb/rocksdb/db/db_iter.h +390 -0
  128. package/deps/rocksdb/rocksdb/db/db_iter_stress_test.cc +657 -0
  129. package/deps/rocksdb/rocksdb/db/db_iter_test.cc +3268 -0
  130. package/deps/rocksdb/rocksdb/db/db_iterator_test.cc +3197 -0
  131. package/deps/rocksdb/rocksdb/db/db_log_iter_test.cc +299 -0
  132. package/deps/rocksdb/rocksdb/db/db_logical_block_size_cache_test.cc +513 -0
  133. package/deps/rocksdb/rocksdb/db/db_memtable_test.cc +329 -0
  134. package/deps/rocksdb/rocksdb/db/db_merge_operand_test.cc +241 -0
  135. package/deps/rocksdb/rocksdb/db/db_merge_operator_test.cc +671 -0
  136. package/deps/rocksdb/rocksdb/db/db_options_test.cc +1022 -0
  137. package/deps/rocksdb/rocksdb/db/db_properties_test.cc +1723 -0
  138. package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +1694 -0
  139. package/deps/rocksdb/rocksdb/db/db_sst_test.cc +1261 -0
  140. package/deps/rocksdb/rocksdb/db/db_statistics_test.cc +164 -0
  141. package/deps/rocksdb/rocksdb/db/db_table_properties_test.cc +488 -0
  142. package/deps/rocksdb/rocksdb/db/db_tailing_iter_test.cc +567 -0
  143. package/deps/rocksdb/rocksdb/db/db_test.cc +6736 -0
  144. package/deps/rocksdb/rocksdb/db/db_test2.cc +5408 -0
  145. package/deps/rocksdb/rocksdb/db/db_test_util.cc +1633 -0
  146. package/deps/rocksdb/rocksdb/db/db_test_util.h +1194 -0
  147. package/deps/rocksdb/rocksdb/db/db_universal_compaction_test.cc +2235 -0
  148. package/deps/rocksdb/rocksdb/db/db_wal_test.cc +1780 -0
  149. package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +2520 -0
  150. package/deps/rocksdb/rocksdb/db/db_with_timestamp_compaction_test.cc +119 -0
  151. package/deps/rocksdb/rocksdb/db/db_write_test.cc +465 -0
  152. package/deps/rocksdb/rocksdb/db/dbformat.cc +222 -0
  153. package/deps/rocksdb/rocksdb/db/dbformat.h +786 -0
  154. package/deps/rocksdb/rocksdb/db/dbformat_test.cc +206 -0
  155. package/deps/rocksdb/rocksdb/db/deletefile_test.cc +580 -0
  156. package/deps/rocksdb/rocksdb/db/error_handler.cc +726 -0
  157. package/deps/rocksdb/rocksdb/db/error_handler.h +117 -0
  158. package/deps/rocksdb/rocksdb/db/error_handler_fs_test.cc +2598 -0
  159. package/deps/rocksdb/rocksdb/db/event_helpers.cc +233 -0
  160. package/deps/rocksdb/rocksdb/db/event_helpers.h +57 -0
  161. package/deps/rocksdb/rocksdb/db/experimental.cc +50 -0
  162. package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +1559 -0
  163. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +910 -0
  164. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.h +195 -0
  165. package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +2936 -0
  166. package/deps/rocksdb/rocksdb/db/fault_injection_test.cc +556 -0
  167. package/deps/rocksdb/rocksdb/db/file_indexer.cc +216 -0
  168. package/deps/rocksdb/rocksdb/db/file_indexer.h +142 -0
  169. package/deps/rocksdb/rocksdb/db/file_indexer_test.cc +350 -0
  170. package/deps/rocksdb/rocksdb/db/filename_test.cc +179 -0
  171. package/deps/rocksdb/rocksdb/db/flush_job.cc +514 -0
  172. package/deps/rocksdb/rocksdb/db/flush_job.h +169 -0
  173. package/deps/rocksdb/rocksdb/db/flush_job_test.cc +647 -0
  174. package/deps/rocksdb/rocksdb/db/flush_scheduler.cc +86 -0
  175. package/deps/rocksdb/rocksdb/db/flush_scheduler.h +54 -0
  176. package/deps/rocksdb/rocksdb/db/forward_iterator.cc +1023 -0
  177. package/deps/rocksdb/rocksdb/db/forward_iterator.h +163 -0
  178. package/deps/rocksdb/rocksdb/db/forward_iterator_bench.cc +377 -0
  179. package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +282 -0
  180. package/deps/rocksdb/rocksdb/db/import_column_family_job.h +75 -0
  181. package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +632 -0
  182. package/deps/rocksdb/rocksdb/db/internal_stats.cc +1461 -0
  183. package/deps/rocksdb/rocksdb/db/internal_stats.h +712 -0
  184. package/deps/rocksdb/rocksdb/db/job_context.h +226 -0
  185. package/deps/rocksdb/rocksdb/db/listener_test.cc +1118 -0
  186. package/deps/rocksdb/rocksdb/db/log_format.h +48 -0
  187. package/deps/rocksdb/rocksdb/db/log_reader.cc +654 -0
  188. package/deps/rocksdb/rocksdb/db/log_reader.h +192 -0
  189. package/deps/rocksdb/rocksdb/db/log_test.cc +901 -0
  190. package/deps/rocksdb/rocksdb/db/log_writer.cc +164 -0
  191. package/deps/rocksdb/rocksdb/db/log_writer.h +115 -0
  192. package/deps/rocksdb/rocksdb/db/logs_with_prep_tracker.cc +67 -0
  193. package/deps/rocksdb/rocksdb/db/logs_with_prep_tracker.h +63 -0
  194. package/deps/rocksdb/rocksdb/db/lookup_key.h +66 -0
  195. package/deps/rocksdb/rocksdb/db/malloc_stats.cc +54 -0
  196. package/deps/rocksdb/rocksdb/db/malloc_stats.h +24 -0
  197. package/deps/rocksdb/rocksdb/db/manual_compaction_test.cc +296 -0
  198. package/deps/rocksdb/rocksdb/db/memtable.cc +1169 -0
  199. package/deps/rocksdb/rocksdb/db/memtable.h +554 -0
  200. package/deps/rocksdb/rocksdb/db/memtable_list.cc +888 -0
  201. package/deps/rocksdb/rocksdb/db/memtable_list.h +438 -0
  202. package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +935 -0
  203. package/deps/rocksdb/rocksdb/db/merge_context.h +134 -0
  204. package/deps/rocksdb/rocksdb/db/merge_helper.cc +421 -0
  205. package/deps/rocksdb/rocksdb/db/merge_helper.h +197 -0
  206. package/deps/rocksdb/rocksdb/db/merge_helper_test.cc +290 -0
  207. package/deps/rocksdb/rocksdb/db/merge_operator.cc +86 -0
  208. package/deps/rocksdb/rocksdb/db/merge_test.cc +608 -0
  209. package/deps/rocksdb/rocksdb/db/obsolete_files_test.cc +338 -0
  210. package/deps/rocksdb/rocksdb/db/options_file_test.cc +119 -0
  211. package/deps/rocksdb/rocksdb/db/output_validator.cc +30 -0
  212. package/deps/rocksdb/rocksdb/db/output_validator.h +47 -0
  213. package/deps/rocksdb/rocksdb/db/perf_context_test.cc +993 -0
  214. package/deps/rocksdb/rocksdb/db/periodic_work_scheduler.cc +113 -0
  215. package/deps/rocksdb/rocksdb/db/periodic_work_scheduler.h +76 -0
  216. package/deps/rocksdb/rocksdb/db/periodic_work_scheduler_test.cc +231 -0
  217. package/deps/rocksdb/rocksdb/db/pinned_iterators_manager.h +87 -0
  218. package/deps/rocksdb/rocksdb/db/plain_table_db_test.cc +1374 -0
  219. package/deps/rocksdb/rocksdb/db/pre_release_callback.h +38 -0
  220. package/deps/rocksdb/rocksdb/db/prefix_test.cc +910 -0
  221. package/deps/rocksdb/rocksdb/db/range_del_aggregator.cc +489 -0
  222. package/deps/rocksdb/rocksdb/db/range_del_aggregator.h +446 -0
  223. package/deps/rocksdb/rocksdb/db/range_del_aggregator_bench.cc +260 -0
  224. package/deps/rocksdb/rocksdb/db/range_del_aggregator_test.cc +709 -0
  225. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.cc +439 -0
  226. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.h +256 -0
  227. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter_test.cc +552 -0
  228. package/deps/rocksdb/rocksdb/db/read_callback.h +53 -0
  229. package/deps/rocksdb/rocksdb/db/repair.cc +722 -0
  230. package/deps/rocksdb/rocksdb/db/repair_test.cc +390 -0
  231. package/deps/rocksdb/rocksdb/db/snapshot_checker.h +61 -0
  232. package/deps/rocksdb/rocksdb/db/snapshot_impl.cc +26 -0
  233. package/deps/rocksdb/rocksdb/db/snapshot_impl.h +167 -0
  234. package/deps/rocksdb/rocksdb/db/table_cache.cc +704 -0
  235. package/deps/rocksdb/rocksdb/db/table_cache.h +233 -0
  236. package/deps/rocksdb/rocksdb/db/table_properties_collector.cc +75 -0
  237. package/deps/rocksdb/rocksdb/db/table_properties_collector.h +107 -0
  238. package/deps/rocksdb/rocksdb/db/table_properties_collector_test.cc +517 -0
  239. package/deps/rocksdb/rocksdb/db/transaction_log_impl.cc +318 -0
  240. package/deps/rocksdb/rocksdb/db/transaction_log_impl.h +128 -0
  241. package/deps/rocksdb/rocksdb/db/trim_history_scheduler.cc +54 -0
  242. package/deps/rocksdb/rocksdb/db/trim_history_scheduler.h +44 -0
  243. package/deps/rocksdb/rocksdb/db/version_builder.cc +1078 -0
  244. package/deps/rocksdb/rocksdb/db/version_builder.h +69 -0
  245. package/deps/rocksdb/rocksdb/db/version_builder_test.cc +1551 -0
  246. package/deps/rocksdb/rocksdb/db/version_edit.cc +955 -0
  247. package/deps/rocksdb/rocksdb/db/version_edit.h +609 -0
  248. package/deps/rocksdb/rocksdb/db/version_edit_handler.cc +699 -0
  249. package/deps/rocksdb/rocksdb/db/version_edit_handler.h +252 -0
  250. package/deps/rocksdb/rocksdb/db/version_edit_test.cc +597 -0
  251. package/deps/rocksdb/rocksdb/db/version_set.cc +6333 -0
  252. package/deps/rocksdb/rocksdb/db/version_set.h +1485 -0
  253. package/deps/rocksdb/rocksdb/db/version_set_test.cc +3035 -0
  254. package/deps/rocksdb/rocksdb/db/wal_edit.cc +204 -0
  255. package/deps/rocksdb/rocksdb/db/wal_edit.h +166 -0
  256. package/deps/rocksdb/rocksdb/db/wal_edit_test.cc +214 -0
  257. package/deps/rocksdb/rocksdb/db/wal_manager.cc +517 -0
  258. package/deps/rocksdb/rocksdb/db/wal_manager.h +119 -0
  259. package/deps/rocksdb/rocksdb/db/wal_manager_test.cc +340 -0
  260. package/deps/rocksdb/rocksdb/db/write_batch.cc +2174 -0
  261. package/deps/rocksdb/rocksdb/db/write_batch_base.cc +94 -0
  262. package/deps/rocksdb/rocksdb/db/write_batch_internal.h +250 -0
  263. package/deps/rocksdb/rocksdb/db/write_batch_test.cc +907 -0
  264. package/deps/rocksdb/rocksdb/db/write_callback.h +27 -0
  265. package/deps/rocksdb/rocksdb/db/write_callback_test.cc +457 -0
  266. package/deps/rocksdb/rocksdb/db/write_controller.cc +128 -0
  267. package/deps/rocksdb/rocksdb/db/write_controller.h +144 -0
  268. package/deps/rocksdb/rocksdb/db/write_controller_test.cc +135 -0
  269. package/deps/rocksdb/rocksdb/db/write_thread.cc +796 -0
  270. package/deps/rocksdb/rocksdb/db/write_thread.h +433 -0
  271. package/deps/rocksdb/rocksdb/db_stress_tool/CMakeLists.txt +14 -0
  272. package/deps/rocksdb/rocksdb/db_stress_tool/batched_ops_stress.cc +341 -0
  273. package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +520 -0
  274. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress.cc +23 -0
  275. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.cc +337 -0
  276. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +554 -0
  277. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_compaction_filter.h +79 -0
  278. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +173 -0
  279. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.h +17 -0
  280. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_env_wrapper.h +38 -0
  281. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +763 -0
  282. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_listener.h +222 -0
  283. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.cc +27 -0
  284. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +428 -0
  285. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_stat.h +218 -0
  286. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_table_properties_collector.h +64 -0
  287. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +2430 -0
  288. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +237 -0
  289. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +343 -0
  290. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +800 -0
  291. package/deps/rocksdb/rocksdb/env/composite_env_wrapper.h +920 -0
  292. package/deps/rocksdb/rocksdb/env/env.cc +733 -0
  293. package/deps/rocksdb/rocksdb/env/env_basic_test.cc +352 -0
  294. package/deps/rocksdb/rocksdb/env/env_chroot.cc +346 -0
  295. package/deps/rocksdb/rocksdb/env/env_chroot.h +22 -0
  296. package/deps/rocksdb/rocksdb/env/env_encryption.cc +1148 -0
  297. package/deps/rocksdb/rocksdb/env/env_encryption_ctr.h +137 -0
  298. package/deps/rocksdb/rocksdb/env/env_hdfs.cc +648 -0
  299. package/deps/rocksdb/rocksdb/env/env_posix.cc +514 -0
  300. package/deps/rocksdb/rocksdb/env/env_test.cc +2230 -0
  301. package/deps/rocksdb/rocksdb/env/file_system.cc +132 -0
  302. package/deps/rocksdb/rocksdb/env/file_system_tracer.cc +448 -0
  303. package/deps/rocksdb/rocksdb/env/file_system_tracer.h +415 -0
  304. package/deps/rocksdb/rocksdb/env/fs_posix.cc +1086 -0
  305. package/deps/rocksdb/rocksdb/env/io_posix.cc +1499 -0
  306. package/deps/rocksdb/rocksdb/env/io_posix.h +402 -0
  307. package/deps/rocksdb/rocksdb/env/io_posix_test.cc +140 -0
  308. package/deps/rocksdb/rocksdb/env/mock_env.cc +1066 -0
  309. package/deps/rocksdb/rocksdb/env/mock_env.h +41 -0
  310. package/deps/rocksdb/rocksdb/env/mock_env_test.cc +85 -0
  311. package/deps/rocksdb/rocksdb/file/delete_scheduler.cc +402 -0
  312. package/deps/rocksdb/rocksdb/file/delete_scheduler.h +150 -0
  313. package/deps/rocksdb/rocksdb/file/delete_scheduler_test.cc +717 -0
  314. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +156 -0
  315. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +99 -0
  316. package/deps/rocksdb/rocksdb/file/file_util.cc +268 -0
  317. package/deps/rocksdb/rocksdb/file/file_util.h +96 -0
  318. package/deps/rocksdb/rocksdb/file/filename.cc +473 -0
  319. package/deps/rocksdb/rocksdb/file/filename.h +182 -0
  320. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +188 -0
  321. package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +315 -0
  322. package/deps/rocksdb/rocksdb/file/random_access_file_reader.h +142 -0
  323. package/deps/rocksdb/rocksdb/file/random_access_file_reader_test.cc +482 -0
  324. package/deps/rocksdb/rocksdb/file/read_write_util.cc +67 -0
  325. package/deps/rocksdb/rocksdb/file/read_write_util.h +34 -0
  326. package/deps/rocksdb/rocksdb/file/readahead_raf.cc +169 -0
  327. package/deps/rocksdb/rocksdb/file/readahead_raf.h +29 -0
  328. package/deps/rocksdb/rocksdb/file/sequence_file_reader.cc +237 -0
  329. package/deps/rocksdb/rocksdb/file/sequence_file_reader.h +63 -0
  330. package/deps/rocksdb/rocksdb/file/sst_file_manager_impl.cc +552 -0
  331. package/deps/rocksdb/rocksdb/file/sst_file_manager_impl.h +203 -0
  332. package/deps/rocksdb/rocksdb/file/writable_file_writer.cc +523 -0
  333. package/deps/rocksdb/rocksdb/file/writable_file_writer.h +251 -0
  334. package/deps/rocksdb/rocksdb/hdfs/env_hdfs.h +386 -0
  335. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +839 -0
  336. package/deps/rocksdb/rocksdb/include/rocksdb/c.h +2218 -0
  337. package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +294 -0
  338. package/deps/rocksdb/rocksdb/include/rocksdb/cleanable.h +71 -0
  339. package/deps/rocksdb/rocksdb/include/rocksdb/compaction_filter.h +214 -0
  340. package/deps/rocksdb/rocksdb/include/rocksdb/compaction_job_stats.h +98 -0
  341. package/deps/rocksdb/rocksdb/include/rocksdb/comparator.h +137 -0
  342. package/deps/rocksdb/rocksdb/include/rocksdb/compression_type.h +40 -0
  343. package/deps/rocksdb/rocksdb/include/rocksdb/concurrent_task_limiter.h +46 -0
  344. package/deps/rocksdb/rocksdb/include/rocksdb/configurable.h +359 -0
  345. package/deps/rocksdb/rocksdb/include/rocksdb/convenience.h +499 -0
  346. package/deps/rocksdb/rocksdb/include/rocksdb/customizable.h +138 -0
  347. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +1697 -0
  348. package/deps/rocksdb/rocksdb/include/rocksdb/db_bench_tool.h +11 -0
  349. package/deps/rocksdb/rocksdb/include/rocksdb/db_dump_tool.h +45 -0
  350. package/deps/rocksdb/rocksdb/include/rocksdb/db_stress_tool.h +11 -0
  351. package/deps/rocksdb/rocksdb/include/rocksdb/env.h +1671 -0
  352. package/deps/rocksdb/rocksdb/include/rocksdb/env_encryption.h +405 -0
  353. package/deps/rocksdb/rocksdb/include/rocksdb/experimental.h +29 -0
  354. package/deps/rocksdb/rocksdb/include/rocksdb/file_checksum.h +129 -0
  355. package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +1472 -0
  356. package/deps/rocksdb/rocksdb/include/rocksdb/filter_policy.h +238 -0
  357. package/deps/rocksdb/rocksdb/include/rocksdb/flush_block_policy.h +61 -0
  358. package/deps/rocksdb/rocksdb/include/rocksdb/io_status.h +269 -0
  359. package/deps/rocksdb/rocksdb/include/rocksdb/iostats_context.h +56 -0
  360. package/deps/rocksdb/rocksdb/include/rocksdb/iterator.h +128 -0
  361. package/deps/rocksdb/rocksdb/include/rocksdb/ldb_tool.h +43 -0
  362. package/deps/rocksdb/rocksdb/include/rocksdb/listener.h +556 -0
  363. package/deps/rocksdb/rocksdb/include/rocksdb/memory_allocator.h +77 -0
  364. package/deps/rocksdb/rocksdb/include/rocksdb/memtablerep.h +385 -0
  365. package/deps/rocksdb/rocksdb/include/rocksdb/merge_operator.h +257 -0
  366. package/deps/rocksdb/rocksdb/include/rocksdb/metadata.h +155 -0
  367. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +1702 -0
  368. package/deps/rocksdb/rocksdb/include/rocksdb/perf_context.h +237 -0
  369. package/deps/rocksdb/rocksdb/include/rocksdb/perf_level.h +35 -0
  370. package/deps/rocksdb/rocksdb/include/rocksdb/persistent_cache.h +73 -0
  371. package/deps/rocksdb/rocksdb/include/rocksdb/rate_limiter.h +139 -0
  372. package/deps/rocksdb/rocksdb/include/rocksdb/rocksdb_namespace.h +10 -0
  373. package/deps/rocksdb/rocksdb/include/rocksdb/slice.h +269 -0
  374. package/deps/rocksdb/rocksdb/include/rocksdb/slice_transform.h +103 -0
  375. package/deps/rocksdb/rocksdb/include/rocksdb/snapshot.h +48 -0
  376. package/deps/rocksdb/rocksdb/include/rocksdb/sst_dump_tool.h +19 -0
  377. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_manager.h +136 -0
  378. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_reader.h +47 -0
  379. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_writer.h +145 -0
  380. package/deps/rocksdb/rocksdb/include/rocksdb/sst_partitioner.h +135 -0
  381. package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +592 -0
  382. package/deps/rocksdb/rocksdb/include/rocksdb/stats_history.h +69 -0
  383. package/deps/rocksdb/rocksdb/include/rocksdb/status.h +608 -0
  384. package/deps/rocksdb/rocksdb/include/rocksdb/table.h +711 -0
  385. package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +280 -0
  386. package/deps/rocksdb/rocksdb/include/rocksdb/thread_status.h +188 -0
  387. package/deps/rocksdb/rocksdb/include/rocksdb/threadpool.h +58 -0
  388. package/deps/rocksdb/rocksdb/include/rocksdb/trace_reader_writer.h +48 -0
  389. package/deps/rocksdb/rocksdb/include/rocksdb/transaction_log.h +121 -0
  390. package/deps/rocksdb/rocksdb/include/rocksdb/types.h +74 -0
  391. package/deps/rocksdb/rocksdb/include/rocksdb/universal_compaction.h +86 -0
  392. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/backupable_db.h +535 -0
  393. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/checkpoint.h +61 -0
  394. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/convenience.h +10 -0
  395. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/db_ttl.h +72 -0
  396. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/debug.h +49 -0
  397. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/env_librados.h +175 -0
  398. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/env_mirror.h +180 -0
  399. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/info_log_finder.h +19 -0
  400. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd.h +288 -0
  401. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd_execute_result.h +71 -0
  402. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/leveldb_options.h +145 -0
  403. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/lua/rocks_lua_custom_library.h +43 -0
  404. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/lua/rocks_lua_util.h +55 -0
  405. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/memory_util.h +50 -0
  406. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/object_registry.h +205 -0
  407. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/optimistic_transaction_db.h +100 -0
  408. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/option_change_migration.h +19 -0
  409. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_type.h +876 -0
  410. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_util.h +128 -0
  411. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/sim_cache.h +94 -0
  412. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/stackable_db.h +504 -0
  413. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/table_properties_collectors.h +95 -0
  414. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction.h +626 -0
  415. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db.h +432 -0
  416. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db_mutex.h +92 -0
  417. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/utility_db.h +34 -0
  418. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/write_batch_with_index.h +279 -0
  419. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +16 -0
  420. package/deps/rocksdb/rocksdb/include/rocksdb/wal_filter.h +102 -0
  421. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch.h +377 -0
  422. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch_base.h +127 -0
  423. package/deps/rocksdb/rocksdb/include/rocksdb/write_buffer_manager.h +106 -0
  424. package/deps/rocksdb/rocksdb/logging/auto_roll_logger.cc +300 -0
  425. package/deps/rocksdb/rocksdb/logging/auto_roll_logger.h +165 -0
  426. package/deps/rocksdb/rocksdb/logging/auto_roll_logger_test.cc +684 -0
  427. package/deps/rocksdb/rocksdb/logging/env_logger.h +165 -0
  428. package/deps/rocksdb/rocksdb/logging/env_logger_test.cc +162 -0
  429. package/deps/rocksdb/rocksdb/logging/event_logger.cc +70 -0
  430. package/deps/rocksdb/rocksdb/logging/event_logger.h +203 -0
  431. package/deps/rocksdb/rocksdb/logging/event_logger_test.cc +43 -0
  432. package/deps/rocksdb/rocksdb/logging/log_buffer.cc +92 -0
  433. package/deps/rocksdb/rocksdb/logging/log_buffer.h +56 -0
  434. package/deps/rocksdb/rocksdb/logging/logging.h +68 -0
  435. package/deps/rocksdb/rocksdb/logging/posix_logger.h +185 -0
  436. package/deps/rocksdb/rocksdb/memory/allocator.h +57 -0
  437. package/deps/rocksdb/rocksdb/memory/arena.cc +233 -0
  438. package/deps/rocksdb/rocksdb/memory/arena.h +141 -0
  439. package/deps/rocksdb/rocksdb/memory/arena_test.cc +204 -0
  440. package/deps/rocksdb/rocksdb/memory/concurrent_arena.cc +47 -0
  441. package/deps/rocksdb/rocksdb/memory/concurrent_arena.h +218 -0
  442. package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.cc +206 -0
  443. package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.h +78 -0
  444. package/deps/rocksdb/rocksdb/memory/memkind_kmem_allocator.cc +33 -0
  445. package/deps/rocksdb/rocksdb/memory/memkind_kmem_allocator.h +27 -0
  446. package/deps/rocksdb/rocksdb/memory/memkind_kmem_allocator_test.cc +102 -0
  447. package/deps/rocksdb/rocksdb/memory/memory_allocator.h +38 -0
  448. package/deps/rocksdb/rocksdb/memory/memory_usage.h +25 -0
  449. package/deps/rocksdb/rocksdb/memtable/alloc_tracker.cc +62 -0
  450. package/deps/rocksdb/rocksdb/memtable/hash_linklist_rep.cc +844 -0
  451. package/deps/rocksdb/rocksdb/memtable/hash_linklist_rep.h +49 -0
  452. package/deps/rocksdb/rocksdb/memtable/hash_skiplist_rep.cc +349 -0
  453. package/deps/rocksdb/rocksdb/memtable/hash_skiplist_rep.h +44 -0
  454. package/deps/rocksdb/rocksdb/memtable/inlineskiplist.h +997 -0
  455. package/deps/rocksdb/rocksdb/memtable/inlineskiplist_test.cc +663 -0
  456. package/deps/rocksdb/rocksdb/memtable/memtablerep_bench.cc +677 -0
  457. package/deps/rocksdb/rocksdb/memtable/skiplist.h +496 -0
  458. package/deps/rocksdb/rocksdb/memtable/skiplist_test.cc +388 -0
  459. package/deps/rocksdb/rocksdb/memtable/skiplistrep.cc +280 -0
  460. package/deps/rocksdb/rocksdb/memtable/stl_wrappers.h +33 -0
  461. package/deps/rocksdb/rocksdb/memtable/vectorrep.cc +301 -0
  462. package/deps/rocksdb/rocksdb/memtable/write_buffer_manager.cc +148 -0
  463. package/deps/rocksdb/rocksdb/memtable/write_buffer_manager_test.cc +203 -0
  464. package/deps/rocksdb/rocksdb/monitoring/file_read_sample.h +23 -0
  465. package/deps/rocksdb/rocksdb/monitoring/histogram.cc +287 -0
  466. package/deps/rocksdb/rocksdb/monitoring/histogram.h +149 -0
  467. package/deps/rocksdb/rocksdb/monitoring/histogram_test.cc +231 -0
  468. package/deps/rocksdb/rocksdb/monitoring/histogram_windowing.cc +200 -0
  469. package/deps/rocksdb/rocksdb/monitoring/histogram_windowing.h +84 -0
  470. package/deps/rocksdb/rocksdb/monitoring/in_memory_stats_history.cc +49 -0
  471. package/deps/rocksdb/rocksdb/monitoring/in_memory_stats_history.h +74 -0
  472. package/deps/rocksdb/rocksdb/monitoring/instrumented_mutex.cc +71 -0
  473. package/deps/rocksdb/rocksdb/monitoring/instrumented_mutex.h +98 -0
  474. package/deps/rocksdb/rocksdb/monitoring/iostats_context.cc +62 -0
  475. package/deps/rocksdb/rocksdb/monitoring/iostats_context_imp.h +60 -0
  476. package/deps/rocksdb/rocksdb/monitoring/iostats_context_test.cc +29 -0
  477. package/deps/rocksdb/rocksdb/monitoring/perf_context.cc +566 -0
  478. package/deps/rocksdb/rocksdb/monitoring/perf_context_imp.h +97 -0
  479. package/deps/rocksdb/rocksdb/monitoring/perf_level.cc +28 -0
  480. package/deps/rocksdb/rocksdb/monitoring/perf_level_imp.h +18 -0
  481. package/deps/rocksdb/rocksdb/monitoring/perf_step_timer.h +79 -0
  482. package/deps/rocksdb/rocksdb/monitoring/persistent_stats_history.cc +169 -0
  483. package/deps/rocksdb/rocksdb/monitoring/persistent_stats_history.h +83 -0
  484. package/deps/rocksdb/rocksdb/monitoring/statistics.cc +431 -0
  485. package/deps/rocksdb/rocksdb/monitoring/statistics.h +138 -0
  486. package/deps/rocksdb/rocksdb/monitoring/statistics_test.cc +47 -0
  487. package/deps/rocksdb/rocksdb/monitoring/stats_history_test.cc +652 -0
  488. package/deps/rocksdb/rocksdb/monitoring/thread_status_impl.cc +163 -0
  489. package/deps/rocksdb/rocksdb/monitoring/thread_status_updater.cc +314 -0
  490. package/deps/rocksdb/rocksdb/monitoring/thread_status_updater.h +233 -0
  491. package/deps/rocksdb/rocksdb/monitoring/thread_status_updater_debug.cc +43 -0
  492. package/deps/rocksdb/rocksdb/monitoring/thread_status_util.cc +206 -0
  493. package/deps/rocksdb/rocksdb/monitoring/thread_status_util.h +134 -0
  494. package/deps/rocksdb/rocksdb/monitoring/thread_status_util_debug.cc +32 -0
  495. package/deps/rocksdb/rocksdb/options/cf_options.cc +1026 -0
  496. package/deps/rocksdb/rocksdb/options/cf_options.h +308 -0
  497. package/deps/rocksdb/rocksdb/options/configurable.cc +681 -0
  498. package/deps/rocksdb/rocksdb/options/configurable_helper.h +251 -0
  499. package/deps/rocksdb/rocksdb/options/configurable_test.cc +757 -0
  500. package/deps/rocksdb/rocksdb/options/configurable_test.h +127 -0
  501. package/deps/rocksdb/rocksdb/options/customizable.cc +77 -0
  502. package/deps/rocksdb/rocksdb/options/customizable_helper.h +216 -0
  503. package/deps/rocksdb/rocksdb/options/customizable_test.cc +625 -0
  504. package/deps/rocksdb/rocksdb/options/db_options.cc +835 -0
  505. package/deps/rocksdb/rocksdb/options/db_options.h +126 -0
  506. package/deps/rocksdb/rocksdb/options/options.cc +664 -0
  507. package/deps/rocksdb/rocksdb/options/options_helper.cc +1391 -0
  508. package/deps/rocksdb/rocksdb/options/options_helper.h +118 -0
  509. package/deps/rocksdb/rocksdb/options/options_parser.cc +721 -0
  510. package/deps/rocksdb/rocksdb/options/options_parser.h +151 -0
  511. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +583 -0
  512. package/deps/rocksdb/rocksdb/options/options_test.cc +3794 -0
  513. package/deps/rocksdb/rocksdb/port/jemalloc_helper.h +106 -0
  514. package/deps/rocksdb/rocksdb/port/lang.h +16 -0
  515. package/deps/rocksdb/rocksdb/port/likely.h +18 -0
  516. package/deps/rocksdb/rocksdb/port/malloc.h +17 -0
  517. package/deps/rocksdb/rocksdb/port/port.h +21 -0
  518. package/deps/rocksdb/rocksdb/port/port_dirent.h +44 -0
  519. package/deps/rocksdb/rocksdb/port/port_example.h +101 -0
  520. package/deps/rocksdb/rocksdb/port/port_posix.cc +266 -0
  521. package/deps/rocksdb/rocksdb/port/port_posix.h +223 -0
  522. package/deps/rocksdb/rocksdb/port/stack_trace.cc +179 -0
  523. package/deps/rocksdb/rocksdb/port/stack_trace.h +28 -0
  524. package/deps/rocksdb/rocksdb/port/sys_time.h +47 -0
  525. package/deps/rocksdb/rocksdb/port/util_logger.h +20 -0
  526. package/deps/rocksdb/rocksdb/port/win/env_default.cc +45 -0
  527. package/deps/rocksdb/rocksdb/port/win/env_win.cc +1449 -0
  528. package/deps/rocksdb/rocksdb/port/win/env_win.h +294 -0
  529. package/deps/rocksdb/rocksdb/port/win/io_win.cc +1084 -0
  530. package/deps/rocksdb/rocksdb/port/win/io_win.h +494 -0
  531. package/deps/rocksdb/rocksdb/port/win/port_win.cc +283 -0
  532. package/deps/rocksdb/rocksdb/port/win/port_win.h +411 -0
  533. package/deps/rocksdb/rocksdb/port/win/win_jemalloc.cc +79 -0
  534. package/deps/rocksdb/rocksdb/port/win/win_logger.cc +194 -0
  535. package/deps/rocksdb/rocksdb/port/win/win_logger.h +67 -0
  536. package/deps/rocksdb/rocksdb/port/win/win_thread.cc +183 -0
  537. package/deps/rocksdb/rocksdb/port/win/win_thread.h +122 -0
  538. package/deps/rocksdb/rocksdb/port/win/xpress_win.cc +221 -0
  539. package/deps/rocksdb/rocksdb/port/win/xpress_win.h +26 -0
  540. package/deps/rocksdb/rocksdb/port/xpress.h +17 -0
  541. package/deps/rocksdb/rocksdb/src.mk +631 -0
  542. package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.cc +126 -0
  543. package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.h +57 -0
  544. package/deps/rocksdb/rocksdb/table/block_based/binary_search_index_reader.cc +73 -0
  545. package/deps/rocksdb/rocksdb/table/block_based/binary_search_index_reader.h +48 -0
  546. package/deps/rocksdb/rocksdb/table/block_based/block.cc +1049 -0
  547. package/deps/rocksdb/rocksdb/table/block_based/block.h +720 -0
  548. package/deps/rocksdb/rocksdb/table/block_based/block_based_filter_block.cc +348 -0
  549. package/deps/rocksdb/rocksdb/table/block_based/block_based_filter_block.h +119 -0
  550. package/deps/rocksdb/rocksdb/table/block_based/block_based_filter_block_test.cc +434 -0
  551. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +1835 -0
  552. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.h +193 -0
  553. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +839 -0
  554. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.h +95 -0
  555. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.cc +383 -0
  556. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.h +251 -0
  557. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +3563 -0
  558. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +681 -0
  559. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_impl.h +190 -0
  560. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +347 -0
  561. package/deps/rocksdb/rocksdb/table/block_based/block_builder.cc +201 -0
  562. package/deps/rocksdb/rocksdb/table/block_based/block_builder.h +78 -0
  563. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.cc +66 -0
  564. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.h +32 -0
  565. package/deps/rocksdb/rocksdb/table/block_based/block_prefix_index.cc +232 -0
  566. package/deps/rocksdb/rocksdb/table/block_based/block_prefix_index.h +66 -0
  567. package/deps/rocksdb/rocksdb/table/block_based/block_test.cc +623 -0
  568. package/deps/rocksdb/rocksdb/table/block_based/block_type.h +30 -0
  569. package/deps/rocksdb/rocksdb/table/block_based/cachable_entry.h +220 -0
  570. package/deps/rocksdb/rocksdb/table/block_based/data_block_footer.cc +59 -0
  571. package/deps/rocksdb/rocksdb/table/block_based/data_block_footer.h +25 -0
  572. package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index.cc +93 -0
  573. package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index.h +136 -0
  574. package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index_test.cc +717 -0
  575. package/deps/rocksdb/rocksdb/table/block_based/filter_block.h +180 -0
  576. package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.cc +102 -0
  577. package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.h +55 -0
  578. package/deps/rocksdb/rocksdb/table/block_based/filter_policy.cc +1407 -0
  579. package/deps/rocksdb/rocksdb/table/block_based/filter_policy_internal.h +168 -0
  580. package/deps/rocksdb/rocksdb/table/block_based/flush_block_policy.cc +88 -0
  581. package/deps/rocksdb/rocksdb/table/block_based/flush_block_policy.h +41 -0
  582. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.cc +344 -0
  583. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.h +139 -0
  584. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block_test.cc +333 -0
  585. package/deps/rocksdb/rocksdb/table/block_based/hash_index_reader.cc +147 -0
  586. package/deps/rocksdb/rocksdb/table/block_based/hash_index_reader.h +49 -0
  587. package/deps/rocksdb/rocksdb/table/block_based/index_builder.cc +248 -0
  588. package/deps/rocksdb/rocksdb/table/block_based/index_builder.h +444 -0
  589. package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.cc +54 -0
  590. package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.h +85 -0
  591. package/deps/rocksdb/rocksdb/table/block_based/mock_block_based_table.h +56 -0
  592. package/deps/rocksdb/rocksdb/table/block_based/parsed_full_filter_block.cc +22 -0
  593. package/deps/rocksdb/rocksdb/table/block_based/parsed_full_filter_block.h +40 -0
  594. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +521 -0
  595. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.h +144 -0
  596. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +424 -0
  597. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_iterator.cc +163 -0
  598. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_iterator.h +142 -0
  599. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +186 -0
  600. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.h +51 -0
  601. package/deps/rocksdb/rocksdb/table/block_based/reader_common.cc +64 -0
  602. package/deps/rocksdb/rocksdb/table/block_based/reader_common.h +38 -0
  603. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.cc +120 -0
  604. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.h +59 -0
  605. package/deps/rocksdb/rocksdb/table/block_fetcher.cc +324 -0
  606. package/deps/rocksdb/rocksdb/table/block_fetcher.h +129 -0
  607. package/deps/rocksdb/rocksdb/table/block_fetcher_test.cc +534 -0
  608. package/deps/rocksdb/rocksdb/table/cleanable_test.cc +277 -0
  609. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.cc +543 -0
  610. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.h +136 -0
  611. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder_test.cc +663 -0
  612. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_factory.cc +107 -0
  613. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_factory.h +81 -0
  614. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader.cc +404 -0
  615. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader.h +101 -0
  616. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader_test.cc +585 -0
  617. package/deps/rocksdb/rocksdb/table/format.cc +422 -0
  618. package/deps/rocksdb/rocksdb/table/format.h +348 -0
  619. package/deps/rocksdb/rocksdb/table/get_context.cc +408 -0
  620. package/deps/rocksdb/rocksdb/table/get_context.h +212 -0
  621. package/deps/rocksdb/rocksdb/table/internal_iterator.h +205 -0
  622. package/deps/rocksdb/rocksdb/table/iter_heap.h +42 -0
  623. package/deps/rocksdb/rocksdb/table/iterator.cc +210 -0
  624. package/deps/rocksdb/rocksdb/table/iterator_wrapper.h +180 -0
  625. package/deps/rocksdb/rocksdb/table/merger_test.cc +180 -0
  626. package/deps/rocksdb/rocksdb/table/merging_iterator.cc +481 -0
  627. package/deps/rocksdb/rocksdb/table/merging_iterator.h +64 -0
  628. package/deps/rocksdb/rocksdb/table/meta_blocks.cc +541 -0
  629. package/deps/rocksdb/rocksdb/table/meta_blocks.h +154 -0
  630. package/deps/rocksdb/rocksdb/table/mock_table.cc +328 -0
  631. package/deps/rocksdb/rocksdb/table/mock_table.h +89 -0
  632. package/deps/rocksdb/rocksdb/table/multiget_context.h +282 -0
  633. package/deps/rocksdb/rocksdb/table/persistent_cache_helper.cc +116 -0
  634. package/deps/rocksdb/rocksdb/table/persistent_cache_helper.h +44 -0
  635. package/deps/rocksdb/rocksdb/table/persistent_cache_options.h +34 -0
  636. package/deps/rocksdb/rocksdb/table/plain/plain_table_bloom.cc +78 -0
  637. package/deps/rocksdb/rocksdb/table/plain/plain_table_bloom.h +135 -0
  638. package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.cc +332 -0
  639. package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.h +153 -0
  640. package/deps/rocksdb/rocksdb/table/plain/plain_table_factory.cc +263 -0
  641. package/deps/rocksdb/rocksdb/table/plain/plain_table_factory.h +182 -0
  642. package/deps/rocksdb/rocksdb/table/plain/plain_table_index.cc +211 -0
  643. package/deps/rocksdb/rocksdb/table/plain/plain_table_index.h +249 -0
  644. package/deps/rocksdb/rocksdb/table/plain/plain_table_key_coding.cc +506 -0
  645. package/deps/rocksdb/rocksdb/table/plain/plain_table_key_coding.h +201 -0
  646. package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.cc +781 -0
  647. package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.h +247 -0
  648. package/deps/rocksdb/rocksdb/table/scoped_arena_iterator.h +61 -0
  649. package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +502 -0
  650. package/deps/rocksdb/rocksdb/table/sst_file_dumper.h +96 -0
  651. package/deps/rocksdb/rocksdb/table/sst_file_reader.cc +98 -0
  652. package/deps/rocksdb/rocksdb/table/sst_file_reader_test.cc +228 -0
  653. package/deps/rocksdb/rocksdb/table/sst_file_writer.cc +340 -0
  654. package/deps/rocksdb/rocksdb/table/sst_file_writer_collectors.h +94 -0
  655. package/deps/rocksdb/rocksdb/table/table_builder.h +203 -0
  656. package/deps/rocksdb/rocksdb/table/table_factory.cc +38 -0
  657. package/deps/rocksdb/rocksdb/table/table_properties.cc +300 -0
  658. package/deps/rocksdb/rocksdb/table/table_properties_internal.h +30 -0
  659. package/deps/rocksdb/rocksdb/table/table_reader.h +147 -0
  660. package/deps/rocksdb/rocksdb/table/table_reader_bench.cc +347 -0
  661. package/deps/rocksdb/rocksdb/table/table_reader_caller.h +39 -0
  662. package/deps/rocksdb/rocksdb/table/table_test.cc +4769 -0
  663. package/deps/rocksdb/rocksdb/table/two_level_iterator.cc +215 -0
  664. package/deps/rocksdb/rocksdb/table/two_level_iterator.h +43 -0
  665. package/deps/rocksdb/rocksdb/test_util/mock_time_env.cc +38 -0
  666. package/deps/rocksdb/rocksdb/test_util/mock_time_env.h +74 -0
  667. package/deps/rocksdb/rocksdb/test_util/sync_point.cc +93 -0
  668. package/deps/rocksdb/rocksdb/test_util/sync_point.h +161 -0
  669. package/deps/rocksdb/rocksdb/test_util/sync_point_impl.cc +129 -0
  670. package/deps/rocksdb/rocksdb/test_util/sync_point_impl.h +74 -0
  671. package/deps/rocksdb/rocksdb/test_util/testharness.cc +56 -0
  672. package/deps/rocksdb/rocksdb/test_util/testharness.h +53 -0
  673. package/deps/rocksdb/rocksdb/test_util/testutil.cc +566 -0
  674. package/deps/rocksdb/rocksdb/test_util/testutil.h +887 -0
  675. package/deps/rocksdb/rocksdb/test_util/testutil_test.cc +43 -0
  676. package/deps/rocksdb/rocksdb/test_util/transaction_test_util.cc +388 -0
  677. package/deps/rocksdb/rocksdb/test_util/transaction_test_util.h +132 -0
  678. package/deps/rocksdb/rocksdb/third-party/folly/folly/CPortability.h +27 -0
  679. package/deps/rocksdb/rocksdb/third-party/folly/folly/ConstexprMath.h +45 -0
  680. package/deps/rocksdb/rocksdb/third-party/folly/folly/Indestructible.h +166 -0
  681. package/deps/rocksdb/rocksdb/third-party/folly/folly/Optional.h +570 -0
  682. package/deps/rocksdb/rocksdb/third-party/folly/folly/Portability.h +92 -0
  683. package/deps/rocksdb/rocksdb/third-party/folly/folly/ScopeGuard.h +54 -0
  684. package/deps/rocksdb/rocksdb/third-party/folly/folly/Traits.h +152 -0
  685. package/deps/rocksdb/rocksdb/third-party/folly/folly/Unit.h +59 -0
  686. package/deps/rocksdb/rocksdb/third-party/folly/folly/Utility.h +141 -0
  687. package/deps/rocksdb/rocksdb/third-party/folly/folly/chrono/Hardware.h +33 -0
  688. package/deps/rocksdb/rocksdb/third-party/folly/folly/container/Array.h +74 -0
  689. package/deps/rocksdb/rocksdb/third-party/folly/folly/detail/Futex-inl.h +117 -0
  690. package/deps/rocksdb/rocksdb/third-party/folly/folly/detail/Futex.cpp +263 -0
  691. package/deps/rocksdb/rocksdb/third-party/folly/folly/detail/Futex.h +96 -0
  692. package/deps/rocksdb/rocksdb/third-party/folly/folly/functional/Invoke.h +40 -0
  693. package/deps/rocksdb/rocksdb/third-party/folly/folly/hash/Hash.h +29 -0
  694. package/deps/rocksdb/rocksdb/third-party/folly/folly/lang/Align.h +144 -0
  695. package/deps/rocksdb/rocksdb/third-party/folly/folly/lang/Bits.h +30 -0
  696. package/deps/rocksdb/rocksdb/third-party/folly/folly/lang/Launder.h +51 -0
  697. package/deps/rocksdb/rocksdb/third-party/folly/folly/portability/Asm.h +28 -0
  698. package/deps/rocksdb/rocksdb/third-party/folly/folly/portability/SysSyscall.h +10 -0
  699. package/deps/rocksdb/rocksdb/third-party/folly/folly/portability/SysTypes.h +26 -0
  700. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicNotification-inl.h +138 -0
  701. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicNotification.cpp +23 -0
  702. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicNotification.h +57 -0
  703. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicUtil-inl.h +260 -0
  704. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicUtil.h +52 -0
  705. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/Baton.h +328 -0
  706. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/DistributedMutex-inl.h +1703 -0
  707. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/DistributedMutex.cpp +16 -0
  708. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/DistributedMutex.h +304 -0
  709. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/DistributedMutexSpecializations.h +39 -0
  710. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/ParkingLot.cpp +26 -0
  711. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/ParkingLot.h +318 -0
  712. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/WaitOptions.cpp +12 -0
  713. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/WaitOptions.h +57 -0
  714. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/InlineFunctionRef.h +219 -0
  715. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/ProxyLockable-inl.h +207 -0
  716. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/ProxyLockable.h +164 -0
  717. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/Sleeper.h +57 -0
  718. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/Spin.h +77 -0
  719. package/deps/rocksdb/rocksdb/third-party/gcc/ppc-asm.h +390 -0
  720. package/deps/rocksdb/rocksdb/thirdparty.inc +268 -0
  721. package/deps/rocksdb/rocksdb/tools/CMakeLists.txt +30 -0
  722. package/deps/rocksdb/rocksdb/tools/blob_dump.cc +110 -0
  723. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/__init__.py +2 -0
  724. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_pysim.py +2000 -0
  725. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_pysim.sh +156 -0
  726. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_pysim_test.py +734 -0
  727. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer.cc +2307 -0
  728. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer.h +395 -0
  729. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_plot.py +721 -0
  730. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_test.cc +719 -0
  731. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_tool.cc +25 -0
  732. package/deps/rocksdb/rocksdb/tools/db_bench.cc +21 -0
  733. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +7416 -0
  734. package/deps/rocksdb/rocksdb/tools/db_bench_tool_test.cc +328 -0
  735. package/deps/rocksdb/rocksdb/tools/db_repl_stress.cc +130 -0
  736. package/deps/rocksdb/rocksdb/tools/db_sanity_test.cc +297 -0
  737. package/deps/rocksdb/rocksdb/tools/dump/db_dump_tool.cc +259 -0
  738. package/deps/rocksdb/rocksdb/tools/dump/rocksdb_dump.cc +63 -0
  739. package/deps/rocksdb/rocksdb/tools/dump/rocksdb_undump.cc +62 -0
  740. package/deps/rocksdb/rocksdb/tools/io_tracer_parser.cc +25 -0
  741. package/deps/rocksdb/rocksdb/tools/io_tracer_parser_test.cc +187 -0
  742. package/deps/rocksdb/rocksdb/tools/io_tracer_parser_tool.cc +120 -0
  743. package/deps/rocksdb/rocksdb/tools/io_tracer_parser_tool.h +40 -0
  744. package/deps/rocksdb/rocksdb/tools/ldb.cc +21 -0
  745. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +3609 -0
  746. package/deps/rocksdb/rocksdb/tools/ldb_cmd_impl.h +665 -0
  747. package/deps/rocksdb/rocksdb/tools/ldb_cmd_test.cc +746 -0
  748. package/deps/rocksdb/rocksdb/tools/ldb_tool.cc +159 -0
  749. package/deps/rocksdb/rocksdb/tools/reduce_levels_test.cc +221 -0
  750. package/deps/rocksdb/rocksdb/tools/sst_dump.cc +20 -0
  751. package/deps/rocksdb/rocksdb/tools/sst_dump_test.cc +427 -0
  752. package/deps/rocksdb/rocksdb/tools/sst_dump_tool.cc +541 -0
  753. package/deps/rocksdb/rocksdb/tools/trace_analyzer.cc +25 -0
  754. package/deps/rocksdb/rocksdb/tools/trace_analyzer_test.cc +752 -0
  755. package/deps/rocksdb/rocksdb/tools/trace_analyzer_tool.cc +2001 -0
  756. package/deps/rocksdb/rocksdb/tools/trace_analyzer_tool.h +292 -0
  757. package/deps/rocksdb/rocksdb/tools/write_stress.cc +305 -0
  758. package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer.cc +496 -0
  759. package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer.h +294 -0
  760. package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer_test.cc +379 -0
  761. package/deps/rocksdb/rocksdb/trace_replay/io_tracer.cc +229 -0
  762. package/deps/rocksdb/rocksdb/trace_replay/io_tracer.h +174 -0
  763. package/deps/rocksdb/rocksdb/trace_replay/io_tracer_test.cc +215 -0
  764. package/deps/rocksdb/rocksdb/trace_replay/trace_replay.cc +491 -0
  765. package/deps/rocksdb/rocksdb/trace_replay/trace_replay.h +195 -0
  766. package/deps/rocksdb/rocksdb/util/aligned_buffer.h +255 -0
  767. package/deps/rocksdb/rocksdb/util/autovector.h +367 -0
  768. package/deps/rocksdb/rocksdb/util/autovector_test.cc +330 -0
  769. package/deps/rocksdb/rocksdb/util/bloom_impl.h +485 -0
  770. package/deps/rocksdb/rocksdb/util/bloom_test.cc +1191 -0
  771. package/deps/rocksdb/rocksdb/util/build_version.cc.in +5 -0
  772. package/deps/rocksdb/rocksdb/util/build_version.h +15 -0
  773. package/deps/rocksdb/rocksdb/util/cast_util.h +20 -0
  774. package/deps/rocksdb/rocksdb/util/channel.h +67 -0
  775. package/deps/rocksdb/rocksdb/util/coding.cc +89 -0
  776. package/deps/rocksdb/rocksdb/util/coding.h +419 -0
  777. package/deps/rocksdb/rocksdb/util/coding_lean.h +101 -0
  778. package/deps/rocksdb/rocksdb/util/coding_test.cc +217 -0
  779. package/deps/rocksdb/rocksdb/util/compaction_job_stats_impl.cc +92 -0
  780. package/deps/rocksdb/rocksdb/util/comparator.cc +219 -0
  781. package/deps/rocksdb/rocksdb/util/compression.h +1529 -0
  782. package/deps/rocksdb/rocksdb/util/compression_context_cache.cc +108 -0
  783. package/deps/rocksdb/rocksdb/util/compression_context_cache.h +47 -0
  784. package/deps/rocksdb/rocksdb/util/concurrent_task_limiter_impl.cc +67 -0
  785. package/deps/rocksdb/rocksdb/util/concurrent_task_limiter_impl.h +67 -0
  786. package/deps/rocksdb/rocksdb/util/core_local.h +83 -0
  787. package/deps/rocksdb/rocksdb/util/crc32c.cc +1283 -0
  788. package/deps/rocksdb/rocksdb/util/crc32c.h +51 -0
  789. package/deps/rocksdb/rocksdb/util/crc32c_arm64.cc +169 -0
  790. package/deps/rocksdb/rocksdb/util/crc32c_arm64.h +50 -0
  791. package/deps/rocksdb/rocksdb/util/crc32c_ppc.c +94 -0
  792. package/deps/rocksdb/rocksdb/util/crc32c_ppc.h +19 -0
  793. package/deps/rocksdb/rocksdb/util/crc32c_ppc_asm.S +756 -0
  794. package/deps/rocksdb/rocksdb/util/crc32c_ppc_constants.h +900 -0
  795. package/deps/rocksdb/rocksdb/util/crc32c_test.cc +180 -0
  796. package/deps/rocksdb/rocksdb/util/defer.h +52 -0
  797. package/deps/rocksdb/rocksdb/util/defer_test.cc +39 -0
  798. package/deps/rocksdb/rocksdb/util/duplicate_detector.h +68 -0
  799. package/deps/rocksdb/rocksdb/util/dynamic_bloom.cc +70 -0
  800. package/deps/rocksdb/rocksdb/util/dynamic_bloom.h +214 -0
  801. package/deps/rocksdb/rocksdb/util/dynamic_bloom_test.cc +323 -0
  802. package/deps/rocksdb/rocksdb/util/fastrange.h +112 -0
  803. package/deps/rocksdb/rocksdb/util/file_checksum_helper.cc +136 -0
  804. package/deps/rocksdb/rocksdb/util/file_checksum_helper.h +98 -0
  805. package/deps/rocksdb/rocksdb/util/file_reader_writer_test.cc +449 -0
  806. package/deps/rocksdb/rocksdb/util/filelock_test.cc +152 -0
  807. package/deps/rocksdb/rocksdb/util/filter_bench.cc +781 -0
  808. package/deps/rocksdb/rocksdb/util/gflags_compat.h +20 -0
  809. package/deps/rocksdb/rocksdb/util/hash.cc +83 -0
  810. package/deps/rocksdb/rocksdb/util/hash.h +107 -0
  811. package/deps/rocksdb/rocksdb/util/hash_map.h +67 -0
  812. package/deps/rocksdb/rocksdb/util/hash_test.cc +593 -0
  813. package/deps/rocksdb/rocksdb/util/heap.h +166 -0
  814. package/deps/rocksdb/rocksdb/util/heap_test.cc +139 -0
  815. package/deps/rocksdb/rocksdb/util/kv_map.h +33 -0
  816. package/deps/rocksdb/rocksdb/util/log_write_bench.cc +86 -0
  817. package/deps/rocksdb/rocksdb/util/math.h +186 -0
  818. package/deps/rocksdb/rocksdb/util/math128.h +298 -0
  819. package/deps/rocksdb/rocksdb/util/murmurhash.cc +191 -0
  820. package/deps/rocksdb/rocksdb/util/murmurhash.h +42 -0
  821. package/deps/rocksdb/rocksdb/util/mutexlock.h +186 -0
  822. package/deps/rocksdb/rocksdb/util/ppc-opcode.h +27 -0
  823. package/deps/rocksdb/rocksdb/util/random.cc +56 -0
  824. package/deps/rocksdb/rocksdb/util/random.h +186 -0
  825. package/deps/rocksdb/rocksdb/util/random_test.cc +105 -0
  826. package/deps/rocksdb/rocksdb/util/rate_limiter.cc +340 -0
  827. package/deps/rocksdb/rocksdb/util/rate_limiter.h +113 -0
  828. package/deps/rocksdb/rocksdb/util/rate_limiter_test.cc +251 -0
  829. package/deps/rocksdb/rocksdb/util/repeatable_thread.h +151 -0
  830. package/deps/rocksdb/rocksdb/util/repeatable_thread_test.cc +107 -0
  831. package/deps/rocksdb/rocksdb/util/ribbon_alg.h +1201 -0
  832. package/deps/rocksdb/rocksdb/util/ribbon_impl.h +1062 -0
  833. package/deps/rocksdb/rocksdb/util/ribbon_test.cc +931 -0
  834. package/deps/rocksdb/rocksdb/util/set_comparator.h +22 -0
  835. package/deps/rocksdb/rocksdb/util/slice.cc +243 -0
  836. package/deps/rocksdb/rocksdb/util/slice_test.cc +163 -0
  837. package/deps/rocksdb/rocksdb/util/slice_transform_test.cc +153 -0
  838. package/deps/rocksdb/rocksdb/util/status.cc +149 -0
  839. package/deps/rocksdb/rocksdb/util/stderr_logger.h +31 -0
  840. package/deps/rocksdb/rocksdb/util/stop_watch.h +118 -0
  841. package/deps/rocksdb/rocksdb/util/string_util.cc +422 -0
  842. package/deps/rocksdb/rocksdb/util/string_util.h +144 -0
  843. package/deps/rocksdb/rocksdb/util/thread_list_test.cc +354 -0
  844. package/deps/rocksdb/rocksdb/util/thread_local.cc +554 -0
  845. package/deps/rocksdb/rocksdb/util/thread_local.h +101 -0
  846. package/deps/rocksdb/rocksdb/util/thread_local_test.cc +583 -0
  847. package/deps/rocksdb/rocksdb/util/thread_operation.h +121 -0
  848. package/deps/rocksdb/rocksdb/util/threadpool_imp.cc +506 -0
  849. package/deps/rocksdb/rocksdb/util/threadpool_imp.h +112 -0
  850. package/deps/rocksdb/rocksdb/util/timer.h +331 -0
  851. package/deps/rocksdb/rocksdb/util/timer_queue.h +230 -0
  852. package/deps/rocksdb/rocksdb/util/timer_queue_test.cc +72 -0
  853. package/deps/rocksdb/rocksdb/util/timer_test.cc +399 -0
  854. package/deps/rocksdb/rocksdb/util/user_comparator_wrapper.h +80 -0
  855. package/deps/rocksdb/rocksdb/util/vector_iterator.h +101 -0
  856. package/deps/rocksdb/rocksdb/util/work_queue.h +148 -0
  857. package/deps/rocksdb/rocksdb/util/work_queue_test.cc +268 -0
  858. package/deps/rocksdb/rocksdb/util/xxh3p.h +1392 -0
  859. package/deps/rocksdb/rocksdb/util/xxhash.cc +1158 -0
  860. package/deps/rocksdb/rocksdb/util/xxhash.h +598 -0
  861. package/deps/rocksdb/rocksdb/utilities/backupable/backupable_db.cc +2354 -0
  862. package/deps/rocksdb/rocksdb/utilities/backupable/backupable_db_test.cc +2955 -0
  863. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_compaction_filter.cc +488 -0
  864. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_compaction_filter.h +199 -0
  865. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db.cc +112 -0
  866. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db.h +266 -0
  867. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_gc_stats.h +52 -0
  868. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.cc +2167 -0
  869. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.h +500 -0
  870. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl_filesnapshot.cc +113 -0
  871. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_iterator.h +147 -0
  872. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_listener.h +66 -0
  873. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_test.cc +2386 -0
  874. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.cc +281 -0
  875. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.h +58 -0
  876. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_file.cc +314 -0
  877. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_file.h +244 -0
  878. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_compaction_filter.cc +47 -0
  879. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_compaction_filter.h +42 -0
  880. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_format_test.cc +375 -0
  881. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_functional_test.cc +327 -0
  882. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_row_merge_test.cc +114 -0
  883. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_serialize_test.cc +187 -0
  884. package/deps/rocksdb/rocksdb/utilities/cassandra/format.cc +390 -0
  885. package/deps/rocksdb/rocksdb/utilities/cassandra/format.h +184 -0
  886. package/deps/rocksdb/rocksdb/utilities/cassandra/merge_operator.cc +67 -0
  887. package/deps/rocksdb/rocksdb/utilities/cassandra/merge_operator.h +44 -0
  888. package/deps/rocksdb/rocksdb/utilities/cassandra/serialize.h +75 -0
  889. package/deps/rocksdb/rocksdb/utilities/cassandra/test_utils.cc +72 -0
  890. package/deps/rocksdb/rocksdb/utilities/cassandra/test_utils.h +43 -0
  891. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_impl.cc +588 -0
  892. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_impl.h +82 -0
  893. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_test.cc +821 -0
  894. package/deps/rocksdb/rocksdb/utilities/compaction_filters/layered_compaction_filter_base.h +37 -0
  895. package/deps/rocksdb/rocksdb/utilities/compaction_filters/remove_emptyvalue_compactionfilter.cc +29 -0
  896. package/deps/rocksdb/rocksdb/utilities/compaction_filters/remove_emptyvalue_compactionfilter.h +27 -0
  897. package/deps/rocksdb/rocksdb/utilities/convenience/info_log_finder.cc +25 -0
  898. package/deps/rocksdb/rocksdb/utilities/debug.cc +82 -0
  899. package/deps/rocksdb/rocksdb/utilities/env_librados.cc +1497 -0
  900. package/deps/rocksdb/rocksdb/utilities/env_librados_test.cc +1146 -0
  901. package/deps/rocksdb/rocksdb/utilities/env_mirror.cc +262 -0
  902. package/deps/rocksdb/rocksdb/utilities/env_mirror_test.cc +223 -0
  903. package/deps/rocksdb/rocksdb/utilities/env_timed.cc +145 -0
  904. package/deps/rocksdb/rocksdb/utilities/env_timed_test.cc +44 -0
  905. package/deps/rocksdb/rocksdb/utilities/fault_injection_env.cc +490 -0
  906. package/deps/rocksdb/rocksdb/utilities/fault_injection_env.h +242 -0
  907. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +581 -0
  908. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +437 -0
  909. package/deps/rocksdb/rocksdb/utilities/leveldb_options/leveldb_options.cc +56 -0
  910. package/deps/rocksdb/rocksdb/utilities/memory/memory_test.cc +275 -0
  911. package/deps/rocksdb/rocksdb/utilities/memory/memory_util.cc +52 -0
  912. package/deps/rocksdb/rocksdb/utilities/merge_operators/bytesxor.cc +59 -0
  913. package/deps/rocksdb/rocksdb/utilities/merge_operators/bytesxor.h +39 -0
  914. package/deps/rocksdb/rocksdb/utilities/merge_operators/max.cc +77 -0
  915. package/deps/rocksdb/rocksdb/utilities/merge_operators/put.cc +83 -0
  916. package/deps/rocksdb/rocksdb/utilities/merge_operators/sortlist.cc +97 -0
  917. package/deps/rocksdb/rocksdb/utilities/merge_operators/sortlist.h +38 -0
  918. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend.cc +59 -0
  919. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend.h +31 -0
  920. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend2.cc +117 -0
  921. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend2.h +49 -0
  922. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend_test.cc +598 -0
  923. package/deps/rocksdb/rocksdb/utilities/merge_operators/uint64add.cc +69 -0
  924. package/deps/rocksdb/rocksdb/utilities/merge_operators.h +55 -0
  925. package/deps/rocksdb/rocksdb/utilities/object_registry.cc +87 -0
  926. package/deps/rocksdb/rocksdb/utilities/object_registry_test.cc +174 -0
  927. package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration.cc +168 -0
  928. package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration_test.cc +431 -0
  929. package/deps/rocksdb/rocksdb/utilities/options/options_util.cc +159 -0
  930. package/deps/rocksdb/rocksdb/utilities/options/options_util_test.cc +655 -0
  931. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier.cc +425 -0
  932. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier.h +156 -0
  933. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.cc +609 -0
  934. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.h +296 -0
  935. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file_buffer.h +127 -0
  936. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_metadata.cc +86 -0
  937. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_metadata.h +125 -0
  938. package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table.h +238 -0
  939. package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table_bench.cc +308 -0
  940. package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table_evictable.h +168 -0
  941. package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table_test.cc +160 -0
  942. package/deps/rocksdb/rocksdb/utilities/persistent_cache/lrulist.h +174 -0
  943. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_bench.cc +360 -0
  944. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_test.cc +456 -0
  945. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_test.h +286 -0
  946. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_tier.cc +167 -0
  947. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_tier.h +339 -0
  948. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_util.h +67 -0
  949. package/deps/rocksdb/rocksdb/utilities/persistent_cache/volatile_tier_impl.cc +140 -0
  950. package/deps/rocksdb/rocksdb/utilities/persistent_cache/volatile_tier_impl.h +142 -0
  951. package/deps/rocksdb/rocksdb/utilities/simulator_cache/cache_simulator.cc +285 -0
  952. package/deps/rocksdb/rocksdb/utilities/simulator_cache/cache_simulator.h +231 -0
  953. package/deps/rocksdb/rocksdb/utilities/simulator_cache/cache_simulator_test.cc +494 -0
  954. package/deps/rocksdb/rocksdb/utilities/simulator_cache/sim_cache.cc +356 -0
  955. package/deps/rocksdb/rocksdb/utilities/simulator_cache/sim_cache_test.cc +224 -0
  956. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector.cc +122 -0
  957. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector.h +72 -0
  958. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector_test.cc +244 -0
  959. package/deps/rocksdb/rocksdb/utilities/trace/file_trace_reader_writer.cc +125 -0
  960. package/deps/rocksdb/rocksdb/utilities/trace/file_trace_reader_writer.h +48 -0
  961. package/deps/rocksdb/rocksdb/utilities/transactions/lock/lock_manager.cc +29 -0
  962. package/deps/rocksdb/rocksdb/utilities/transactions/lock/lock_manager.h +82 -0
  963. package/deps/rocksdb/rocksdb/utilities/transactions/lock/lock_tracker.h +209 -0
  964. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager.cc +720 -0
  965. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager.h +223 -0
  966. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager_test.cc +181 -0
  967. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager_test.h +319 -0
  968. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_tracker.cc +270 -0
  969. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_tracker.h +99 -0
  970. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_lock_manager.h +30 -0
  971. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_locking_test.cc +306 -0
  972. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/COPYING.AGPLv3 +661 -0
  973. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/COPYING.APACHEv2 +174 -0
  974. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/COPYING.GPLv2 +339 -0
  975. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/db.h +76 -0
  976. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/ft/comparator.h +138 -0
  977. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/ft/ft-status.h +102 -0
  978. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/concurrent_tree.cc +139 -0
  979. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/concurrent_tree.h +174 -0
  980. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/keyrange.cc +222 -0
  981. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/keyrange.h +141 -0
  982. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/lock_request.cc +525 -0
  983. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/lock_request.h +253 -0
  984. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/locktree.cc +1007 -0
  985. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/locktree.h +560 -0
  986. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/manager.cc +527 -0
  987. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/range_buffer.cc +265 -0
  988. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/range_buffer.h +178 -0
  989. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/treenode.cc +520 -0
  990. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/treenode.h +302 -0
  991. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/txnid_set.cc +120 -0
  992. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/txnid_set.h +92 -0
  993. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/wfg.cc +213 -0
  994. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/wfg.h +124 -0
  995. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/memory.h +215 -0
  996. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_assert_subst.h +39 -0
  997. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_atomic.h +130 -0
  998. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_external_pthread.h +82 -0
  999. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_instrumentation.h +286 -0
  1000. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_portability.h +87 -0
  1001. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_pthread.h +520 -0
  1002. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_race_tools.h +179 -0
  1003. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_time.h +172 -0
  1004. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/txn_subst.h +27 -0
  1005. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/standalone_port.cc +132 -0
  1006. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/dbt.cc +153 -0
  1007. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/dbt.h +98 -0
  1008. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/growable_array.h +144 -0
  1009. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/memarena.cc +201 -0
  1010. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/memarena.h +141 -0
  1011. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/omt.h +794 -0
  1012. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/omt_impl.h +1295 -0
  1013. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/partitioned_counter.h +165 -0
  1014. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/status.h +76 -0
  1015. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_manager.cc +479 -0
  1016. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_manager.h +130 -0
  1017. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_tracker.cc +156 -0
  1018. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_tracker.h +146 -0
  1019. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction.cc +196 -0
  1020. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction.h +101 -0
  1021. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_db_impl.cc +111 -0
  1022. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_db_impl.h +87 -0
  1023. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_test.cc +1418 -0
  1024. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +752 -0
  1025. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.h +232 -0
  1026. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction_db.cc +628 -0
  1027. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction_db.h +228 -0
  1028. package/deps/rocksdb/rocksdb/utilities/transactions/snapshot_checker.cc +49 -0
  1029. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.cc +678 -0
  1030. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.h +373 -0
  1031. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_db_mutex_impl.cc +135 -0
  1032. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_db_mutex_impl.h +26 -0
  1033. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +6350 -0
  1034. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.h +522 -0
  1035. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_util.cc +188 -0
  1036. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_util.h +80 -0
  1037. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_transaction_test.cc +3531 -0
  1038. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.cc +483 -0
  1039. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.h +119 -0
  1040. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.cc +999 -0
  1041. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.h +1109 -0
  1042. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_transaction_test.cc +786 -0
  1043. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.cc +1039 -0
  1044. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.h +341 -0
  1045. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn_db.cc +470 -0
  1046. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn_db.h +108 -0
  1047. package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.cc +332 -0
  1048. package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.h +353 -0
  1049. package/deps/rocksdb/rocksdb/utilities/ttl/ttl_test.cc +703 -0
  1050. package/deps/rocksdb/rocksdb/utilities/util_merge_operators_test.cc +99 -0
  1051. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +617 -0
  1052. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.cc +345 -0
  1053. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.h +569 -0
  1054. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +1867 -0
  1055. package/deps/rocksdb/rocksdb.gyp +475 -0
  1056. package/deps/snappy/freebsd/config.h +135 -0
  1057. package/deps/snappy/freebsd/snappy-stubs-public.h +100 -0
  1058. package/deps/snappy/linux/config.h +135 -0
  1059. package/deps/snappy/linux/snappy-stubs-public.h +100 -0
  1060. package/deps/snappy/mac/config.h +137 -0
  1061. package/deps/snappy/mac/snappy-stubs-public.h +100 -0
  1062. package/deps/snappy/openbsd/config.h +135 -0
  1063. package/deps/snappy/openbsd/snappy-stubs-public.h +100 -0
  1064. package/deps/snappy/snappy-1.1.7/COPYING +54 -0
  1065. package/deps/snappy/snappy-1.1.7/cmake/SnappyConfig.cmake +1 -0
  1066. package/deps/snappy/snappy-1.1.7/cmake/config.h.in +62 -0
  1067. package/deps/snappy/snappy-1.1.7/snappy-c.cc +90 -0
  1068. package/deps/snappy/snappy-1.1.7/snappy-c.h +138 -0
  1069. package/deps/snappy/snappy-1.1.7/snappy-internal.h +224 -0
  1070. package/deps/snappy/snappy-1.1.7/snappy-sinksource.cc +104 -0
  1071. package/deps/snappy/snappy-1.1.7/snappy-sinksource.h +182 -0
  1072. package/deps/snappy/snappy-1.1.7/snappy-stubs-internal.cc +42 -0
  1073. package/deps/snappy/snappy-1.1.7/snappy-stubs-internal.h +561 -0
  1074. package/deps/snappy/snappy-1.1.7/snappy-stubs-public.h.in +94 -0
  1075. package/deps/snappy/snappy-1.1.7/snappy-test.cc +612 -0
  1076. package/deps/snappy/snappy-1.1.7/snappy-test.h +573 -0
  1077. package/deps/snappy/snappy-1.1.7/snappy.cc +1515 -0
  1078. package/deps/snappy/snappy-1.1.7/snappy.h +203 -0
  1079. package/deps/snappy/snappy-1.1.7/snappy_unittest.cc +1410 -0
  1080. package/deps/snappy/snappy.gyp +90 -0
  1081. package/deps/snappy/solaris/config.h +135 -0
  1082. package/deps/snappy/solaris/snappy-stubs-public.h +100 -0
  1083. package/deps/snappy/win32/config.h +29 -0
  1084. package/deps/snappy/win32/snappy-stubs-public.h +100 -0
  1085. package/iterator.js +55 -0
  1086. package/leveldown.js +113 -0
  1087. package/package-lock.json +23687 -0
  1088. package/package.json +70 -0
@@ -0,0 +1,2230 @@
1
+ // Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
2
+ // This source code is licensed under both the GPLv2 (found in the
3
+ // COPYING file in the root directory) and Apache 2.0 License
4
+ // (found in the LICENSE.Apache file in the root directory).
5
+ //
6
+ // Copyright (c) 2011 The LevelDB Authors. All rights reserved.
7
+ // Use of this source code is governed by a BSD-style license that can be
8
+ // found in the LICENSE file. See the AUTHORS file for names of contributors.
9
+
10
+ #ifndef OS_WIN
11
+ #include <sys/ioctl.h>
12
+ #endif
13
+
14
+ #include <sys/types.h>
15
+
16
+ #include <iostream>
17
+ #include <unordered_set>
18
+ #include <atomic>
19
+ #include <list>
20
+
21
+ #ifdef OS_LINUX
22
+ #include <fcntl.h>
23
+ #include <linux/fs.h>
24
+ #include <stdlib.h>
25
+ #include <sys/stat.h>
26
+ #include <unistd.h>
27
+ #endif
28
+
29
+ #ifdef ROCKSDB_FALLOCATE_PRESENT
30
+ #include <errno.h>
31
+ #endif
32
+
33
+ #include "env/env_chroot.h"
34
+ #include "logging/log_buffer.h"
35
+ #include "port/malloc.h"
36
+ #include "port/port.h"
37
+ #include "rocksdb/env.h"
38
+ #include "test_util/sync_point.h"
39
+ #include "test_util/testharness.h"
40
+ #include "test_util/testutil.h"
41
+ #include "util/coding.h"
42
+ #include "util/mutexlock.h"
43
+ #include "util/random.h"
44
+ #include "util/string_util.h"
45
+ #include "utilities/fault_injection_env.h"
46
+ #include "utilities/fault_injection_fs.h"
47
+
48
+ namespace ROCKSDB_NAMESPACE {
49
+
50
+ using port::kPageSize;
51
+
52
+ static const int kDelayMicros = 100000;
53
+
54
+ struct Deleter {
55
+ explicit Deleter(void (*fn)(void*)) : fn_(fn) {}
56
+
57
+ void operator()(void* ptr) {
58
+ assert(fn_);
59
+ assert(ptr);
60
+ (*fn_)(ptr);
61
+ }
62
+
63
+ void (*fn_)(void*);
64
+ };
65
+
66
+ std::unique_ptr<char, Deleter> NewAligned(const size_t size, const char ch) {
67
+ char* ptr = nullptr;
68
+ #ifdef OS_WIN
69
+ if (nullptr == (ptr = reinterpret_cast<char*>(_aligned_malloc(size, kPageSize)))) {
70
+ return std::unique_ptr<char, Deleter>(nullptr, Deleter(_aligned_free));
71
+ }
72
+ std::unique_ptr<char, Deleter> uptr(ptr, Deleter(_aligned_free));
73
+ #else
74
+ if (posix_memalign(reinterpret_cast<void**>(&ptr), kPageSize, size) != 0) {
75
+ return std::unique_ptr<char, Deleter>(nullptr, Deleter(free));
76
+ }
77
+ std::unique_ptr<char, Deleter> uptr(ptr, Deleter(free));
78
+ #endif
79
+ memset(uptr.get(), ch, size);
80
+ return uptr;
81
+ }
82
+
83
+ class EnvPosixTest : public testing::Test {
84
+ private:
85
+ port::Mutex mu_;
86
+ std::string events_;
87
+
88
+ public:
89
+ Env* env_;
90
+ bool direct_io_;
91
+ EnvPosixTest() : env_(Env::Default()), direct_io_(false) {}
92
+ };
93
+
94
+ class EnvPosixTestWithParam
95
+ : public EnvPosixTest,
96
+ public ::testing::WithParamInterface<std::pair<Env*, bool>> {
97
+ public:
98
+ EnvPosixTestWithParam() {
99
+ std::pair<Env*, bool> param_pair = GetParam();
100
+ env_ = param_pair.first;
101
+ direct_io_ = param_pair.second;
102
+ }
103
+
104
+ void WaitThreadPoolsEmpty() {
105
+ // Wait until the thread pools are empty.
106
+ while (env_->GetThreadPoolQueueLen(Env::Priority::LOW) != 0) {
107
+ Env::Default()->SleepForMicroseconds(kDelayMicros);
108
+ }
109
+ while (env_->GetThreadPoolQueueLen(Env::Priority::HIGH) != 0) {
110
+ Env::Default()->SleepForMicroseconds(kDelayMicros);
111
+ }
112
+ }
113
+
114
+ ~EnvPosixTestWithParam() override { WaitThreadPoolsEmpty(); }
115
+ };
116
+
117
+ static void SetBool(void* ptr) {
118
+ reinterpret_cast<std::atomic<bool>*>(ptr)->store(true);
119
+ }
120
+
121
+ TEST_F(EnvPosixTest, DISABLED_RunImmediately) {
122
+ for (int pri = Env::BOTTOM; pri < Env::TOTAL; ++pri) {
123
+ std::atomic<bool> called(false);
124
+ env_->SetBackgroundThreads(1, static_cast<Env::Priority>(pri));
125
+ env_->Schedule(&SetBool, &called, static_cast<Env::Priority>(pri));
126
+ Env::Default()->SleepForMicroseconds(kDelayMicros);
127
+ ASSERT_TRUE(called.load());
128
+ }
129
+ }
130
+
131
+ TEST_F(EnvPosixTest, RunEventually) {
132
+ std::atomic<bool> called(false);
133
+ env_->StartThread(&SetBool, &called);
134
+ env_->WaitForJoin();
135
+ ASSERT_TRUE(called.load());
136
+ }
137
+
138
+ #ifdef OS_WIN
139
+ TEST_F(EnvPosixTest, AreFilesSame) {
140
+ {
141
+ bool tmp;
142
+ if (env_->AreFilesSame("", "", &tmp).IsNotSupported()) {
143
+ fprintf(stderr,
144
+ "skipping EnvBasicTestWithParam.AreFilesSame due to "
145
+ "unsupported Env::AreFilesSame\n");
146
+ return;
147
+ }
148
+ }
149
+
150
+ const EnvOptions soptions;
151
+ auto* env = Env::Default();
152
+ std::string same_file_name = test::PerThreadDBPath(env, "same_file");
153
+ std::string same_file_link_name = same_file_name + "_link";
154
+
155
+ std::unique_ptr<WritableFile> same_file;
156
+ ASSERT_OK(env->NewWritableFile(same_file_name,
157
+ &same_file, soptions));
158
+ same_file->Append("random_data");
159
+ ASSERT_OK(same_file->Flush());
160
+ same_file.reset();
161
+
162
+ ASSERT_OK(env->LinkFile(same_file_name, same_file_link_name));
163
+ bool result = false;
164
+ ASSERT_OK(env->AreFilesSame(same_file_name, same_file_link_name, &result));
165
+ ASSERT_TRUE(result);
166
+ }
167
+ #endif
168
+
169
+ #ifdef OS_LINUX
170
+ TEST_F(EnvPosixTest, DISABLED_FilePermission) {
171
+ // Only works for Linux environment
172
+ if (env_ == Env::Default()) {
173
+ EnvOptions soptions;
174
+ std::vector<std::string> fileNames{
175
+ test::PerThreadDBPath(env_, "testfile"),
176
+ test::PerThreadDBPath(env_, "testfile1")};
177
+ std::unique_ptr<WritableFile> wfile;
178
+ ASSERT_OK(env_->NewWritableFile(fileNames[0], &wfile, soptions));
179
+ ASSERT_OK(env_->NewWritableFile(fileNames[1], &wfile, soptions));
180
+ wfile.reset();
181
+ std::unique_ptr<RandomRWFile> rwfile;
182
+ ASSERT_OK(env_->NewRandomRWFile(fileNames[1], &rwfile, soptions));
183
+
184
+ struct stat sb;
185
+ for (const auto& filename : fileNames) {
186
+ if (::stat(filename.c_str(), &sb) == 0) {
187
+ ASSERT_EQ(sb.st_mode & 0777, 0644);
188
+ }
189
+ ASSERT_OK(env_->DeleteFile(filename));
190
+ }
191
+
192
+ env_->SetAllowNonOwnerAccess(false);
193
+ ASSERT_OK(env_->NewWritableFile(fileNames[0], &wfile, soptions));
194
+ ASSERT_OK(env_->NewWritableFile(fileNames[1], &wfile, soptions));
195
+ wfile.reset();
196
+ ASSERT_OK(env_->NewRandomRWFile(fileNames[1], &rwfile, soptions));
197
+
198
+ for (const auto& filename : fileNames) {
199
+ if (::stat(filename.c_str(), &sb) == 0) {
200
+ ASSERT_EQ(sb.st_mode & 0777, 0600);
201
+ }
202
+ ASSERT_OK(env_->DeleteFile(filename));
203
+ }
204
+ }
205
+ }
206
+
207
+ TEST_F(EnvPosixTest, LowerThreadPoolCpuPriority) {
208
+ std::atomic<CpuPriority> from_priority(CpuPriority::kNormal);
209
+ std::atomic<CpuPriority> to_priority(CpuPriority::kNormal);
210
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
211
+ "ThreadPoolImpl::BGThread::BeforeSetCpuPriority", [&](void* pri) {
212
+ from_priority.store(*reinterpret_cast<CpuPriority*>(pri));
213
+ });
214
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
215
+ "ThreadPoolImpl::BGThread::AfterSetCpuPriority", [&](void* pri) {
216
+ to_priority.store(*reinterpret_cast<CpuPriority*>(pri));
217
+ });
218
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
219
+
220
+ env_->SetBackgroundThreads(1, Env::BOTTOM);
221
+ env_->SetBackgroundThreads(1, Env::HIGH);
222
+
223
+ auto RunTask = [&](Env::Priority pool) {
224
+ std::atomic<bool> called(false);
225
+ env_->Schedule(&SetBool, &called, pool);
226
+ for (int i = 0; i < kDelayMicros; i++) {
227
+ if (called.load()) {
228
+ break;
229
+ }
230
+ Env::Default()->SleepForMicroseconds(1);
231
+ }
232
+ ASSERT_TRUE(called.load());
233
+ };
234
+
235
+ {
236
+ // Same priority, no-op.
237
+ env_->LowerThreadPoolCPUPriority(Env::Priority::BOTTOM,
238
+ CpuPriority::kNormal)
239
+ .PermitUncheckedError();
240
+ RunTask(Env::Priority::BOTTOM);
241
+ ASSERT_EQ(from_priority, CpuPriority::kNormal);
242
+ ASSERT_EQ(to_priority, CpuPriority::kNormal);
243
+ }
244
+
245
+ {
246
+ // Higher priority, no-op.
247
+ env_->LowerThreadPoolCPUPriority(Env::Priority::BOTTOM, CpuPriority::kHigh)
248
+ .PermitUncheckedError();
249
+ RunTask(Env::Priority::BOTTOM);
250
+ ASSERT_EQ(from_priority, CpuPriority::kNormal);
251
+ ASSERT_EQ(to_priority, CpuPriority::kNormal);
252
+ }
253
+
254
+ {
255
+ // Lower priority from kNormal -> kLow.
256
+ env_->LowerThreadPoolCPUPriority(Env::Priority::BOTTOM, CpuPriority::kLow)
257
+ .PermitUncheckedError();
258
+ RunTask(Env::Priority::BOTTOM);
259
+ ASSERT_EQ(from_priority, CpuPriority::kNormal);
260
+ ASSERT_EQ(to_priority, CpuPriority::kLow);
261
+ }
262
+
263
+ {
264
+ // Lower priority from kLow -> kIdle.
265
+ env_->LowerThreadPoolCPUPriority(Env::Priority::BOTTOM, CpuPriority::kIdle)
266
+ .PermitUncheckedError();
267
+ RunTask(Env::Priority::BOTTOM);
268
+ ASSERT_EQ(from_priority, CpuPriority::kLow);
269
+ ASSERT_EQ(to_priority, CpuPriority::kIdle);
270
+ }
271
+
272
+ {
273
+ // Lower priority from kNormal -> kIdle for another pool.
274
+ env_->LowerThreadPoolCPUPriority(Env::Priority::HIGH, CpuPriority::kIdle)
275
+ .PermitUncheckedError();
276
+ RunTask(Env::Priority::HIGH);
277
+ ASSERT_EQ(from_priority, CpuPriority::kNormal);
278
+ ASSERT_EQ(to_priority, CpuPriority::kIdle);
279
+ }
280
+
281
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
282
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->ClearAllCallBacks();
283
+ }
284
+ #endif
285
+
286
+ TEST_F(EnvPosixTest, MemoryMappedFileBuffer) {
287
+ const int kFileBytes = 1 << 15; // 32 KB
288
+ std::string expected_data;
289
+ std::string fname = test::PerThreadDBPath(env_, "testfile");
290
+ {
291
+ std::unique_ptr<WritableFile> wfile;
292
+ const EnvOptions soptions;
293
+ ASSERT_OK(env_->NewWritableFile(fname, &wfile, soptions));
294
+
295
+ Random rnd(301);
296
+ expected_data = rnd.RandomString(kFileBytes);
297
+ ASSERT_OK(wfile->Append(expected_data));
298
+ }
299
+
300
+ std::unique_ptr<MemoryMappedFileBuffer> mmap_buffer;
301
+ Status status = env_->NewMemoryMappedFileBuffer(fname, &mmap_buffer);
302
+ // it should be supported at least on linux
303
+ #if !defined(OS_LINUX)
304
+ if (status.IsNotSupported()) {
305
+ fprintf(stderr,
306
+ "skipping EnvPosixTest.MemoryMappedFileBuffer due to "
307
+ "unsupported Env::NewMemoryMappedFileBuffer\n");
308
+ return;
309
+ }
310
+ #endif // !defined(OS_LINUX)
311
+
312
+ ASSERT_OK(status);
313
+ ASSERT_NE(nullptr, mmap_buffer.get());
314
+ ASSERT_NE(nullptr, mmap_buffer->GetBase());
315
+ ASSERT_EQ(kFileBytes, mmap_buffer->GetLen());
316
+ std::string actual_data(reinterpret_cast<const char*>(mmap_buffer->GetBase()),
317
+ mmap_buffer->GetLen());
318
+ ASSERT_EQ(expected_data, actual_data);
319
+ }
320
+
321
+ #ifndef ROCKSDB_NO_DYNAMIC_EXTENSION
322
+ TEST_F(EnvPosixTest, LoadRocksDBLibrary) {
323
+ std::shared_ptr<DynamicLibrary> library;
324
+ std::function<void*(void*, const char*)> function;
325
+ Status status = env_->LoadLibrary("no-such-library", "", &library);
326
+ ASSERT_NOK(status);
327
+ ASSERT_EQ(nullptr, library.get());
328
+ status = env_->LoadLibrary("rocksdb", "", &library);
329
+ if (status.ok()) { // If we have can find a rocksdb shared library
330
+ ASSERT_NE(nullptr, library.get());
331
+ ASSERT_OK(library->LoadFunction("rocksdb_create_default_env",
332
+ &function)); // from C definition
333
+ ASSERT_NE(nullptr, function);
334
+ ASSERT_NOK(library->LoadFunction("no-such-method", &function));
335
+ ASSERT_EQ(nullptr, function);
336
+ ASSERT_OK(env_->LoadLibrary(library->Name(), "", &library));
337
+ } else {
338
+ ASSERT_EQ(nullptr, library.get());
339
+ }
340
+ }
341
+ #endif // !ROCKSDB_NO_DYNAMIC_EXTENSION
342
+
343
+ #if !defined(OS_WIN) && !defined(ROCKSDB_NO_DYNAMIC_EXTENSION)
344
+ TEST_F(EnvPosixTest, LoadRocksDBLibraryWithSearchPath) {
345
+ std::shared_ptr<DynamicLibrary> library;
346
+ std::function<void*(void*, const char*)> function;
347
+ ASSERT_NOK(env_->LoadLibrary("no-such-library", "/tmp", &library));
348
+ ASSERT_EQ(nullptr, library.get());
349
+ ASSERT_NOK(env_->LoadLibrary("dl", "/tmp", &library));
350
+ ASSERT_EQ(nullptr, library.get());
351
+ Status status = env_->LoadLibrary("rocksdb", "/tmp:./", &library);
352
+ if (status.ok()) {
353
+ ASSERT_NE(nullptr, library.get());
354
+ ASSERT_OK(env_->LoadLibrary(library->Name(), "", &library));
355
+ }
356
+ char buff[1024];
357
+ std::string cwd = getcwd(buff, sizeof(buff));
358
+
359
+ status = env_->LoadLibrary("rocksdb", "/tmp:" + cwd, &library);
360
+ if (status.ok()) {
361
+ ASSERT_NE(nullptr, library.get());
362
+ ASSERT_OK(env_->LoadLibrary(library->Name(), "", &library));
363
+ }
364
+ }
365
+ #endif // !OS_WIN && !ROCKSDB_NO_DYNAMIC_EXTENSION
366
+
367
+ TEST_P(EnvPosixTestWithParam, UnSchedule) {
368
+ std::atomic<bool> called(false);
369
+ env_->SetBackgroundThreads(1, Env::LOW);
370
+
371
+ /* Block the low priority queue */
372
+ test::SleepingBackgroundTask sleeping_task, sleeping_task1;
373
+ env_->Schedule(&test::SleepingBackgroundTask::DoSleepTask, &sleeping_task,
374
+ Env::Priority::LOW);
375
+
376
+ /* Schedule another task */
377
+ env_->Schedule(&test::SleepingBackgroundTask::DoSleepTask, &sleeping_task1,
378
+ Env::Priority::LOW, &sleeping_task1);
379
+
380
+ /* Remove it with a different tag */
381
+ ASSERT_EQ(0, env_->UnSchedule(&called, Env::Priority::LOW));
382
+
383
+ /* Remove it from the queue with the right tag */
384
+ ASSERT_EQ(1, env_->UnSchedule(&sleeping_task1, Env::Priority::LOW));
385
+
386
+ // Unblock background thread
387
+ sleeping_task.WakeUp();
388
+
389
+ /* Schedule another task */
390
+ env_->Schedule(&SetBool, &called);
391
+ for (int i = 0; i < kDelayMicros; i++) {
392
+ if (called.load()) {
393
+ break;
394
+ }
395
+ Env::Default()->SleepForMicroseconds(1);
396
+ }
397
+ ASSERT_TRUE(called.load());
398
+
399
+ ASSERT_TRUE(!sleeping_task.IsSleeping() && !sleeping_task1.IsSleeping());
400
+ WaitThreadPoolsEmpty();
401
+ }
402
+
403
+ // This tests assumes that the last scheduled
404
+ // task will run last. In fact, in the allotted
405
+ // sleeping time nothing may actually run or they may
406
+ // run in any order. The purpose of the test is unclear.
407
+ #ifndef OS_WIN
408
+ TEST_P(EnvPosixTestWithParam, RunMany) {
409
+ env_->SetBackgroundThreads(1, Env::LOW);
410
+ std::atomic<int> last_id(0);
411
+
412
+ struct CB {
413
+ std::atomic<int>* last_id_ptr; // Pointer to shared slot
414
+ int id; // Order# for the execution of this callback
415
+
416
+ CB(std::atomic<int>* p, int i) : last_id_ptr(p), id(i) {}
417
+
418
+ static void Run(void* v) {
419
+ CB* cb = reinterpret_cast<CB*>(v);
420
+ int cur = cb->last_id_ptr->load();
421
+ ASSERT_EQ(cb->id - 1, cur);
422
+ cb->last_id_ptr->store(cb->id);
423
+ }
424
+ };
425
+
426
+ // Schedule in different order than start time
427
+ CB cb1(&last_id, 1);
428
+ CB cb2(&last_id, 2);
429
+ CB cb3(&last_id, 3);
430
+ CB cb4(&last_id, 4);
431
+ env_->Schedule(&CB::Run, &cb1);
432
+ env_->Schedule(&CB::Run, &cb2);
433
+ env_->Schedule(&CB::Run, &cb3);
434
+ env_->Schedule(&CB::Run, &cb4);
435
+
436
+ Env::Default()->SleepForMicroseconds(kDelayMicros);
437
+ int cur = last_id.load(std::memory_order_acquire);
438
+ ASSERT_EQ(4, cur);
439
+ WaitThreadPoolsEmpty();
440
+ }
441
+ #endif
442
+
443
+ struct State {
444
+ port::Mutex mu;
445
+ int val;
446
+ int num_running;
447
+ };
448
+
449
+ static void ThreadBody(void* arg) {
450
+ State* s = reinterpret_cast<State*>(arg);
451
+ s->mu.Lock();
452
+ s->val += 1;
453
+ s->num_running -= 1;
454
+ s->mu.Unlock();
455
+ }
456
+
457
+ TEST_P(EnvPosixTestWithParam, StartThread) {
458
+ State state;
459
+ state.val = 0;
460
+ state.num_running = 3;
461
+ for (int i = 0; i < 3; i++) {
462
+ env_->StartThread(&ThreadBody, &state);
463
+ }
464
+ while (true) {
465
+ state.mu.Lock();
466
+ int num = state.num_running;
467
+ state.mu.Unlock();
468
+ if (num == 0) {
469
+ break;
470
+ }
471
+ Env::Default()->SleepForMicroseconds(kDelayMicros);
472
+ }
473
+ ASSERT_EQ(state.val, 3);
474
+ WaitThreadPoolsEmpty();
475
+ }
476
+
477
+ TEST_P(EnvPosixTestWithParam, TwoPools) {
478
+ // Data structures to signal tasks to run.
479
+ port::Mutex mutex;
480
+ port::CondVar cv(&mutex);
481
+ bool should_start = false;
482
+
483
+ class CB {
484
+ public:
485
+ CB(const std::string& pool_name, int pool_size, port::Mutex* trigger_mu,
486
+ port::CondVar* trigger_cv, bool* _should_start)
487
+ : mu_(),
488
+ num_running_(0),
489
+ num_finished_(0),
490
+ pool_size_(pool_size),
491
+ pool_name_(pool_name),
492
+ trigger_mu_(trigger_mu),
493
+ trigger_cv_(trigger_cv),
494
+ should_start_(_should_start) {}
495
+
496
+ static void Run(void* v) {
497
+ CB* cb = reinterpret_cast<CB*>(v);
498
+ cb->Run();
499
+ }
500
+
501
+ void Run() {
502
+ {
503
+ MutexLock l(&mu_);
504
+ num_running_++;
505
+ // make sure we don't have more than pool_size_ jobs running.
506
+ ASSERT_LE(num_running_, pool_size_.load());
507
+ }
508
+
509
+ {
510
+ MutexLock l(trigger_mu_);
511
+ while (!(*should_start_)) {
512
+ trigger_cv_->Wait();
513
+ }
514
+ }
515
+
516
+ {
517
+ MutexLock l(&mu_);
518
+ num_running_--;
519
+ num_finished_++;
520
+ }
521
+ }
522
+
523
+ int NumFinished() {
524
+ MutexLock l(&mu_);
525
+ return num_finished_;
526
+ }
527
+
528
+ void Reset(int pool_size) {
529
+ pool_size_.store(pool_size);
530
+ num_finished_ = 0;
531
+ }
532
+
533
+ private:
534
+ port::Mutex mu_;
535
+ int num_running_;
536
+ int num_finished_;
537
+ std::atomic<int> pool_size_;
538
+ std::string pool_name_;
539
+ port::Mutex* trigger_mu_;
540
+ port::CondVar* trigger_cv_;
541
+ bool* should_start_;
542
+ };
543
+
544
+ const int kLowPoolSize = 2;
545
+ const int kHighPoolSize = 4;
546
+ const int kJobs = 8;
547
+
548
+ CB low_pool_job("low", kLowPoolSize, &mutex, &cv, &should_start);
549
+ CB high_pool_job("high", kHighPoolSize, &mutex, &cv, &should_start);
550
+
551
+ env_->SetBackgroundThreads(kLowPoolSize);
552
+ env_->SetBackgroundThreads(kHighPoolSize, Env::Priority::HIGH);
553
+
554
+ ASSERT_EQ(0U, env_->GetThreadPoolQueueLen(Env::Priority::LOW));
555
+ ASSERT_EQ(0U, env_->GetThreadPoolQueueLen(Env::Priority::HIGH));
556
+
557
+ // schedule same number of jobs in each pool
558
+ for (int i = 0; i < kJobs; i++) {
559
+ env_->Schedule(&CB::Run, &low_pool_job);
560
+ env_->Schedule(&CB::Run, &high_pool_job, Env::Priority::HIGH);
561
+ }
562
+ // Wait a short while for the jobs to be dispatched.
563
+ int sleep_count = 0;
564
+ while ((unsigned int)(kJobs - kLowPoolSize) !=
565
+ env_->GetThreadPoolQueueLen(Env::Priority::LOW) ||
566
+ (unsigned int)(kJobs - kHighPoolSize) !=
567
+ env_->GetThreadPoolQueueLen(Env::Priority::HIGH)) {
568
+ env_->SleepForMicroseconds(kDelayMicros);
569
+ if (++sleep_count > 100) {
570
+ break;
571
+ }
572
+ }
573
+
574
+ ASSERT_EQ((unsigned int)(kJobs - kLowPoolSize),
575
+ env_->GetThreadPoolQueueLen());
576
+ ASSERT_EQ((unsigned int)(kJobs - kLowPoolSize),
577
+ env_->GetThreadPoolQueueLen(Env::Priority::LOW));
578
+ ASSERT_EQ((unsigned int)(kJobs - kHighPoolSize),
579
+ env_->GetThreadPoolQueueLen(Env::Priority::HIGH));
580
+
581
+ // Trigger jobs to run.
582
+ {
583
+ MutexLock l(&mutex);
584
+ should_start = true;
585
+ cv.SignalAll();
586
+ }
587
+
588
+ // wait for all jobs to finish
589
+ while (low_pool_job.NumFinished() < kJobs ||
590
+ high_pool_job.NumFinished() < kJobs) {
591
+ env_->SleepForMicroseconds(kDelayMicros);
592
+ }
593
+
594
+ ASSERT_EQ(0U, env_->GetThreadPoolQueueLen(Env::Priority::LOW));
595
+ ASSERT_EQ(0U, env_->GetThreadPoolQueueLen(Env::Priority::HIGH));
596
+
597
+ // Hold jobs to schedule;
598
+ should_start = false;
599
+
600
+ // call IncBackgroundThreadsIfNeeded to two pools. One increasing and
601
+ // the other decreasing
602
+ env_->IncBackgroundThreadsIfNeeded(kLowPoolSize - 1, Env::Priority::LOW);
603
+ env_->IncBackgroundThreadsIfNeeded(kHighPoolSize + 1, Env::Priority::HIGH);
604
+ high_pool_job.Reset(kHighPoolSize + 1);
605
+ low_pool_job.Reset(kLowPoolSize);
606
+
607
+ // schedule same number of jobs in each pool
608
+ for (int i = 0; i < kJobs; i++) {
609
+ env_->Schedule(&CB::Run, &low_pool_job);
610
+ env_->Schedule(&CB::Run, &high_pool_job, Env::Priority::HIGH);
611
+ }
612
+ // Wait a short while for the jobs to be dispatched.
613
+ sleep_count = 0;
614
+ while ((unsigned int)(kJobs - kLowPoolSize) !=
615
+ env_->GetThreadPoolQueueLen(Env::Priority::LOW) ||
616
+ (unsigned int)(kJobs - (kHighPoolSize + 1)) !=
617
+ env_->GetThreadPoolQueueLen(Env::Priority::HIGH)) {
618
+ env_->SleepForMicroseconds(kDelayMicros);
619
+ if (++sleep_count > 100) {
620
+ break;
621
+ }
622
+ }
623
+ ASSERT_EQ((unsigned int)(kJobs - kLowPoolSize),
624
+ env_->GetThreadPoolQueueLen());
625
+ ASSERT_EQ((unsigned int)(kJobs - kLowPoolSize),
626
+ env_->GetThreadPoolQueueLen(Env::Priority::LOW));
627
+ ASSERT_EQ((unsigned int)(kJobs - (kHighPoolSize + 1)),
628
+ env_->GetThreadPoolQueueLen(Env::Priority::HIGH));
629
+
630
+ // Trigger jobs to run.
631
+ {
632
+ MutexLock l(&mutex);
633
+ should_start = true;
634
+ cv.SignalAll();
635
+ }
636
+
637
+ // wait for all jobs to finish
638
+ while (low_pool_job.NumFinished() < kJobs ||
639
+ high_pool_job.NumFinished() < kJobs) {
640
+ env_->SleepForMicroseconds(kDelayMicros);
641
+ }
642
+
643
+ env_->SetBackgroundThreads(kHighPoolSize, Env::Priority::HIGH);
644
+ WaitThreadPoolsEmpty();
645
+ }
646
+
647
+ TEST_P(EnvPosixTestWithParam, DecreaseNumBgThreads) {
648
+ constexpr int kWaitMicros = 60000000; // 1min
649
+
650
+ std::vector<test::SleepingBackgroundTask> tasks(10);
651
+
652
+ // Set number of thread to 1 first.
653
+ env_->SetBackgroundThreads(1, Env::Priority::HIGH);
654
+
655
+ // Schedule 3 tasks. 0 running; Task 1, 2 waiting.
656
+ for (size_t i = 0; i < 3; i++) {
657
+ env_->Schedule(&test::SleepingBackgroundTask::DoSleepTask, &tasks[i],
658
+ Env::Priority::HIGH);
659
+ }
660
+ ASSERT_FALSE(tasks[0].TimedWaitUntilSleeping(kWaitMicros));
661
+ ASSERT_EQ(2U, env_->GetThreadPoolQueueLen(Env::Priority::HIGH));
662
+ ASSERT_TRUE(tasks[0].IsSleeping());
663
+ ASSERT_TRUE(!tasks[1].IsSleeping());
664
+ ASSERT_TRUE(!tasks[2].IsSleeping());
665
+
666
+ // Increase to 2 threads. Task 0, 1 running; 2 waiting
667
+ env_->SetBackgroundThreads(2, Env::Priority::HIGH);
668
+ ASSERT_FALSE(tasks[1].TimedWaitUntilSleeping(kWaitMicros));
669
+ ASSERT_EQ(1U, env_->GetThreadPoolQueueLen(Env::Priority::HIGH));
670
+ ASSERT_TRUE(tasks[0].IsSleeping());
671
+ ASSERT_TRUE(tasks[1].IsSleeping());
672
+ ASSERT_TRUE(!tasks[2].IsSleeping());
673
+
674
+ // Shrink back to 1 thread. Still task 0, 1 running, 2 waiting
675
+ env_->SetBackgroundThreads(1, Env::Priority::HIGH);
676
+ Env::Default()->SleepForMicroseconds(kDelayMicros);
677
+ ASSERT_EQ(1U, env_->GetThreadPoolQueueLen(Env::Priority::HIGH));
678
+ ASSERT_TRUE(tasks[0].IsSleeping());
679
+ ASSERT_TRUE(tasks[1].IsSleeping());
680
+ ASSERT_TRUE(!tasks[2].IsSleeping());
681
+
682
+ // The last task finishes. Task 0 running, 2 waiting.
683
+ tasks[1].WakeUp();
684
+ ASSERT_FALSE(tasks[1].TimedWaitUntilDone(kWaitMicros));
685
+ ASSERT_EQ(1U, env_->GetThreadPoolQueueLen(Env::Priority::HIGH));
686
+ ASSERT_TRUE(tasks[0].IsSleeping());
687
+ ASSERT_TRUE(!tasks[1].IsSleeping());
688
+ ASSERT_TRUE(!tasks[2].IsSleeping());
689
+
690
+ // Increase to 5 threads. Task 0 and 2 running.
691
+ env_->SetBackgroundThreads(5, Env::Priority::HIGH);
692
+ ASSERT_FALSE(tasks[2].TimedWaitUntilSleeping(kWaitMicros));
693
+ ASSERT_EQ(0U, env_->GetThreadPoolQueueLen(Env::Priority::HIGH));
694
+ ASSERT_TRUE(tasks[0].IsSleeping());
695
+ ASSERT_TRUE(!tasks[1].IsSleeping());
696
+ ASSERT_TRUE(tasks[2].IsSleeping());
697
+
698
+ // Change number of threads a couple of times while there is no sufficient
699
+ // tasks.
700
+ env_->SetBackgroundThreads(7, Env::Priority::HIGH);
701
+ tasks[2].WakeUp();
702
+ ASSERT_FALSE(tasks[2].TimedWaitUntilDone(kWaitMicros));
703
+ ASSERT_EQ(0U, env_->GetThreadPoolQueueLen(Env::Priority::HIGH));
704
+ env_->SetBackgroundThreads(3, Env::Priority::HIGH);
705
+ Env::Default()->SleepForMicroseconds(kDelayMicros);
706
+ ASSERT_EQ(0U, env_->GetThreadPoolQueueLen(Env::Priority::HIGH));
707
+ env_->SetBackgroundThreads(4, Env::Priority::HIGH);
708
+ Env::Default()->SleepForMicroseconds(kDelayMicros);
709
+ ASSERT_EQ(0U, env_->GetThreadPoolQueueLen(Env::Priority::HIGH));
710
+ env_->SetBackgroundThreads(5, Env::Priority::HIGH);
711
+ Env::Default()->SleepForMicroseconds(kDelayMicros);
712
+ ASSERT_EQ(0U, env_->GetThreadPoolQueueLen(Env::Priority::HIGH));
713
+ env_->SetBackgroundThreads(4, Env::Priority::HIGH);
714
+ Env::Default()->SleepForMicroseconds(kDelayMicros);
715
+ ASSERT_EQ(0U, env_->GetThreadPoolQueueLen(Env::Priority::HIGH));
716
+
717
+ Env::Default()->SleepForMicroseconds(kDelayMicros * 50);
718
+
719
+ // Enqueue 5 more tasks. Thread pool size now is 4.
720
+ // Task 0, 3, 4, 5 running;6, 7 waiting.
721
+ for (size_t i = 3; i < 8; i++) {
722
+ env_->Schedule(&test::SleepingBackgroundTask::DoSleepTask, &tasks[i],
723
+ Env::Priority::HIGH);
724
+ }
725
+ for (size_t i = 3; i <= 5; i++) {
726
+ ASSERT_FALSE(tasks[i].TimedWaitUntilSleeping(kWaitMicros));
727
+ }
728
+ ASSERT_EQ(2U, env_->GetThreadPoolQueueLen(Env::Priority::HIGH));
729
+ ASSERT_TRUE(tasks[0].IsSleeping());
730
+ ASSERT_TRUE(!tasks[1].IsSleeping());
731
+ ASSERT_TRUE(!tasks[2].IsSleeping());
732
+ ASSERT_TRUE(tasks[3].IsSleeping());
733
+ ASSERT_TRUE(tasks[4].IsSleeping());
734
+ ASSERT_TRUE(tasks[5].IsSleeping());
735
+ ASSERT_TRUE(!tasks[6].IsSleeping());
736
+ ASSERT_TRUE(!tasks[7].IsSleeping());
737
+
738
+ // Wake up task 0, 3 and 4. Task 5, 6, 7 running.
739
+ tasks[0].WakeUp();
740
+ tasks[3].WakeUp();
741
+ tasks[4].WakeUp();
742
+
743
+ for (size_t i = 5; i < 8; i++) {
744
+ ASSERT_FALSE(tasks[i].TimedWaitUntilSleeping(kWaitMicros));
745
+ }
746
+ ASSERT_EQ(0U, env_->GetThreadPoolQueueLen(Env::Priority::HIGH));
747
+ for (size_t i = 5; i < 8; i++) {
748
+ ASSERT_TRUE(tasks[i].IsSleeping());
749
+ }
750
+
751
+ // Shrink back to 1 thread. Still task 5, 6, 7 running
752
+ env_->SetBackgroundThreads(1, Env::Priority::HIGH);
753
+ Env::Default()->SleepForMicroseconds(kDelayMicros);
754
+ ASSERT_TRUE(tasks[5].IsSleeping());
755
+ ASSERT_TRUE(tasks[6].IsSleeping());
756
+ ASSERT_TRUE(tasks[7].IsSleeping());
757
+
758
+ // Wake up task 6. Task 5, 7 running
759
+ tasks[6].WakeUp();
760
+ ASSERT_FALSE(tasks[6].TimedWaitUntilDone(kWaitMicros));
761
+ ASSERT_TRUE(tasks[5].IsSleeping());
762
+ ASSERT_TRUE(!tasks[6].IsSleeping());
763
+ ASSERT_TRUE(tasks[7].IsSleeping());
764
+
765
+ // Wake up threads 7. Task 5 running
766
+ tasks[7].WakeUp();
767
+ ASSERT_FALSE(tasks[7].TimedWaitUntilDone(kWaitMicros));
768
+ ASSERT_TRUE(!tasks[7].IsSleeping());
769
+
770
+ // Enqueue thread 8 and 9. Task 5 running; one of 8, 9 might be running.
771
+ env_->Schedule(&test::SleepingBackgroundTask::DoSleepTask, &tasks[8],
772
+ Env::Priority::HIGH);
773
+ env_->Schedule(&test::SleepingBackgroundTask::DoSleepTask, &tasks[9],
774
+ Env::Priority::HIGH);
775
+ Env::Default()->SleepForMicroseconds(kDelayMicros);
776
+ ASSERT_GT(env_->GetThreadPoolQueueLen(Env::Priority::HIGH), (unsigned int)0);
777
+ ASSERT_TRUE(!tasks[8].IsSleeping() || !tasks[9].IsSleeping());
778
+
779
+ // Increase to 4 threads. Task 5, 8, 9 running.
780
+ env_->SetBackgroundThreads(4, Env::Priority::HIGH);
781
+ Env::Default()->SleepForMicroseconds(kDelayMicros);
782
+ ASSERT_EQ((unsigned int)0, env_->GetThreadPoolQueueLen(Env::Priority::HIGH));
783
+ ASSERT_TRUE(tasks[8].IsSleeping());
784
+ ASSERT_TRUE(tasks[9].IsSleeping());
785
+
786
+ // Shrink to 1 thread
787
+ env_->SetBackgroundThreads(1, Env::Priority::HIGH);
788
+
789
+ // Wake up thread 9.
790
+ tasks[9].WakeUp();
791
+ ASSERT_FALSE(tasks[9].TimedWaitUntilDone(kWaitMicros));
792
+ ASSERT_TRUE(!tasks[9].IsSleeping());
793
+ ASSERT_TRUE(tasks[8].IsSleeping());
794
+
795
+ // Wake up thread 8
796
+ tasks[8].WakeUp();
797
+ ASSERT_FALSE(tasks[8].TimedWaitUntilDone(kWaitMicros));
798
+ ASSERT_TRUE(!tasks[8].IsSleeping());
799
+
800
+ // Wake up the last thread
801
+ tasks[5].WakeUp();
802
+ ASSERT_FALSE(tasks[5].TimedWaitUntilDone(kWaitMicros));
803
+ WaitThreadPoolsEmpty();
804
+ }
805
+
806
+ #if (defined OS_LINUX || defined OS_WIN)
807
+ // Travis doesn't support fallocate or getting unique ID from files for whatever
808
+ // reason.
809
+ #ifndef TRAVIS
810
+
811
+ namespace {
812
+ bool IsSingleVarint(const std::string& s) {
813
+ Slice slice(s);
814
+
815
+ uint64_t v;
816
+ if (!GetVarint64(&slice, &v)) {
817
+ return false;
818
+ }
819
+
820
+ return slice.size() == 0;
821
+ }
822
+
823
+ bool IsUniqueIDValid(const std::string& s) {
824
+ return !s.empty() && !IsSingleVarint(s);
825
+ }
826
+
827
+ const size_t MAX_ID_SIZE = 100;
828
+ char temp_id[MAX_ID_SIZE];
829
+
830
+
831
+ } // namespace
832
+
833
+ // Determine whether we can use the FS_IOC_GETVERSION ioctl
834
+ // on a file in directory DIR. Create a temporary file therein,
835
+ // try to apply the ioctl (save that result), cleanup and
836
+ // return the result. Return true if it is supported, and
837
+ // false if anything fails.
838
+ // Note that this function "knows" that dir has just been created
839
+ // and is empty, so we create a simply-named test file: "f".
840
+ bool ioctl_support__FS_IOC_GETVERSION(const std::string& dir) {
841
+ #ifdef OS_WIN
842
+ return true;
843
+ #else
844
+ const std::string file = dir + "/f";
845
+ int fd;
846
+ do {
847
+ fd = open(file.c_str(), O_CREAT | O_RDWR | O_TRUNC, 0644);
848
+ } while (fd < 0 && errno == EINTR);
849
+ long int version;
850
+ bool ok = (fd >= 0 && ioctl(fd, FS_IOC_GETVERSION, &version) >= 0);
851
+
852
+ close(fd);
853
+ unlink(file.c_str());
854
+
855
+ return ok;
856
+ #endif
857
+ }
858
+
859
+ // To ensure that Env::GetUniqueId-related tests work correctly, the files
860
+ // should be stored in regular storage like "hard disk" or "flash device",
861
+ // and not on a tmpfs file system (like /dev/shm and /tmp on some systems).
862
+ // Otherwise we cannot get the correct id.
863
+ //
864
+ // This function serves as the replacement for test::TmpDir(), which may be
865
+ // customized to be on a file system that doesn't work with GetUniqueId().
866
+
867
+ class IoctlFriendlyTmpdir {
868
+ public:
869
+ explicit IoctlFriendlyTmpdir() {
870
+ char dir_buf[100];
871
+
872
+ const char *fmt = "%s/rocksdb.XXXXXX";
873
+ const char *tmp = getenv("TEST_IOCTL_FRIENDLY_TMPDIR");
874
+
875
+ #ifdef OS_WIN
876
+ #define rmdir _rmdir
877
+ if(tmp == nullptr) {
878
+ tmp = getenv("TMP");
879
+ }
880
+
881
+ snprintf(dir_buf, sizeof dir_buf, fmt, tmp);
882
+ auto result = _mktemp(dir_buf);
883
+ assert(result != nullptr);
884
+ BOOL ret = CreateDirectory(dir_buf, NULL);
885
+ assert(ret == TRUE);
886
+ dir_ = dir_buf;
887
+ #else
888
+ std::list<std::string> candidate_dir_list = {"/var/tmp", "/tmp"};
889
+
890
+ // If $TEST_IOCTL_FRIENDLY_TMPDIR/rocksdb.XXXXXX fits, use
891
+ // $TEST_IOCTL_FRIENDLY_TMPDIR; subtract 2 for the "%s", and
892
+ // add 1 for the trailing NUL byte.
893
+ if (tmp && strlen(tmp) + strlen(fmt) - 2 + 1 <= sizeof dir_buf) {
894
+ // use $TEST_IOCTL_FRIENDLY_TMPDIR value
895
+ candidate_dir_list.push_front(tmp);
896
+ }
897
+
898
+ for (const std::string& d : candidate_dir_list) {
899
+ snprintf(dir_buf, sizeof dir_buf, fmt, d.c_str());
900
+ if (mkdtemp(dir_buf)) {
901
+ if (ioctl_support__FS_IOC_GETVERSION(dir_buf)) {
902
+ dir_ = dir_buf;
903
+ return;
904
+ } else {
905
+ // Diagnose ioctl-related failure only if this is the
906
+ // directory specified via that envvar.
907
+ if (tmp && tmp == d) {
908
+ fprintf(stderr, "TEST_IOCTL_FRIENDLY_TMPDIR-specified directory is "
909
+ "not suitable: %s\n", d.c_str());
910
+ }
911
+ rmdir(dir_buf); // ignore failure
912
+ }
913
+ } else {
914
+ // mkdtemp failed: diagnose it, but don't give up.
915
+ fprintf(stderr, "mkdtemp(%s/...) failed: %s\n", d.c_str(),
916
+ strerror(errno));
917
+ }
918
+ }
919
+
920
+ fprintf(stderr, "failed to find an ioctl-friendly temporary directory;"
921
+ " specify one via the TEST_IOCTL_FRIENDLY_TMPDIR envvar\n");
922
+ std::abort();
923
+ #endif
924
+ }
925
+
926
+ ~IoctlFriendlyTmpdir() {
927
+ rmdir(dir_.c_str());
928
+ }
929
+
930
+ const std::string& name() const {
931
+ return dir_;
932
+ }
933
+
934
+ private:
935
+ std::string dir_;
936
+ };
937
+
938
+ #ifndef ROCKSDB_LITE
939
+ TEST_F(EnvPosixTest, PositionedAppend) {
940
+ std::unique_ptr<WritableFile> writable_file;
941
+ EnvOptions options;
942
+ options.use_direct_writes = true;
943
+ options.use_mmap_writes = false;
944
+ IoctlFriendlyTmpdir ift;
945
+ ASSERT_OK(env_->NewWritableFile(ift.name() + "/f", &writable_file, options));
946
+ const size_t kBlockSize = 4096;
947
+ const size_t kDataSize = kPageSize;
948
+ // Write a page worth of 'a'
949
+ auto data_ptr = NewAligned(kDataSize, 'a');
950
+ Slice data_a(data_ptr.get(), kDataSize);
951
+ ASSERT_OK(writable_file->PositionedAppend(data_a, 0U));
952
+ // Write a page worth of 'b' right after the first sector
953
+ data_ptr = NewAligned(kDataSize, 'b');
954
+ Slice data_b(data_ptr.get(), kDataSize);
955
+ ASSERT_OK(writable_file->PositionedAppend(data_b, kBlockSize));
956
+ ASSERT_OK(writable_file->Close());
957
+ // The file now has 1 sector worth of a followed by a page worth of b
958
+
959
+ // Verify the above
960
+ std::unique_ptr<SequentialFile> seq_file;
961
+ ASSERT_OK(env_->NewSequentialFile(ift.name() + "/f", &seq_file, options));
962
+ size_t scratch_len = kPageSize * 2;
963
+ std::unique_ptr<char[]> scratch(new char[scratch_len]);
964
+ Slice result;
965
+ ASSERT_OK(seq_file->Read(scratch_len, &result, scratch.get()));
966
+ ASSERT_EQ(kPageSize + kBlockSize, result.size());
967
+ ASSERT_EQ('a', result[kBlockSize - 1]);
968
+ ASSERT_EQ('b', result[kBlockSize]);
969
+ }
970
+ #endif // !ROCKSDB_LITE
971
+
972
+ // `GetUniqueId()` temporarily returns zero on Windows. `BlockBasedTable` can
973
+ // handle a return value of zero but this test case cannot.
974
+ #ifndef OS_WIN
975
+ TEST_P(EnvPosixTestWithParam, RandomAccessUniqueID) {
976
+ // Create file.
977
+ if (env_ == Env::Default()) {
978
+ EnvOptions soptions;
979
+ soptions.use_direct_reads = soptions.use_direct_writes = direct_io_;
980
+ IoctlFriendlyTmpdir ift;
981
+ std::string fname = ift.name() + "/testfile";
982
+ std::unique_ptr<WritableFile> wfile;
983
+ ASSERT_OK(env_->NewWritableFile(fname, &wfile, soptions));
984
+
985
+ std::unique_ptr<RandomAccessFile> file;
986
+
987
+ // Get Unique ID
988
+ ASSERT_OK(env_->NewRandomAccessFile(fname, &file, soptions));
989
+ size_t id_size = file->GetUniqueId(temp_id, MAX_ID_SIZE);
990
+ ASSERT_TRUE(id_size > 0);
991
+ std::string unique_id1(temp_id, id_size);
992
+ ASSERT_TRUE(IsUniqueIDValid(unique_id1));
993
+
994
+ // Get Unique ID again
995
+ ASSERT_OK(env_->NewRandomAccessFile(fname, &file, soptions));
996
+ id_size = file->GetUniqueId(temp_id, MAX_ID_SIZE);
997
+ ASSERT_TRUE(id_size > 0);
998
+ std::string unique_id2(temp_id, id_size);
999
+ ASSERT_TRUE(IsUniqueIDValid(unique_id2));
1000
+
1001
+ // Get Unique ID again after waiting some time.
1002
+ env_->SleepForMicroseconds(1000000);
1003
+ ASSERT_OK(env_->NewRandomAccessFile(fname, &file, soptions));
1004
+ id_size = file->GetUniqueId(temp_id, MAX_ID_SIZE);
1005
+ ASSERT_TRUE(id_size > 0);
1006
+ std::string unique_id3(temp_id, id_size);
1007
+ ASSERT_TRUE(IsUniqueIDValid(unique_id3));
1008
+
1009
+ // Check IDs are the same.
1010
+ ASSERT_EQ(unique_id1, unique_id2);
1011
+ ASSERT_EQ(unique_id2, unique_id3);
1012
+
1013
+ // Delete the file
1014
+ ASSERT_OK(env_->DeleteFile(fname));
1015
+ }
1016
+ }
1017
+ #endif // !defined(OS_WIN)
1018
+
1019
+ // only works in linux platforms
1020
+ #ifdef ROCKSDB_FALLOCATE_PRESENT
1021
+ TEST_P(EnvPosixTestWithParam, AllocateTest) {
1022
+ if (env_ == Env::Default()) {
1023
+ IoctlFriendlyTmpdir ift;
1024
+ std::string fname = ift.name() + "/preallocate_testfile";
1025
+
1026
+ // Try fallocate in a file to see whether the target file system supports
1027
+ // it.
1028
+ // Skip the test if fallocate is not supported.
1029
+ std::string fname_test_fallocate = ift.name() + "/preallocate_testfile_2";
1030
+ int fd = -1;
1031
+ do {
1032
+ fd = open(fname_test_fallocate.c_str(), O_CREAT | O_RDWR | O_TRUNC, 0644);
1033
+ } while (fd < 0 && errno == EINTR);
1034
+ ASSERT_GT(fd, 0);
1035
+
1036
+ int alloc_status = fallocate(fd, 0, 0, 1);
1037
+
1038
+ int err_number = 0;
1039
+ if (alloc_status != 0) {
1040
+ err_number = errno;
1041
+ fprintf(stderr, "Warning: fallocate() fails, %s\n", strerror(err_number));
1042
+ }
1043
+ close(fd);
1044
+ ASSERT_OK(env_->DeleteFile(fname_test_fallocate));
1045
+ if (alloc_status != 0 && err_number == EOPNOTSUPP) {
1046
+ // The filesystem containing the file does not support fallocate
1047
+ return;
1048
+ }
1049
+
1050
+ EnvOptions soptions;
1051
+ soptions.use_mmap_writes = false;
1052
+ soptions.use_direct_reads = soptions.use_direct_writes = direct_io_;
1053
+ std::unique_ptr<WritableFile> wfile;
1054
+ ASSERT_OK(env_->NewWritableFile(fname, &wfile, soptions));
1055
+
1056
+ // allocate 100 MB
1057
+ size_t kPreallocateSize = 100 * 1024 * 1024;
1058
+ size_t kBlockSize = 512;
1059
+ size_t kDataSize = 1024 * 1024;
1060
+ auto data_ptr = NewAligned(kDataSize, 'A');
1061
+ Slice data(data_ptr.get(), kDataSize);
1062
+ wfile->SetPreallocationBlockSize(kPreallocateSize);
1063
+ wfile->PrepareWrite(wfile->GetFileSize(), kDataSize);
1064
+ ASSERT_OK(wfile->Append(data));
1065
+ ASSERT_OK(wfile->Flush());
1066
+
1067
+ struct stat f_stat;
1068
+ ASSERT_EQ(stat(fname.c_str(), &f_stat), 0);
1069
+ ASSERT_EQ((unsigned int)kDataSize, f_stat.st_size);
1070
+ // verify that blocks are preallocated
1071
+ // Note here that we don't check the exact number of blocks preallocated --
1072
+ // we only require that number of allocated blocks is at least what we
1073
+ // expect.
1074
+ // It looks like some FS give us more blocks that we asked for. That's fine.
1075
+ // It might be worth investigating further.
1076
+ ASSERT_LE((unsigned int)(kPreallocateSize / kBlockSize), f_stat.st_blocks);
1077
+
1078
+ // close the file, should deallocate the blocks
1079
+ wfile.reset();
1080
+
1081
+ stat(fname.c_str(), &f_stat);
1082
+ ASSERT_EQ((unsigned int)kDataSize, f_stat.st_size);
1083
+ // verify that preallocated blocks were deallocated on file close
1084
+ // Because the FS might give us more blocks, we add a full page to the size
1085
+ // and expect the number of blocks to be less or equal to that.
1086
+ ASSERT_GE((f_stat.st_size + kPageSize + kBlockSize - 1) / kBlockSize,
1087
+ (unsigned int)f_stat.st_blocks);
1088
+ }
1089
+ }
1090
+ #endif // ROCKSDB_FALLOCATE_PRESENT
1091
+
1092
+ // Returns true if any of the strings in ss are the prefix of another string.
1093
+ bool HasPrefix(const std::unordered_set<std::string>& ss) {
1094
+ for (const std::string& s: ss) {
1095
+ if (s.empty()) {
1096
+ return true;
1097
+ }
1098
+ for (size_t i = 1; i < s.size(); ++i) {
1099
+ if (ss.count(s.substr(0, i)) != 0) {
1100
+ return true;
1101
+ }
1102
+ }
1103
+ }
1104
+ return false;
1105
+ }
1106
+
1107
+ // `GetUniqueId()` temporarily returns zero on Windows. `BlockBasedTable` can
1108
+ // handle a return value of zero but this test case cannot.
1109
+ #ifndef OS_WIN
1110
+ TEST_P(EnvPosixTestWithParam, RandomAccessUniqueIDConcurrent) {
1111
+ if (env_ == Env::Default()) {
1112
+ // Check whether a bunch of concurrently existing files have unique IDs.
1113
+ EnvOptions soptions;
1114
+ soptions.use_direct_reads = soptions.use_direct_writes = direct_io_;
1115
+
1116
+ // Create the files
1117
+ IoctlFriendlyTmpdir ift;
1118
+ std::vector<std::string> fnames;
1119
+ for (int i = 0; i < 1000; ++i) {
1120
+ fnames.push_back(ift.name() + "/" + "testfile" + ToString(i));
1121
+
1122
+ // Create file.
1123
+ std::unique_ptr<WritableFile> wfile;
1124
+ ASSERT_OK(env_->NewWritableFile(fnames[i], &wfile, soptions));
1125
+ }
1126
+
1127
+ // Collect and check whether the IDs are unique.
1128
+ std::unordered_set<std::string> ids;
1129
+ for (const std::string& fname : fnames) {
1130
+ std::unique_ptr<RandomAccessFile> file;
1131
+ std::string unique_id;
1132
+ ASSERT_OK(env_->NewRandomAccessFile(fname, &file, soptions));
1133
+ size_t id_size = file->GetUniqueId(temp_id, MAX_ID_SIZE);
1134
+ ASSERT_TRUE(id_size > 0);
1135
+ unique_id = std::string(temp_id, id_size);
1136
+ ASSERT_TRUE(IsUniqueIDValid(unique_id));
1137
+
1138
+ ASSERT_TRUE(ids.count(unique_id) == 0);
1139
+ ids.insert(unique_id);
1140
+ }
1141
+
1142
+ // Delete the files
1143
+ for (const std::string& fname : fnames) {
1144
+ ASSERT_OK(env_->DeleteFile(fname));
1145
+ }
1146
+
1147
+ ASSERT_TRUE(!HasPrefix(ids));
1148
+ }
1149
+ }
1150
+
1151
+ // TODO: Disable the flaky test, it's a known issue that ext4 may return same
1152
+ // key after file deletion. The issue is tracked in #7405, #7470.
1153
+ TEST_P(EnvPosixTestWithParam, DISABLED_RandomAccessUniqueIDDeletes) {
1154
+ if (env_ == Env::Default()) {
1155
+ EnvOptions soptions;
1156
+ soptions.use_direct_reads = soptions.use_direct_writes = direct_io_;
1157
+
1158
+ IoctlFriendlyTmpdir ift;
1159
+ std::string fname = ift.name() + "/" + "testfile";
1160
+
1161
+ // Check that after file is deleted we don't get same ID again in a new
1162
+ // file.
1163
+ std::unordered_set<std::string> ids;
1164
+ for (int i = 0; i < 1000; ++i) {
1165
+ // Create file.
1166
+ {
1167
+ std::unique_ptr<WritableFile> wfile;
1168
+ ASSERT_OK(env_->NewWritableFile(fname, &wfile, soptions));
1169
+ }
1170
+
1171
+ // Get Unique ID
1172
+ std::string unique_id;
1173
+ {
1174
+ std::unique_ptr<RandomAccessFile> file;
1175
+ ASSERT_OK(env_->NewRandomAccessFile(fname, &file, soptions));
1176
+ size_t id_size = file->GetUniqueId(temp_id, MAX_ID_SIZE);
1177
+ ASSERT_TRUE(id_size > 0);
1178
+ unique_id = std::string(temp_id, id_size);
1179
+ }
1180
+
1181
+ ASSERT_TRUE(IsUniqueIDValid(unique_id));
1182
+ ASSERT_TRUE(ids.count(unique_id) == 0);
1183
+ ids.insert(unique_id);
1184
+
1185
+ // Delete the file
1186
+ ASSERT_OK(env_->DeleteFile(fname));
1187
+ }
1188
+
1189
+ ASSERT_TRUE(!HasPrefix(ids));
1190
+ }
1191
+ }
1192
+ #endif // !defined(OS_WIN)
1193
+
1194
+ TEST_P(EnvPosixTestWithParam, MultiRead) {
1195
+ EnvOptions soptions;
1196
+ soptions.use_direct_reads = soptions.use_direct_writes = direct_io_;
1197
+ std::string fname = test::PerThreadDBPath(env_, "testfile");
1198
+
1199
+ const size_t kSectorSize = 4096;
1200
+ const size_t kNumSectors = 8;
1201
+
1202
+ // Create file.
1203
+ {
1204
+ std::unique_ptr<WritableFile> wfile;
1205
+ #if !defined(OS_MACOSX) && !defined(OS_WIN) && !defined(OS_SOLARIS) && \
1206
+ !defined(OS_AIX)
1207
+ if (soptions.use_direct_writes) {
1208
+ soptions.use_direct_writes = false;
1209
+ }
1210
+ #endif
1211
+ ASSERT_OK(env_->NewWritableFile(fname, &wfile, soptions));
1212
+ for (size_t i = 0; i < kNumSectors; ++i) {
1213
+ auto data = NewAligned(kSectorSize * 8, static_cast<char>(i + 1));
1214
+ Slice slice(data.get(), kSectorSize);
1215
+ ASSERT_OK(wfile->Append(slice));
1216
+ }
1217
+ ASSERT_OK(wfile->Close());
1218
+ }
1219
+
1220
+ // More attempts to simulate more partial result sequences.
1221
+ for (uint32_t attempt = 0; attempt < 20; attempt++) {
1222
+ // Random Read
1223
+ Random rnd(301 + attempt);
1224
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
1225
+ "PosixRandomAccessFile::MultiRead:io_uring_result", [&](void* arg) {
1226
+ if (attempt > 0) {
1227
+ // No failure in the first attempt.
1228
+ size_t& bytes_read = *static_cast<size_t*>(arg);
1229
+ if (rnd.OneIn(4)) {
1230
+ bytes_read = 0;
1231
+ } else if (rnd.OneIn(3)) {
1232
+ bytes_read = static_cast<size_t>(
1233
+ rnd.Uniform(static_cast<int>(bytes_read)));
1234
+ }
1235
+ }
1236
+ });
1237
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
1238
+
1239
+ std::unique_ptr<RandomAccessFile> file;
1240
+ std::vector<ReadRequest> reqs(3);
1241
+ std::vector<std::unique_ptr<char, Deleter>> data;
1242
+ uint64_t offset = 0;
1243
+ for (size_t i = 0; i < reqs.size(); ++i) {
1244
+ reqs[i].offset = offset;
1245
+ offset += 2 * kSectorSize;
1246
+ reqs[i].len = kSectorSize;
1247
+ data.emplace_back(NewAligned(kSectorSize, 0));
1248
+ reqs[i].scratch = data.back().get();
1249
+ }
1250
+ #if !defined(OS_MACOSX) && !defined(OS_WIN) && !defined(OS_SOLARIS) && \
1251
+ !defined(OS_AIX)
1252
+ if (soptions.use_direct_reads) {
1253
+ soptions.use_direct_reads = false;
1254
+ }
1255
+ #endif
1256
+ ASSERT_OK(env_->NewRandomAccessFile(fname, &file, soptions));
1257
+ ASSERT_OK(file->MultiRead(reqs.data(), reqs.size()));
1258
+ for (size_t i = 0; i < reqs.size(); ++i) {
1259
+ auto buf = NewAligned(kSectorSize * 8, static_cast<char>(i * 2 + 1));
1260
+ ASSERT_OK(reqs[i].status);
1261
+ ASSERT_EQ(memcmp(reqs[i].scratch, buf.get(), kSectorSize), 0);
1262
+ }
1263
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
1264
+ }
1265
+ }
1266
+
1267
+ TEST_F(EnvPosixTest, MultiReadNonAlignedLargeNum) {
1268
+ // In this test we don't do aligned read, wo it doesn't work for
1269
+ // direct I/O case.
1270
+ EnvOptions soptions;
1271
+ soptions.use_direct_reads = soptions.use_direct_writes = false;
1272
+ std::string fname = test::PerThreadDBPath(env_, "testfile");
1273
+
1274
+ const size_t kTotalSize = 81920;
1275
+ Random rnd(301);
1276
+ std::string expected_data = rnd.RandomString(kTotalSize);
1277
+
1278
+ // Create file.
1279
+ {
1280
+ std::unique_ptr<WritableFile> wfile;
1281
+ ASSERT_OK(env_->NewWritableFile(fname, &wfile, soptions));
1282
+ ASSERT_OK(wfile->Append(expected_data));
1283
+ ASSERT_OK(wfile->Close());
1284
+ }
1285
+
1286
+ // More attempts to simulate more partial result sequences.
1287
+ for (uint32_t attempt = 0; attempt < 25; attempt++) {
1288
+ // Right now kIoUringDepth is hard coded as 256, so we need very large
1289
+ // number of keys to cover the case of multiple rounds of submissions.
1290
+ // Right now the test latency is still acceptable. If it ends up with
1291
+ // too long, we can modify the io uring depth with SyncPoint here.
1292
+ const int num_reads = rnd.Uniform(512) + 1;
1293
+
1294
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
1295
+ "PosixRandomAccessFile::MultiRead:io_uring_result", [&](void* arg) {
1296
+ if (attempt > 5) {
1297
+ // Improve partial result rates in second half of the run to
1298
+ // cover the case of repeated partial results.
1299
+ int odd = (attempt < 15) ? num_reads / 2 : 4;
1300
+ // No failure in first several attempts.
1301
+ size_t& bytes_read = *static_cast<size_t*>(arg);
1302
+ if (rnd.OneIn(odd)) {
1303
+ bytes_read = 0;
1304
+ } else if (rnd.OneIn(odd / 2)) {
1305
+ bytes_read = static_cast<size_t>(
1306
+ rnd.Uniform(static_cast<int>(bytes_read)));
1307
+ }
1308
+ }
1309
+ });
1310
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
1311
+
1312
+ // Generate (offset, len) pairs
1313
+ std::set<int> start_offsets;
1314
+ for (int i = 0; i < num_reads; i++) {
1315
+ int rnd_off;
1316
+ // No repeat offsets.
1317
+ while (start_offsets.find(rnd_off = rnd.Uniform(81920)) != start_offsets.end()) {}
1318
+ start_offsets.insert(rnd_off);
1319
+ }
1320
+ std::vector<size_t> offsets;
1321
+ std::vector<size_t> lens;
1322
+ // std::set already sorted the offsets.
1323
+ for (int so: start_offsets) {
1324
+ offsets.push_back(so);
1325
+ }
1326
+ for (size_t i = 0; i + 1 < offsets.size(); i++) {
1327
+ lens.push_back(static_cast<size_t>(rnd.Uniform(static_cast<int>(offsets[i + 1] - offsets[i])) + 1));
1328
+ }
1329
+ lens.push_back(static_cast<size_t>(rnd.Uniform(static_cast<int>(kTotalSize - offsets.back())) + 1));
1330
+ ASSERT_EQ(num_reads, lens.size());
1331
+
1332
+ // Create requests
1333
+ std::vector<std::string> scratches;
1334
+ scratches.reserve(num_reads);
1335
+ std::vector<ReadRequest> reqs(num_reads);
1336
+ for (size_t i = 0; i < reqs.size(); ++i) {
1337
+ reqs[i].offset = offsets[i];
1338
+ reqs[i].len = lens[i];
1339
+ scratches.emplace_back(reqs[i].len, ' ');
1340
+ reqs[i].scratch = const_cast<char*>(scratches.back().data());
1341
+ }
1342
+
1343
+ // Query the data
1344
+ std::unique_ptr<RandomAccessFile> file;
1345
+ ASSERT_OK(env_->NewRandomAccessFile(fname, &file, soptions));
1346
+ ASSERT_OK(file->MultiRead(reqs.data(), reqs.size()));
1347
+
1348
+ // Validate results
1349
+ for (int i = 0; i < num_reads; ++i) {
1350
+ ASSERT_OK(reqs[i].status);
1351
+ ASSERT_EQ(Slice(expected_data.data() + offsets[i], lens[i]).ToString(true),
1352
+ reqs[i].result.ToString(true));
1353
+ }
1354
+
1355
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
1356
+ }
1357
+ }
1358
+
1359
+ // Only works in linux platforms
1360
+ #ifdef OS_WIN
1361
+ TEST_P(EnvPosixTestWithParam, DISABLED_InvalidateCache) {
1362
+ #else
1363
+ TEST_P(EnvPosixTestWithParam, InvalidateCache) {
1364
+ #endif
1365
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
1366
+ EnvOptions soptions;
1367
+ soptions.use_direct_reads = soptions.use_direct_writes = direct_io_;
1368
+ std::string fname = test::PerThreadDBPath(env_, "testfile");
1369
+
1370
+ const size_t kSectorSize = 512;
1371
+ auto data = NewAligned(kSectorSize, 0);
1372
+ Slice slice(data.get(), kSectorSize);
1373
+
1374
+ // Create file.
1375
+ {
1376
+ std::unique_ptr<WritableFile> wfile;
1377
+ #if !defined(OS_MACOSX) && !defined(OS_WIN) && !defined(OS_SOLARIS) && !defined(OS_AIX)
1378
+ if (soptions.use_direct_writes) {
1379
+ soptions.use_direct_writes = false;
1380
+ }
1381
+ #endif
1382
+ ASSERT_OK(env_->NewWritableFile(fname, &wfile, soptions));
1383
+ ASSERT_OK(wfile->Append(slice));
1384
+ ASSERT_OK(wfile->InvalidateCache(0, 0));
1385
+ ASSERT_OK(wfile->Close());
1386
+ }
1387
+
1388
+ // Random Read
1389
+ {
1390
+ std::unique_ptr<RandomAccessFile> file;
1391
+ auto scratch = NewAligned(kSectorSize, 0);
1392
+ Slice result;
1393
+ #if !defined(OS_MACOSX) && !defined(OS_WIN) && !defined(OS_SOLARIS) && !defined(OS_AIX)
1394
+ if (soptions.use_direct_reads) {
1395
+ soptions.use_direct_reads = false;
1396
+ }
1397
+ #endif
1398
+ ASSERT_OK(env_->NewRandomAccessFile(fname, &file, soptions));
1399
+ ASSERT_OK(file->Read(0, kSectorSize, &result, scratch.get()));
1400
+ ASSERT_EQ(memcmp(scratch.get(), data.get(), kSectorSize), 0);
1401
+ ASSERT_OK(file->InvalidateCache(0, 11));
1402
+ ASSERT_OK(file->InvalidateCache(0, 0));
1403
+ }
1404
+
1405
+ // Sequential Read
1406
+ {
1407
+ std::unique_ptr<SequentialFile> file;
1408
+ auto scratch = NewAligned(kSectorSize, 0);
1409
+ Slice result;
1410
+ #if !defined(OS_MACOSX) && !defined(OS_WIN) && !defined(OS_SOLARIS) && !defined(OS_AIX)
1411
+ if (soptions.use_direct_reads) {
1412
+ soptions.use_direct_reads = false;
1413
+ }
1414
+ #endif
1415
+ ASSERT_OK(env_->NewSequentialFile(fname, &file, soptions));
1416
+ if (file->use_direct_io()) {
1417
+ ASSERT_OK(file->PositionedRead(0, kSectorSize, &result, scratch.get()));
1418
+ } else {
1419
+ ASSERT_OK(file->Read(kSectorSize, &result, scratch.get()));
1420
+ }
1421
+ ASSERT_EQ(memcmp(scratch.get(), data.get(), kSectorSize), 0);
1422
+ ASSERT_OK(file->InvalidateCache(0, 11));
1423
+ ASSERT_OK(file->InvalidateCache(0, 0));
1424
+ }
1425
+ // Delete the file
1426
+ ASSERT_OK(env_->DeleteFile(fname));
1427
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->ClearTrace();
1428
+ }
1429
+ #endif // not TRAVIS
1430
+ #endif // OS_LINUX || OS_WIN
1431
+
1432
+ class TestLogger : public Logger {
1433
+ public:
1434
+ using Logger::Logv;
1435
+ void Logv(const char* format, va_list ap) override {
1436
+ log_count++;
1437
+
1438
+ char new_format[550];
1439
+ std::fill_n(new_format, sizeof(new_format), '2');
1440
+ {
1441
+ va_list backup_ap;
1442
+ va_copy(backup_ap, ap);
1443
+ int n = vsnprintf(new_format, sizeof(new_format) - 1, format, backup_ap);
1444
+ // 48 bytes for extra information + bytes allocated
1445
+
1446
+ // When we have n == -1 there is not a terminating zero expected
1447
+ #ifdef OS_WIN
1448
+ if (n < 0) {
1449
+ char_0_count++;
1450
+ }
1451
+ #endif
1452
+
1453
+ if (new_format[0] == '[') {
1454
+ // "[DEBUG] "
1455
+ ASSERT_TRUE(n <= 56 + (512 - static_cast<int>(sizeof(struct timeval))));
1456
+ } else {
1457
+ ASSERT_TRUE(n <= 48 + (512 - static_cast<int>(sizeof(struct timeval))));
1458
+ }
1459
+ va_end(backup_ap);
1460
+ }
1461
+
1462
+ for (size_t i = 0; i < sizeof(new_format); i++) {
1463
+ if (new_format[i] == 'x') {
1464
+ char_x_count++;
1465
+ } else if (new_format[i] == '\0') {
1466
+ char_0_count++;
1467
+ }
1468
+ }
1469
+ }
1470
+ int log_count;
1471
+ int char_x_count;
1472
+ int char_0_count;
1473
+ };
1474
+
1475
+ TEST_P(EnvPosixTestWithParam, LogBufferTest) {
1476
+ TestLogger test_logger;
1477
+ test_logger.SetInfoLogLevel(InfoLogLevel::INFO_LEVEL);
1478
+ test_logger.log_count = 0;
1479
+ test_logger.char_x_count = 0;
1480
+ test_logger.char_0_count = 0;
1481
+ LogBuffer log_buffer(InfoLogLevel::INFO_LEVEL, &test_logger);
1482
+ LogBuffer log_buffer_debug(DEBUG_LEVEL, &test_logger);
1483
+
1484
+ char bytes200[200];
1485
+ std::fill_n(bytes200, sizeof(bytes200), '1');
1486
+ bytes200[sizeof(bytes200) - 1] = '\0';
1487
+ char bytes600[600];
1488
+ std::fill_n(bytes600, sizeof(bytes600), '1');
1489
+ bytes600[sizeof(bytes600) - 1] = '\0';
1490
+ char bytes9000[9000];
1491
+ std::fill_n(bytes9000, sizeof(bytes9000), '1');
1492
+ bytes9000[sizeof(bytes9000) - 1] = '\0';
1493
+
1494
+ ROCKS_LOG_BUFFER(&log_buffer, "x%sx", bytes200);
1495
+ ROCKS_LOG_BUFFER(&log_buffer, "x%sx", bytes600);
1496
+ ROCKS_LOG_BUFFER(&log_buffer, "x%sx%sx%sx", bytes200, bytes200, bytes200);
1497
+ ROCKS_LOG_BUFFER(&log_buffer, "x%sx%sx", bytes200, bytes600);
1498
+ ROCKS_LOG_BUFFER(&log_buffer, "x%sx%sx", bytes600, bytes9000);
1499
+
1500
+ ROCKS_LOG_BUFFER(&log_buffer_debug, "x%sx", bytes200);
1501
+ test_logger.SetInfoLogLevel(DEBUG_LEVEL);
1502
+ ROCKS_LOG_BUFFER(&log_buffer_debug, "x%sx%sx%sx", bytes600, bytes9000,
1503
+ bytes200);
1504
+
1505
+ ASSERT_EQ(0, test_logger.log_count);
1506
+ log_buffer.FlushBufferToLog();
1507
+ log_buffer_debug.FlushBufferToLog();
1508
+ ASSERT_EQ(6, test_logger.log_count);
1509
+ ASSERT_EQ(6, test_logger.char_0_count);
1510
+ ASSERT_EQ(10, test_logger.char_x_count);
1511
+ }
1512
+
1513
+ class TestLogger2 : public Logger {
1514
+ public:
1515
+ explicit TestLogger2(size_t max_log_size) : max_log_size_(max_log_size) {}
1516
+ using Logger::Logv;
1517
+ void Logv(const char* format, va_list ap) override {
1518
+ char new_format[2000];
1519
+ std::fill_n(new_format, sizeof(new_format), '2');
1520
+ {
1521
+ va_list backup_ap;
1522
+ va_copy(backup_ap, ap);
1523
+ int n = vsnprintf(new_format, sizeof(new_format) - 1, format, backup_ap);
1524
+ // 48 bytes for extra information + bytes allocated
1525
+ ASSERT_TRUE(
1526
+ n <= 48 + static_cast<int>(max_log_size_ - sizeof(struct timeval)));
1527
+ ASSERT_TRUE(n > static_cast<int>(max_log_size_ - sizeof(struct timeval)));
1528
+ va_end(backup_ap);
1529
+ }
1530
+ }
1531
+ size_t max_log_size_;
1532
+ };
1533
+
1534
+ TEST_P(EnvPosixTestWithParam, LogBufferMaxSizeTest) {
1535
+ char bytes9000[9000];
1536
+ std::fill_n(bytes9000, sizeof(bytes9000), '1');
1537
+ bytes9000[sizeof(bytes9000) - 1] = '\0';
1538
+
1539
+ for (size_t max_log_size = 256; max_log_size <= 1024;
1540
+ max_log_size += 1024 - 256) {
1541
+ TestLogger2 test_logger(max_log_size);
1542
+ test_logger.SetInfoLogLevel(InfoLogLevel::INFO_LEVEL);
1543
+ LogBuffer log_buffer(InfoLogLevel::INFO_LEVEL, &test_logger);
1544
+ ROCKS_LOG_BUFFER_MAX_SZ(&log_buffer, max_log_size, "%s", bytes9000);
1545
+ log_buffer.FlushBufferToLog();
1546
+ }
1547
+ }
1548
+
1549
+ TEST_P(EnvPosixTestWithParam, Preallocation) {
1550
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
1551
+ const std::string src = test::PerThreadDBPath(env_, "testfile");
1552
+ std::unique_ptr<WritableFile> srcfile;
1553
+ EnvOptions soptions;
1554
+ soptions.use_direct_reads = soptions.use_direct_writes = direct_io_;
1555
+ #if !defined(OS_MACOSX) && !defined(OS_WIN) && !defined(OS_SOLARIS) && !defined(OS_AIX) && !defined(OS_OPENBSD) && !defined(OS_FREEBSD)
1556
+ if (soptions.use_direct_writes) {
1557
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
1558
+ "NewWritableFile:O_DIRECT", [&](void* arg) {
1559
+ int* val = static_cast<int*>(arg);
1560
+ *val &= ~O_DIRECT;
1561
+ });
1562
+ }
1563
+ #endif
1564
+ ASSERT_OK(env_->NewWritableFile(src, &srcfile, soptions));
1565
+ srcfile->SetPreallocationBlockSize(1024 * 1024);
1566
+
1567
+ // No writes should mean no preallocation
1568
+ size_t block_size, last_allocated_block;
1569
+ srcfile->GetPreallocationStatus(&block_size, &last_allocated_block);
1570
+ ASSERT_EQ(last_allocated_block, 0UL);
1571
+
1572
+ // Small write should preallocate one block
1573
+ size_t kStrSize = 4096;
1574
+ auto data = NewAligned(kStrSize, 'A');
1575
+ Slice str(data.get(), kStrSize);
1576
+ srcfile->PrepareWrite(srcfile->GetFileSize(), kStrSize);
1577
+ ASSERT_OK(srcfile->Append(str));
1578
+ srcfile->GetPreallocationStatus(&block_size, &last_allocated_block);
1579
+ ASSERT_EQ(last_allocated_block, 1UL);
1580
+
1581
+ // Write an entire preallocation block, make sure we increased by two.
1582
+ {
1583
+ auto buf_ptr = NewAligned(block_size, ' ');
1584
+ Slice buf(buf_ptr.get(), block_size);
1585
+ srcfile->PrepareWrite(srcfile->GetFileSize(), block_size);
1586
+ ASSERT_OK(srcfile->Append(buf));
1587
+ srcfile->GetPreallocationStatus(&block_size, &last_allocated_block);
1588
+ ASSERT_EQ(last_allocated_block, 2UL);
1589
+ }
1590
+
1591
+ // Write five more blocks at once, ensure we're where we need to be.
1592
+ {
1593
+ auto buf_ptr = NewAligned(block_size * 5, ' ');
1594
+ Slice buf = Slice(buf_ptr.get(), block_size * 5);
1595
+ srcfile->PrepareWrite(srcfile->GetFileSize(), buf.size());
1596
+ ASSERT_OK(srcfile->Append(buf));
1597
+ srcfile->GetPreallocationStatus(&block_size, &last_allocated_block);
1598
+ ASSERT_EQ(last_allocated_block, 7UL);
1599
+ }
1600
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->ClearTrace();
1601
+ }
1602
+
1603
+ // Test that the two ways to get children file attributes (in bulk or
1604
+ // individually) behave consistently.
1605
+ TEST_P(EnvPosixTestWithParam, ConsistentChildrenAttributes) {
1606
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
1607
+ EnvOptions soptions;
1608
+ soptions.use_direct_reads = soptions.use_direct_writes = direct_io_;
1609
+ const int kNumChildren = 10;
1610
+
1611
+ std::string data;
1612
+ std::string test_base_dir = test::PerThreadDBPath(env_, "env_test_chr_attr");
1613
+ env_->CreateDir(test_base_dir).PermitUncheckedError();
1614
+ for (int i = 0; i < kNumChildren; ++i) {
1615
+ const std::string path = test_base_dir + "/testfile_" + std::to_string(i);
1616
+ std::unique_ptr<WritableFile> file;
1617
+ #if !defined(OS_MACOSX) && !defined(OS_WIN) && !defined(OS_SOLARIS) && !defined(OS_AIX) && !defined(OS_OPENBSD) && !defined(OS_FREEBSD)
1618
+ if (soptions.use_direct_writes) {
1619
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
1620
+ "NewWritableFile:O_DIRECT", [&](void* arg) {
1621
+ int* val = static_cast<int*>(arg);
1622
+ *val &= ~O_DIRECT;
1623
+ });
1624
+ }
1625
+ #endif
1626
+ ASSERT_OK(env_->NewWritableFile(path, &file, soptions));
1627
+ auto buf_ptr = NewAligned(data.size(), 'T');
1628
+ Slice buf(buf_ptr.get(), data.size());
1629
+ ASSERT_OK(file->Append(buf));
1630
+ data.append(std::string(4096, 'T'));
1631
+ }
1632
+
1633
+ std::vector<Env::FileAttributes> file_attrs;
1634
+ ASSERT_OK(env_->GetChildrenFileAttributes(test_base_dir, &file_attrs));
1635
+ for (int i = 0; i < kNumChildren; ++i) {
1636
+ const std::string name = "testfile_" + std::to_string(i);
1637
+ const std::string path = test_base_dir + "/" + name;
1638
+
1639
+ auto file_attrs_iter = std::find_if(
1640
+ file_attrs.begin(), file_attrs.end(),
1641
+ [&name](const Env::FileAttributes& fm) { return fm.name == name; });
1642
+ ASSERT_TRUE(file_attrs_iter != file_attrs.end());
1643
+ uint64_t size;
1644
+ ASSERT_OK(env_->GetFileSize(path, &size));
1645
+ ASSERT_EQ(size, 4096 * i);
1646
+ ASSERT_EQ(size, file_attrs_iter->size_bytes);
1647
+ }
1648
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->ClearTrace();
1649
+ }
1650
+
1651
+ // Test that all WritableFileWrapper forwards all calls to WritableFile.
1652
+ TEST_P(EnvPosixTestWithParam, WritableFileWrapper) {
1653
+ class Base : public WritableFile {
1654
+ public:
1655
+ mutable int *step_;
1656
+
1657
+ void inc(int x) const {
1658
+ EXPECT_EQ(x, (*step_)++);
1659
+ }
1660
+
1661
+ explicit Base(int* step) : step_(step) {
1662
+ inc(0);
1663
+ }
1664
+
1665
+ Status Append(const Slice& /*data*/) override {
1666
+ inc(1);
1667
+ return Status::OK();
1668
+ }
1669
+
1670
+ Status PositionedAppend(const Slice& /*data*/,
1671
+ uint64_t /*offset*/) override {
1672
+ inc(2);
1673
+ return Status::OK();
1674
+ }
1675
+
1676
+ Status Truncate(uint64_t /*size*/) override {
1677
+ inc(3);
1678
+ return Status::OK();
1679
+ }
1680
+
1681
+ Status Close() override {
1682
+ inc(4);
1683
+ return Status::OK();
1684
+ }
1685
+
1686
+ Status Flush() override {
1687
+ inc(5);
1688
+ return Status::OK();
1689
+ }
1690
+
1691
+ Status Sync() override {
1692
+ inc(6);
1693
+ return Status::OK();
1694
+ }
1695
+
1696
+ Status Fsync() override {
1697
+ inc(7);
1698
+ return Status::OK();
1699
+ }
1700
+
1701
+ bool IsSyncThreadSafe() const override {
1702
+ inc(8);
1703
+ return true;
1704
+ }
1705
+
1706
+ bool use_direct_io() const override {
1707
+ inc(9);
1708
+ return true;
1709
+ }
1710
+
1711
+ size_t GetRequiredBufferAlignment() const override {
1712
+ inc(10);
1713
+ return 0;
1714
+ }
1715
+
1716
+ void SetIOPriority(Env::IOPriority /*pri*/) override { inc(11); }
1717
+
1718
+ Env::IOPriority GetIOPriority() override {
1719
+ inc(12);
1720
+ return Env::IOPriority::IO_LOW;
1721
+ }
1722
+
1723
+ void SetWriteLifeTimeHint(Env::WriteLifeTimeHint /*hint*/) override {
1724
+ inc(13);
1725
+ }
1726
+
1727
+ Env::WriteLifeTimeHint GetWriteLifeTimeHint() override {
1728
+ inc(14);
1729
+ return Env::WriteLifeTimeHint::WLTH_NOT_SET;
1730
+ }
1731
+
1732
+ uint64_t GetFileSize() override {
1733
+ inc(15);
1734
+ return 0;
1735
+ }
1736
+
1737
+ void SetPreallocationBlockSize(size_t /*size*/) override { inc(16); }
1738
+
1739
+ void GetPreallocationStatus(size_t* /*block_size*/,
1740
+ size_t* /*last_allocated_block*/) override {
1741
+ inc(17);
1742
+ }
1743
+
1744
+ size_t GetUniqueId(char* /*id*/, size_t /*max_size*/) const override {
1745
+ inc(18);
1746
+ return 0;
1747
+ }
1748
+
1749
+ Status InvalidateCache(size_t /*offset*/, size_t /*length*/) override {
1750
+ inc(19);
1751
+ return Status::OK();
1752
+ }
1753
+
1754
+ Status RangeSync(uint64_t /*offset*/, uint64_t /*nbytes*/) override {
1755
+ inc(20);
1756
+ return Status::OK();
1757
+ }
1758
+
1759
+ void PrepareWrite(size_t /*offset*/, size_t /*len*/) override { inc(21); }
1760
+
1761
+ Status Allocate(uint64_t /*offset*/, uint64_t /*len*/) override {
1762
+ inc(22);
1763
+ return Status::OK();
1764
+ }
1765
+
1766
+ public:
1767
+ ~Base() override { inc(23); }
1768
+ };
1769
+
1770
+ class Wrapper : public WritableFileWrapper {
1771
+ public:
1772
+ explicit Wrapper(WritableFile* target) : WritableFileWrapper(target) {}
1773
+ };
1774
+
1775
+ int step = 0;
1776
+
1777
+ {
1778
+ Base b(&step);
1779
+ Wrapper w(&b);
1780
+ ASSERT_OK(w.Append(Slice()));
1781
+ ASSERT_OK(w.PositionedAppend(Slice(), 0));
1782
+ ASSERT_OK(w.Truncate(0));
1783
+ ASSERT_OK(w.Close());
1784
+ ASSERT_OK(w.Flush());
1785
+ ASSERT_OK(w.Sync());
1786
+ ASSERT_OK(w.Fsync());
1787
+ w.IsSyncThreadSafe();
1788
+ w.use_direct_io();
1789
+ w.GetRequiredBufferAlignment();
1790
+ w.SetIOPriority(Env::IOPriority::IO_HIGH);
1791
+ w.GetIOPriority();
1792
+ w.SetWriteLifeTimeHint(Env::WriteLifeTimeHint::WLTH_NOT_SET);
1793
+ w.GetWriteLifeTimeHint();
1794
+ w.GetFileSize();
1795
+ w.SetPreallocationBlockSize(0);
1796
+ w.GetPreallocationStatus(nullptr, nullptr);
1797
+ w.GetUniqueId(nullptr, 0);
1798
+ ASSERT_OK(w.InvalidateCache(0, 0));
1799
+ ASSERT_OK(w.RangeSync(0, 0));
1800
+ w.PrepareWrite(0, 0);
1801
+ ASSERT_OK(w.Allocate(0, 0));
1802
+ }
1803
+
1804
+ EXPECT_EQ(24, step);
1805
+ }
1806
+
1807
+ TEST_P(EnvPosixTestWithParam, PosixRandomRWFile) {
1808
+ const std::string path = test::PerThreadDBPath(env_, "random_rw_file");
1809
+
1810
+ env_->DeleteFile(path).PermitUncheckedError();
1811
+
1812
+ std::unique_ptr<RandomRWFile> file;
1813
+
1814
+ // Cannot open non-existing file.
1815
+ ASSERT_NOK(env_->NewRandomRWFile(path, &file, EnvOptions()));
1816
+
1817
+ // Create the file using WriteableFile
1818
+ {
1819
+ std::unique_ptr<WritableFile> wf;
1820
+ ASSERT_OK(env_->NewWritableFile(path, &wf, EnvOptions()));
1821
+ }
1822
+
1823
+ ASSERT_OK(env_->NewRandomRWFile(path, &file, EnvOptions()));
1824
+
1825
+ char buf[10000];
1826
+ Slice read_res;
1827
+
1828
+ ASSERT_OK(file->Write(0, "ABCD"));
1829
+ ASSERT_OK(file->Read(0, 10, &read_res, buf));
1830
+ ASSERT_EQ(read_res.ToString(), "ABCD");
1831
+
1832
+ ASSERT_OK(file->Write(2, "XXXX"));
1833
+ ASSERT_OK(file->Read(0, 10, &read_res, buf));
1834
+ ASSERT_EQ(read_res.ToString(), "ABXXXX");
1835
+
1836
+ ASSERT_OK(file->Write(10, "ZZZ"));
1837
+ ASSERT_OK(file->Read(10, 10, &read_res, buf));
1838
+ ASSERT_EQ(read_res.ToString(), "ZZZ");
1839
+
1840
+ ASSERT_OK(file->Write(11, "Y"));
1841
+ ASSERT_OK(file->Read(10, 10, &read_res, buf));
1842
+ ASSERT_EQ(read_res.ToString(), "ZYZ");
1843
+
1844
+ ASSERT_OK(file->Write(200, "FFFFF"));
1845
+ ASSERT_OK(file->Read(200, 10, &read_res, buf));
1846
+ ASSERT_EQ(read_res.ToString(), "FFFFF");
1847
+
1848
+ ASSERT_OK(file->Write(205, "XXXX"));
1849
+ ASSERT_OK(file->Read(200, 10, &read_res, buf));
1850
+ ASSERT_EQ(read_res.ToString(), "FFFFFXXXX");
1851
+
1852
+ ASSERT_OK(file->Write(5, "QQQQ"));
1853
+ ASSERT_OK(file->Read(0, 9, &read_res, buf));
1854
+ ASSERT_EQ(read_res.ToString(), "ABXXXQQQQ");
1855
+
1856
+ ASSERT_OK(file->Read(2, 4, &read_res, buf));
1857
+ ASSERT_EQ(read_res.ToString(), "XXXQ");
1858
+
1859
+ // Close file and reopen it
1860
+ ASSERT_OK(file->Close());
1861
+ ASSERT_OK(env_->NewRandomRWFile(path, &file, EnvOptions()));
1862
+
1863
+ ASSERT_OK(file->Read(0, 9, &read_res, buf));
1864
+ ASSERT_EQ(read_res.ToString(), "ABXXXQQQQ");
1865
+
1866
+ ASSERT_OK(file->Read(10, 3, &read_res, buf));
1867
+ ASSERT_EQ(read_res.ToString(), "ZYZ");
1868
+
1869
+ ASSERT_OK(file->Read(200, 9, &read_res, buf));
1870
+ ASSERT_EQ(read_res.ToString(), "FFFFFXXXX");
1871
+
1872
+ ASSERT_OK(file->Write(4, "TTTTTTTTTTTTTTTT"));
1873
+ ASSERT_OK(file->Read(0, 10, &read_res, buf));
1874
+ ASSERT_EQ(read_res.ToString(), "ABXXTTTTTT");
1875
+
1876
+ // Clean up
1877
+ ASSERT_OK(env_->DeleteFile(path));
1878
+ }
1879
+
1880
+ class RandomRWFileWithMirrorString {
1881
+ public:
1882
+ explicit RandomRWFileWithMirrorString(RandomRWFile* _file) : file_(_file) {}
1883
+
1884
+ void Write(size_t offset, const std::string& data) {
1885
+ // Write to mirror string
1886
+ StringWrite(offset, data);
1887
+
1888
+ // Write to file
1889
+ Status s = file_->Write(offset, data);
1890
+ ASSERT_OK(s) << s.ToString();
1891
+ }
1892
+
1893
+ void Read(size_t offset = 0, size_t n = 1000000) {
1894
+ Slice str_res(nullptr, 0);
1895
+ if (offset < file_mirror_.size()) {
1896
+ size_t str_res_sz = std::min(file_mirror_.size() - offset, n);
1897
+ str_res = Slice(file_mirror_.data() + offset, str_res_sz);
1898
+ StopSliceAtNull(&str_res);
1899
+ }
1900
+
1901
+ Slice file_res;
1902
+ Status s = file_->Read(offset, n, &file_res, buf_);
1903
+ ASSERT_OK(s) << s.ToString();
1904
+ StopSliceAtNull(&file_res);
1905
+
1906
+ ASSERT_EQ(str_res.ToString(), file_res.ToString()) << offset << " " << n;
1907
+ }
1908
+
1909
+ void SetFile(RandomRWFile* _file) { file_ = _file; }
1910
+
1911
+ private:
1912
+ void StringWrite(size_t offset, const std::string& src) {
1913
+ if (offset + src.size() > file_mirror_.size()) {
1914
+ file_mirror_.resize(offset + src.size(), '\0');
1915
+ }
1916
+
1917
+ char* pos = const_cast<char*>(file_mirror_.data() + offset);
1918
+ memcpy(pos, src.data(), src.size());
1919
+ }
1920
+
1921
+ void StopSliceAtNull(Slice* slc) {
1922
+ for (size_t i = 0; i < slc->size(); i++) {
1923
+ if ((*slc)[i] == '\0') {
1924
+ *slc = Slice(slc->data(), i);
1925
+ break;
1926
+ }
1927
+ }
1928
+ }
1929
+
1930
+ char buf_[10000];
1931
+ RandomRWFile* file_;
1932
+ std::string file_mirror_;
1933
+ };
1934
+
1935
+ TEST_P(EnvPosixTestWithParam, PosixRandomRWFileRandomized) {
1936
+ const std::string path = test::PerThreadDBPath(env_, "random_rw_file_rand");
1937
+ env_->DeleteFile(path).PermitUncheckedError();
1938
+
1939
+ std::unique_ptr<RandomRWFile> file;
1940
+
1941
+ #ifdef OS_LINUX
1942
+ // Cannot open non-existing file.
1943
+ ASSERT_NOK(env_->NewRandomRWFile(path, &file, EnvOptions()));
1944
+ #endif
1945
+
1946
+ // Create the file using WriteableFile
1947
+ {
1948
+ std::unique_ptr<WritableFile> wf;
1949
+ ASSERT_OK(env_->NewWritableFile(path, &wf, EnvOptions()));
1950
+ }
1951
+
1952
+ ASSERT_OK(env_->NewRandomRWFile(path, &file, EnvOptions()));
1953
+ RandomRWFileWithMirrorString file_with_mirror(file.get());
1954
+
1955
+ Random rnd(301);
1956
+ std::string buf;
1957
+ for (int i = 0; i < 10000; i++) {
1958
+ // Genrate random data
1959
+ buf = rnd.RandomString(10);
1960
+
1961
+ // Pick random offset for write
1962
+ size_t write_off = rnd.Next() % 1000;
1963
+ file_with_mirror.Write(write_off, buf);
1964
+
1965
+ // Pick random offset for read
1966
+ size_t read_off = rnd.Next() % 1000;
1967
+ size_t read_sz = rnd.Next() % 20;
1968
+ file_with_mirror.Read(read_off, read_sz);
1969
+
1970
+ if (i % 500 == 0) {
1971
+ // Reopen the file every 500 iters
1972
+ ASSERT_OK(env_->NewRandomRWFile(path, &file, EnvOptions()));
1973
+ file_with_mirror.SetFile(file.get());
1974
+ }
1975
+ }
1976
+
1977
+ // clean up
1978
+ ASSERT_OK(env_->DeleteFile(path));
1979
+ }
1980
+
1981
+ class TestEnv : public EnvWrapper {
1982
+ public:
1983
+ explicit TestEnv() : EnvWrapper(Env::Default()),
1984
+ close_count(0) { }
1985
+
1986
+ class TestLogger : public Logger {
1987
+ public:
1988
+ using Logger::Logv;
1989
+ TestLogger(TestEnv* env_ptr) : Logger() { env = env_ptr; }
1990
+ ~TestLogger() override {
1991
+ if (!closed_) {
1992
+ Status s = CloseHelper();
1993
+ s.PermitUncheckedError();
1994
+ }
1995
+ }
1996
+ void Logv(const char* /*format*/, va_list /*ap*/) override{};
1997
+
1998
+ protected:
1999
+ Status CloseImpl() override { return CloseHelper(); }
2000
+
2001
+ private:
2002
+ Status CloseHelper() {
2003
+ env->CloseCountInc();;
2004
+ return Status::OK();
2005
+ }
2006
+ TestEnv* env;
2007
+ };
2008
+
2009
+ void CloseCountInc() { close_count++; }
2010
+
2011
+ int GetCloseCount() { return close_count; }
2012
+
2013
+ Status NewLogger(const std::string& /*fname*/,
2014
+ std::shared_ptr<Logger>* result) override {
2015
+ result->reset(new TestLogger(this));
2016
+ return Status::OK();
2017
+ }
2018
+
2019
+ private:
2020
+ int close_count;
2021
+ };
2022
+
2023
+ class EnvTest : public testing::Test {
2024
+ public:
2025
+ EnvTest() : test_directory_(test::PerThreadDBPath("env_test")) {}
2026
+
2027
+ protected:
2028
+ const std::string test_directory_;
2029
+ };
2030
+
2031
+ TEST_F(EnvTest, Close) {
2032
+ TestEnv* env = new TestEnv();
2033
+ std::shared_ptr<Logger> logger;
2034
+ Status s;
2035
+
2036
+ s = env->NewLogger("", &logger);
2037
+ ASSERT_OK(s);
2038
+ ASSERT_OK(logger.get()->Close());
2039
+ ASSERT_EQ(env->GetCloseCount(), 1);
2040
+ // Call Close() again. CloseHelper() should not be called again
2041
+ ASSERT_OK(logger.get()->Close());
2042
+ ASSERT_EQ(env->GetCloseCount(), 1);
2043
+ logger.reset();
2044
+ ASSERT_EQ(env->GetCloseCount(), 1);
2045
+
2046
+ s = env->NewLogger("", &logger);
2047
+ ASSERT_OK(s);
2048
+ logger.reset();
2049
+ ASSERT_EQ(env->GetCloseCount(), 2);
2050
+
2051
+ delete env;
2052
+ }
2053
+
2054
+ class LogvWithInfoLogLevelLogger : public Logger {
2055
+ public:
2056
+ using Logger::Logv;
2057
+ void Logv(const InfoLogLevel /* log_level */, const char* /* format */,
2058
+ va_list /* ap */) override {}
2059
+ };
2060
+
2061
+ TEST_F(EnvTest, LogvWithInfoLogLevel) {
2062
+ // Verifies the log functions work on a `Logger` that only overrides the
2063
+ // `Logv()` overload including `InfoLogLevel`.
2064
+ const std::string kSampleMessage("sample log message");
2065
+ LogvWithInfoLogLevelLogger logger;
2066
+ ROCKS_LOG_HEADER(&logger, "%s", kSampleMessage.c_str());
2067
+ ROCKS_LOG_DEBUG(&logger, "%s", kSampleMessage.c_str());
2068
+ ROCKS_LOG_INFO(&logger, "%s", kSampleMessage.c_str());
2069
+ ROCKS_LOG_WARN(&logger, "%s", kSampleMessage.c_str());
2070
+ ROCKS_LOG_ERROR(&logger, "%s", kSampleMessage.c_str());
2071
+ ROCKS_LOG_FATAL(&logger, "%s", kSampleMessage.c_str());
2072
+ }
2073
+
2074
+ INSTANTIATE_TEST_CASE_P(DefaultEnvWithoutDirectIO, EnvPosixTestWithParam,
2075
+ ::testing::Values(std::pair<Env*, bool>(Env::Default(),
2076
+ false)));
2077
+ #if !defined(ROCKSDB_LITE)
2078
+ INSTANTIATE_TEST_CASE_P(DefaultEnvWithDirectIO, EnvPosixTestWithParam,
2079
+ ::testing::Values(std::pair<Env*, bool>(Env::Default(),
2080
+ true)));
2081
+ #endif // !defined(ROCKSDB_LITE)
2082
+
2083
+ #if !defined(ROCKSDB_LITE) && !defined(OS_WIN)
2084
+ static std::unique_ptr<Env> chroot_env(
2085
+ NewChrootEnv(Env::Default(), test::TmpDir(Env::Default())));
2086
+ INSTANTIATE_TEST_CASE_P(
2087
+ ChrootEnvWithoutDirectIO, EnvPosixTestWithParam,
2088
+ ::testing::Values(std::pair<Env*, bool>(chroot_env.get(), false)));
2089
+ INSTANTIATE_TEST_CASE_P(
2090
+ ChrootEnvWithDirectIO, EnvPosixTestWithParam,
2091
+ ::testing::Values(std::pair<Env*, bool>(chroot_env.get(), true)));
2092
+ #endif // !defined(ROCKSDB_LITE) && !defined(OS_WIN)
2093
+
2094
+ class EnvFSTestWithParam
2095
+ : public ::testing::Test,
2096
+ public ::testing::WithParamInterface<std::tuple<bool, bool, bool>> {
2097
+ public:
2098
+ EnvFSTestWithParam() {
2099
+ bool env_non_null = std::get<0>(GetParam());
2100
+ bool env_default = std::get<1>(GetParam());
2101
+ bool fs_default = std::get<2>(GetParam());
2102
+
2103
+ env_ = env_non_null ? (env_default ? Env::Default() : nullptr) : nullptr;
2104
+ fs_ = fs_default
2105
+ ? FileSystem::Default()
2106
+ : std::make_shared<FaultInjectionTestFS>(FileSystem::Default());
2107
+ if (env_non_null && env_default && !fs_default) {
2108
+ env_ptr_ = NewCompositeEnv(fs_);
2109
+ }
2110
+ if (env_non_null && !env_default && fs_default) {
2111
+ env_ptr_ = std::unique_ptr<Env>(new FaultInjectionTestEnv(Env::Default()));
2112
+ fs_.reset();
2113
+ }
2114
+ if (env_non_null && !env_default && !fs_default) {
2115
+ env_ptr_.reset(new FaultInjectionTestEnv(Env::Default()));
2116
+ composite_env_ptr_.reset(new CompositeEnvWrapper(env_ptr_.get(), fs_));
2117
+ env_ = composite_env_ptr_.get();
2118
+ } else {
2119
+ env_ = env_ptr_.get();
2120
+ }
2121
+
2122
+ dbname1_ = test::PerThreadDBPath("env_fs_test1");
2123
+ dbname2_ = test::PerThreadDBPath("env_fs_test2");
2124
+ }
2125
+
2126
+ ~EnvFSTestWithParam() = default;
2127
+
2128
+ Env* env_;
2129
+ std::unique_ptr<Env> env_ptr_;
2130
+ std::unique_ptr<Env> composite_env_ptr_;
2131
+ std::shared_ptr<FileSystem> fs_;
2132
+ std::string dbname1_;
2133
+ std::string dbname2_;
2134
+ };
2135
+
2136
+ TEST_P(EnvFSTestWithParam, OptionsTest) {
2137
+ Options opts;
2138
+ opts.env = env_;
2139
+ opts.create_if_missing = true;
2140
+ std::string dbname = dbname1_;
2141
+
2142
+ if (env_) {
2143
+ if (fs_) {
2144
+ ASSERT_EQ(fs_.get(), env_->GetFileSystem().get());
2145
+ } else {
2146
+ ASSERT_NE(FileSystem::Default().get(), env_->GetFileSystem().get());
2147
+ }
2148
+ }
2149
+ for (int i = 0; i < 2; ++i) {
2150
+ DB* db;
2151
+ Status s = DB::Open(opts, dbname, &db);
2152
+ ASSERT_OK(s);
2153
+
2154
+ WriteOptions wo;
2155
+ ASSERT_OK(db->Put(wo, "a", "a"));
2156
+ ASSERT_OK(db->Flush(FlushOptions()));
2157
+ ASSERT_OK(db->Put(wo, "b", "b"));
2158
+ ASSERT_OK(db->Flush(FlushOptions()));
2159
+ ASSERT_OK(db->CompactRange(CompactRangeOptions(), nullptr, nullptr));
2160
+
2161
+ std::string val;
2162
+ ASSERT_OK(db->Get(ReadOptions(), "a", &val));
2163
+ ASSERT_EQ("a", val);
2164
+ ASSERT_OK(db->Get(ReadOptions(), "b", &val));
2165
+ ASSERT_EQ("b", val);
2166
+
2167
+ ASSERT_OK(db->Close());
2168
+ delete db;
2169
+ ASSERT_OK(DestroyDB(dbname, opts));
2170
+
2171
+ dbname = dbname2_;
2172
+ }
2173
+ }
2174
+
2175
+ // The parameters are as follows -
2176
+ // 1. True means Options::env is non-null, false means null
2177
+ // 2. True means use Env::Default, false means custom
2178
+ // 3. True means use FileSystem::Default, false means custom
2179
+ INSTANTIATE_TEST_CASE_P(
2180
+ EnvFSTest, EnvFSTestWithParam,
2181
+ ::testing::Combine(::testing::Bool(), ::testing::Bool(),
2182
+ ::testing::Bool()));
2183
+ // This test ensures that default Env and those allocated by
2184
+ // NewCompositeEnv() all share the same threadpool
2185
+ TEST_F(EnvTest, MultipleCompositeEnv) {
2186
+ std::shared_ptr<FaultInjectionTestFS> fs1 =
2187
+ std::make_shared<FaultInjectionTestFS>(FileSystem::Default());
2188
+ std::shared_ptr<FaultInjectionTestFS> fs2 =
2189
+ std::make_shared<FaultInjectionTestFS>(FileSystem::Default());
2190
+ std::unique_ptr<Env> env1 = NewCompositeEnv(fs1);
2191
+ std::unique_ptr<Env> env2 = NewCompositeEnv(fs2);
2192
+ Env::Default()->SetBackgroundThreads(8, Env::HIGH);
2193
+ Env::Default()->SetBackgroundThreads(16, Env::LOW);
2194
+ ASSERT_EQ(env1->GetBackgroundThreads(Env::LOW), 16);
2195
+ ASSERT_EQ(env1->GetBackgroundThreads(Env::HIGH), 8);
2196
+ ASSERT_EQ(env2->GetBackgroundThreads(Env::LOW), 16);
2197
+ ASSERT_EQ(env2->GetBackgroundThreads(Env::HIGH), 8);
2198
+ }
2199
+
2200
+ TEST_F(EnvTest, IsDirectory) {
2201
+ Status s = Env::Default()->CreateDirIfMissing(test_directory_);
2202
+ ASSERT_OK(s);
2203
+ const std::string test_sub_dir = test_directory_ + "sub1";
2204
+ const std::string test_file_path = test_directory_ + "file1";
2205
+ ASSERT_OK(Env::Default()->CreateDirIfMissing(test_sub_dir));
2206
+ bool is_dir = false;
2207
+ ASSERT_OK(Env::Default()->IsDirectory(test_sub_dir, &is_dir));
2208
+ ASSERT_TRUE(is_dir);
2209
+ {
2210
+ std::unique_ptr<FSWritableFile> wfile;
2211
+ s = Env::Default()->GetFileSystem()->NewWritableFile(
2212
+ test_file_path, FileOptions(), &wfile, /*dbg=*/nullptr);
2213
+ ASSERT_OK(s);
2214
+ std::unique_ptr<WritableFileWriter> fwriter;
2215
+ fwriter.reset(new WritableFileWriter(std::move(wfile), test_file_path,
2216
+ FileOptions(), Env::Default()));
2217
+ constexpr char buf[] = "test";
2218
+ s = fwriter->Append(buf);
2219
+ ASSERT_OK(s);
2220
+ }
2221
+ ASSERT_OK(Env::Default()->IsDirectory(test_file_path, &is_dir));
2222
+ ASSERT_FALSE(is_dir);
2223
+ }
2224
+
2225
+ } // namespace ROCKSDB_NAMESPACE
2226
+
2227
+ int main(int argc, char** argv) {
2228
+ ::testing::InitGoogleTest(&argc, argv);
2229
+ return RUN_ALL_TESTS();
2230
+ }