rn-leveldb 3.11.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 (595) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +92 -0
  3. package/android/.project +34 -0
  4. package/android/.settings/org.eclipse.buildship.core.prefs +13 -0
  5. package/android/CMakeLists.txt +69 -0
  6. package/android/build.gradle +125 -0
  7. package/android/cpp-adapter.cpp +19 -0
  8. package/android/gradle.properties +6 -0
  9. package/android/src/main/AndroidManifest.xml +4 -0
  10. package/android/src/main/java/com/reactnativeleveldb/LeveldbModule.java +57 -0
  11. package/android/src/main/java/com/reactnativeleveldb/LeveldbPackage.java +28 -0
  12. package/cpp/leveldb/.appveyor.yml +36 -0
  13. package/cpp/leveldb/.clang-format +18 -0
  14. package/cpp/leveldb/.travis.yml +88 -0
  15. package/cpp/leveldb/AUTHORS +12 -0
  16. package/cpp/leveldb/CMakeLists.txt +495 -0
  17. package/cpp/leveldb/CONTRIBUTING.md +36 -0
  18. package/cpp/leveldb/LICENSE +27 -0
  19. package/cpp/leveldb/NEWS +17 -0
  20. package/cpp/leveldb/README.md +231 -0
  21. package/cpp/leveldb/TODO +14 -0
  22. package/cpp/leveldb/benchmarks/db_bench.cc +990 -0
  23. package/cpp/leveldb/benchmarks/db_bench_sqlite3.cc +726 -0
  24. package/cpp/leveldb/benchmarks/db_bench_tree_db.cc +531 -0
  25. package/cpp/leveldb/cmake/leveldbConfig.cmake.in +9 -0
  26. package/cpp/leveldb/db/autocompact_test.cc +115 -0
  27. package/cpp/leveldb/db/builder.cc +82 -0
  28. package/cpp/leveldb/db/builder.h +30 -0
  29. package/cpp/leveldb/db/c.cc +562 -0
  30. package/cpp/leveldb/db/c_test.c +384 -0
  31. package/cpp/leveldb/db/corruption_test.cc +367 -0
  32. package/cpp/leveldb/db/db_impl.cc +1554 -0
  33. package/cpp/leveldb/db/db_impl.h +217 -0
  34. package/cpp/leveldb/db/db_iter.cc +318 -0
  35. package/cpp/leveldb/db/db_iter.h +26 -0
  36. package/cpp/leveldb/db/db_test.cc +2305 -0
  37. package/cpp/leveldb/db/dbformat.cc +136 -0
  38. package/cpp/leveldb/db/dbformat.h +224 -0
  39. package/cpp/leveldb/db/dbformat_test.cc +133 -0
  40. package/cpp/leveldb/db/dumpfile.cc +232 -0
  41. package/cpp/leveldb/db/fault_injection_test.cc +555 -0
  42. package/cpp/leveldb/db/filename.cc +141 -0
  43. package/cpp/leveldb/db/filename.h +83 -0
  44. package/cpp/leveldb/db/filename_test.cc +132 -0
  45. package/cpp/leveldb/db/leveldbutil.cc +64 -0
  46. package/cpp/leveldb/db/log_format.h +35 -0
  47. package/cpp/leveldb/db/log_reader.cc +274 -0
  48. package/cpp/leveldb/db/log_reader.h +112 -0
  49. package/cpp/leveldb/db/log_test.cc +563 -0
  50. package/cpp/leveldb/db/log_writer.cc +111 -0
  51. package/cpp/leveldb/db/log_writer.h +54 -0
  52. package/cpp/leveldb/db/memtable.cc +137 -0
  53. package/cpp/leveldb/db/memtable.h +87 -0
  54. package/cpp/leveldb/db/recovery_test.cc +339 -0
  55. package/cpp/leveldb/db/repair.cc +451 -0
  56. package/cpp/leveldb/db/skiplist.h +382 -0
  57. package/cpp/leveldb/db/skiplist_test.cc +373 -0
  58. package/cpp/leveldb/db/snapshot.h +95 -0
  59. package/cpp/leveldb/db/table_cache.cc +120 -0
  60. package/cpp/leveldb/db/table_cache.h +57 -0
  61. package/cpp/leveldb/db/version_edit.cc +257 -0
  62. package/cpp/leveldb/db/version_edit.h +106 -0
  63. package/cpp/leveldb/db/version_edit_test.cc +46 -0
  64. package/cpp/leveldb/db/version_set.cc +1562 -0
  65. package/cpp/leveldb/db/version_set.h +393 -0
  66. package/cpp/leveldb/db/version_set_test.cc +336 -0
  67. package/cpp/leveldb/db/write_batch.cc +150 -0
  68. package/cpp/leveldb/db/write_batch_internal.h +45 -0
  69. package/cpp/leveldb/db/write_batch_test.cc +137 -0
  70. package/cpp/leveldb/doc/benchmark.html +459 -0
  71. package/cpp/leveldb/doc/impl.md +172 -0
  72. package/cpp/leveldb/doc/index.md +523 -0
  73. package/cpp/leveldb/doc/log_format.md +75 -0
  74. package/cpp/leveldb/doc/table_format.md +107 -0
  75. package/cpp/leveldb/helpers/memenv/memenv.cc +390 -0
  76. package/cpp/leveldb/helpers/memenv/memenv.h +22 -0
  77. package/cpp/leveldb/helpers/memenv/memenv_test.cc +264 -0
  78. package/cpp/leveldb/include/leveldb/c.h +270 -0
  79. package/cpp/leveldb/include/leveldb/cache.h +111 -0
  80. package/cpp/leveldb/include/leveldb/comparator.h +64 -0
  81. package/cpp/leveldb/include/leveldb/db.h +167 -0
  82. package/cpp/leveldb/include/leveldb/dumpfile.h +28 -0
  83. package/cpp/leveldb/include/leveldb/env.h +417 -0
  84. package/cpp/leveldb/include/leveldb/export.h +33 -0
  85. package/cpp/leveldb/include/leveldb/filter_policy.h +72 -0
  86. package/cpp/leveldb/include/leveldb/iterator.h +112 -0
  87. package/cpp/leveldb/include/leveldb/options.h +187 -0
  88. package/cpp/leveldb/include/leveldb/slice.h +114 -0
  89. package/cpp/leveldb/include/leveldb/status.h +122 -0
  90. package/cpp/leveldb/include/leveldb/table.h +84 -0
  91. package/cpp/leveldb/include/leveldb/table_builder.h +93 -0
  92. package/cpp/leveldb/include/leveldb/write_batch.h +83 -0
  93. package/cpp/leveldb/issues/issue178_test.cc +90 -0
  94. package/cpp/leveldb/issues/issue200_test.cc +59 -0
  95. package/cpp/leveldb/issues/issue320_test.cc +131 -0
  96. package/cpp/leveldb/port/README.md +10 -0
  97. package/cpp/leveldb/port/port.h +19 -0
  98. package/cpp/leveldb/port/port_config.h.in +33 -0
  99. package/cpp/leveldb/port/port_example.h +100 -0
  100. package/cpp/leveldb/port/port_stdcxx.h +151 -0
  101. package/cpp/leveldb/port/thread_annotations.h +108 -0
  102. package/cpp/leveldb/table/block.cc +267 -0
  103. package/cpp/leveldb/table/block.h +44 -0
  104. package/cpp/leveldb/table/block_builder.cc +107 -0
  105. package/cpp/leveldb/table/block_builder.h +54 -0
  106. package/cpp/leveldb/table/filter_block.cc +106 -0
  107. package/cpp/leveldb/table/filter_block.h +68 -0
  108. package/cpp/leveldb/table/filter_block_test.cc +127 -0
  109. package/cpp/leveldb/table/format.cc +141 -0
  110. package/cpp/leveldb/table/format.h +99 -0
  111. package/cpp/leveldb/table/iterator.cc +76 -0
  112. package/cpp/leveldb/table/iterator_wrapper.h +92 -0
  113. package/cpp/leveldb/table/merger.cc +191 -0
  114. package/cpp/leveldb/table/merger.h +26 -0
  115. package/cpp/leveldb/table/table.cc +271 -0
  116. package/cpp/leveldb/table/table_builder.cc +265 -0
  117. package/cpp/leveldb/table/table_test.cc +834 -0
  118. package/cpp/leveldb/table/two_level_iterator.cc +171 -0
  119. package/cpp/leveldb/table/two_level_iterator.h +31 -0
  120. package/cpp/leveldb/third_party/benchmark/.clang-format +5 -0
  121. package/cpp/leveldb/third_party/benchmark/.github/ISSUE_TEMPLATE/bug_report.md +32 -0
  122. package/cpp/leveldb/third_party/benchmark/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
  123. package/cpp/leveldb/third_party/benchmark/.github/workflows/build-and-test.yml +38 -0
  124. package/cpp/leveldb/third_party/benchmark/.github/workflows/pylint.yml +26 -0
  125. package/cpp/leveldb/third_party/benchmark/.github/workflows/test_bindings.yml +24 -0
  126. package/cpp/leveldb/third_party/benchmark/.travis-libcxx-setup.sh +28 -0
  127. package/cpp/leveldb/third_party/benchmark/.travis.yml +231 -0
  128. package/cpp/leveldb/third_party/benchmark/.ycm_extra_conf.py +115 -0
  129. package/cpp/leveldb/third_party/benchmark/AUTHORS +58 -0
  130. package/cpp/leveldb/third_party/benchmark/BUILD.bazel +44 -0
  131. package/cpp/leveldb/third_party/benchmark/CMakeLists.txt +287 -0
  132. package/cpp/leveldb/third_party/benchmark/CONTRIBUTING.md +58 -0
  133. package/cpp/leveldb/third_party/benchmark/CONTRIBUTORS +83 -0
  134. package/cpp/leveldb/third_party/benchmark/LICENSE +202 -0
  135. package/cpp/leveldb/third_party/benchmark/README.md +1323 -0
  136. package/cpp/leveldb/third_party/benchmark/WORKSPACE +51 -0
  137. package/cpp/leveldb/third_party/benchmark/_config.yml +1 -0
  138. package/cpp/leveldb/third_party/benchmark/appveyor.yml +50 -0
  139. package/cpp/leveldb/third_party/benchmark/bindings/python/BUILD +3 -0
  140. package/cpp/leveldb/third_party/benchmark/bindings/python/build_defs.bzl +25 -0
  141. package/cpp/leveldb/third_party/benchmark/bindings/python/google_benchmark/BUILD +38 -0
  142. package/cpp/leveldb/third_party/benchmark/bindings/python/google_benchmark/__init__.py +156 -0
  143. package/cpp/leveldb/third_party/benchmark/bindings/python/google_benchmark/benchmark.cc +180 -0
  144. package/cpp/leveldb/third_party/benchmark/bindings/python/google_benchmark/example.py +136 -0
  145. package/cpp/leveldb/third_party/benchmark/bindings/python/pybind11.BUILD +20 -0
  146. package/cpp/leveldb/third_party/benchmark/bindings/python/python_headers.BUILD +6 -0
  147. package/cpp/leveldb/third_party/benchmark/bindings/python/requirements.txt +2 -0
  148. package/cpp/leveldb/third_party/benchmark/cmake/AddCXXCompilerFlag.cmake +74 -0
  149. package/cpp/leveldb/third_party/benchmark/cmake/CXXFeatureCheck.cmake +69 -0
  150. package/cpp/leveldb/third_party/benchmark/cmake/Config.cmake.in +1 -0
  151. package/cpp/leveldb/third_party/benchmark/cmake/GetGitVersion.cmake +54 -0
  152. package/cpp/leveldb/third_party/benchmark/cmake/GoogleTest.cmake +41 -0
  153. package/cpp/leveldb/third_party/benchmark/cmake/GoogleTest.cmake.in +58 -0
  154. package/cpp/leveldb/third_party/benchmark/cmake/benchmark.pc.in +12 -0
  155. package/cpp/leveldb/third_party/benchmark/cmake/gnu_posix_regex.cpp +12 -0
  156. package/cpp/leveldb/third_party/benchmark/cmake/llvm-toolchain.cmake +8 -0
  157. package/cpp/leveldb/third_party/benchmark/cmake/posix_regex.cpp +14 -0
  158. package/cpp/leveldb/third_party/benchmark/cmake/split_list.cmake +3 -0
  159. package/cpp/leveldb/third_party/benchmark/cmake/std_regex.cpp +10 -0
  160. package/cpp/leveldb/third_party/benchmark/cmake/steady_clock.cpp +7 -0
  161. package/cpp/leveldb/third_party/benchmark/cmake/thread_safety_attributes.cpp +4 -0
  162. package/cpp/leveldb/third_party/benchmark/conan/CMakeLists.txt +7 -0
  163. package/cpp/leveldb/third_party/benchmark/conan/test_package/CMakeLists.txt +10 -0
  164. package/cpp/leveldb/third_party/benchmark/conan/test_package/conanfile.py +19 -0
  165. package/cpp/leveldb/third_party/benchmark/conan/test_package/test_package.cpp +18 -0
  166. package/cpp/leveldb/third_party/benchmark/conanfile.py +79 -0
  167. package/cpp/leveldb/third_party/benchmark/dependencies.md +18 -0
  168. package/cpp/leveldb/third_party/benchmark/docs/AssemblyTests.md +147 -0
  169. package/cpp/leveldb/third_party/benchmark/docs/_config.yml +1 -0
  170. package/cpp/leveldb/third_party/benchmark/docs/releasing.md +16 -0
  171. package/cpp/leveldb/third_party/benchmark/docs/tools.md +203 -0
  172. package/cpp/leveldb/third_party/benchmark/include/benchmark/benchmark.h +1604 -0
  173. package/cpp/leveldb/third_party/benchmark/requirements.txt +2 -0
  174. package/cpp/leveldb/third_party/benchmark/setup.py +140 -0
  175. package/cpp/leveldb/third_party/benchmark/src/CMakeLists.txt +114 -0
  176. package/cpp/leveldb/third_party/benchmark/src/arraysize.h +33 -0
  177. package/cpp/leveldb/third_party/benchmark/src/benchmark.cc +499 -0
  178. package/cpp/leveldb/third_party/benchmark/src/benchmark_api_internal.cc +15 -0
  179. package/cpp/leveldb/third_party/benchmark/src/benchmark_api_internal.h +53 -0
  180. package/cpp/leveldb/third_party/benchmark/src/benchmark_main.cc +17 -0
  181. package/cpp/leveldb/third_party/benchmark/src/benchmark_name.cc +58 -0
  182. package/cpp/leveldb/third_party/benchmark/src/benchmark_register.cc +515 -0
  183. package/cpp/leveldb/third_party/benchmark/src/benchmark_register.h +108 -0
  184. package/cpp/leveldb/third_party/benchmark/src/benchmark_runner.cc +362 -0
  185. package/cpp/leveldb/third_party/benchmark/src/benchmark_runner.h +51 -0
  186. package/cpp/leveldb/third_party/benchmark/src/check.h +82 -0
  187. package/cpp/leveldb/third_party/benchmark/src/colorprint.cc +188 -0
  188. package/cpp/leveldb/third_party/benchmark/src/colorprint.h +33 -0
  189. package/cpp/leveldb/third_party/benchmark/src/commandlineflags.cc +228 -0
  190. package/cpp/leveldb/third_party/benchmark/src/commandlineflags.h +103 -0
  191. package/cpp/leveldb/third_party/benchmark/src/complexity.cc +238 -0
  192. package/cpp/leveldb/third_party/benchmark/src/complexity.h +55 -0
  193. package/cpp/leveldb/third_party/benchmark/src/console_reporter.cc +177 -0
  194. package/cpp/leveldb/third_party/benchmark/src/counter.cc +80 -0
  195. package/cpp/leveldb/third_party/benchmark/src/counter.h +32 -0
  196. package/cpp/leveldb/third_party/benchmark/src/csv_reporter.cc +154 -0
  197. package/cpp/leveldb/third_party/benchmark/src/cycleclock.h +211 -0
  198. package/cpp/leveldb/third_party/benchmark/src/internal_macros.h +102 -0
  199. package/cpp/leveldb/third_party/benchmark/src/json_reporter.cc +255 -0
  200. package/cpp/leveldb/third_party/benchmark/src/log.h +74 -0
  201. package/cpp/leveldb/third_party/benchmark/src/mutex.h +155 -0
  202. package/cpp/leveldb/third_party/benchmark/src/re.h +158 -0
  203. package/cpp/leveldb/third_party/benchmark/src/reporter.cc +105 -0
  204. package/cpp/leveldb/third_party/benchmark/src/sleep.cc +67 -0
  205. package/cpp/leveldb/third_party/benchmark/src/sleep.h +15 -0
  206. package/cpp/leveldb/third_party/benchmark/src/statistics.cc +193 -0
  207. package/cpp/leveldb/third_party/benchmark/src/statistics.h +37 -0
  208. package/cpp/leveldb/third_party/benchmark/src/string_util.cc +255 -0
  209. package/cpp/leveldb/third_party/benchmark/src/string_util.h +59 -0
  210. package/cpp/leveldb/third_party/benchmark/src/sysinfo.cc +716 -0
  211. package/cpp/leveldb/third_party/benchmark/src/thread_manager.h +64 -0
  212. package/cpp/leveldb/third_party/benchmark/src/thread_timer.h +86 -0
  213. package/cpp/leveldb/third_party/benchmark/src/timers.cc +245 -0
  214. package/cpp/leveldb/third_party/benchmark/src/timers.h +48 -0
  215. package/cpp/leveldb/third_party/benchmark/test/AssemblyTests.cmake +46 -0
  216. package/cpp/leveldb/third_party/benchmark/test/BUILD +73 -0
  217. package/cpp/leveldb/third_party/benchmark/test/CMakeLists.txt +263 -0
  218. package/cpp/leveldb/third_party/benchmark/test/args_product_test.cc +77 -0
  219. package/cpp/leveldb/third_party/benchmark/test/basic_test.cc +136 -0
  220. package/cpp/leveldb/third_party/benchmark/test/benchmark_gtest.cc +134 -0
  221. package/cpp/leveldb/third_party/benchmark/test/benchmark_name_gtest.cc +74 -0
  222. package/cpp/leveldb/third_party/benchmark/test/benchmark_test.cc +245 -0
  223. package/cpp/leveldb/third_party/benchmark/test/clobber_memory_assembly_test.cc +64 -0
  224. package/cpp/leveldb/third_party/benchmark/test/commandlineflags_gtest.cc +201 -0
  225. package/cpp/leveldb/third_party/benchmark/test/complexity_test.cc +213 -0
  226. package/cpp/leveldb/third_party/benchmark/test/cxx03_test.cc +63 -0
  227. package/cpp/leveldb/third_party/benchmark/test/diagnostics_test.cc +80 -0
  228. package/cpp/leveldb/third_party/benchmark/test/display_aggregates_only_test.cc +43 -0
  229. package/cpp/leveldb/third_party/benchmark/test/donotoptimize_assembly_test.cc +163 -0
  230. package/cpp/leveldb/third_party/benchmark/test/donotoptimize_test.cc +52 -0
  231. package/cpp/leveldb/third_party/benchmark/test/filter_test.cc +104 -0
  232. package/cpp/leveldb/third_party/benchmark/test/fixture_test.cc +51 -0
  233. package/cpp/leveldb/third_party/benchmark/test/internal_threading_test.cc +184 -0
  234. package/cpp/leveldb/third_party/benchmark/test/link_main_test.cc +8 -0
  235. package/cpp/leveldb/third_party/benchmark/test/map_test.cc +57 -0
  236. package/cpp/leveldb/third_party/benchmark/test/memory_manager_test.cc +44 -0
  237. package/cpp/leveldb/third_party/benchmark/test/multiple_ranges_test.cc +96 -0
  238. package/cpp/leveldb/third_party/benchmark/test/options_test.cc +75 -0
  239. package/cpp/leveldb/third_party/benchmark/test/output_test.h +213 -0
  240. package/cpp/leveldb/third_party/benchmark/test/output_test_helper.cc +515 -0
  241. package/cpp/leveldb/third_party/benchmark/test/register_benchmark_test.cc +184 -0
  242. package/cpp/leveldb/third_party/benchmark/test/report_aggregates_only_test.cc +39 -0
  243. package/cpp/leveldb/third_party/benchmark/test/reporter_output_test.cc +747 -0
  244. package/cpp/leveldb/third_party/benchmark/test/skip_with_error_test.cc +195 -0
  245. package/cpp/leveldb/third_party/benchmark/test/state_assembly_test.cc +68 -0
  246. package/cpp/leveldb/third_party/benchmark/test/statistics_gtest.cc +28 -0
  247. package/cpp/leveldb/third_party/benchmark/test/string_util_gtest.cc +153 -0
  248. package/cpp/leveldb/third_party/benchmark/test/templated_fixture_test.cc +28 -0
  249. package/cpp/leveldb/third_party/benchmark/test/user_counters_tabular_test.cc +285 -0
  250. package/cpp/leveldb/third_party/benchmark/test/user_counters_test.cc +531 -0
  251. package/cpp/leveldb/third_party/benchmark/test/user_counters_thousands_test.cc +173 -0
  252. package/cpp/leveldb/third_party/benchmark/tools/BUILD.bazel +19 -0
  253. package/cpp/leveldb/third_party/benchmark/tools/compare.py +429 -0
  254. package/cpp/leveldb/third_party/benchmark/tools/gbench/Inputs/test1_run1.json +119 -0
  255. package/cpp/leveldb/third_party/benchmark/tools/gbench/Inputs/test1_run2.json +119 -0
  256. package/cpp/leveldb/third_party/benchmark/tools/gbench/Inputs/test2_run.json +81 -0
  257. package/cpp/leveldb/third_party/benchmark/tools/gbench/Inputs/test3_run0.json +65 -0
  258. package/cpp/leveldb/third_party/benchmark/tools/gbench/Inputs/test3_run1.json +65 -0
  259. package/cpp/leveldb/third_party/benchmark/tools/gbench/__init__.py +8 -0
  260. package/cpp/leveldb/third_party/benchmark/tools/gbench/report.py +903 -0
  261. package/cpp/leveldb/third_party/benchmark/tools/gbench/util.py +163 -0
  262. package/cpp/leveldb/third_party/benchmark/tools/requirements.txt +1 -0
  263. package/cpp/leveldb/third_party/benchmark/tools/strip_asm.py +151 -0
  264. package/cpp/leveldb/third_party/googletest/.clang-format +4 -0
  265. package/cpp/leveldb/third_party/googletest/.travis.yml +73 -0
  266. package/cpp/leveldb/third_party/googletest/BUILD.bazel +179 -0
  267. package/cpp/leveldb/third_party/googletest/CMakeLists.txt +36 -0
  268. package/cpp/leveldb/third_party/googletest/CONTRIBUTING.md +142 -0
  269. package/cpp/leveldb/third_party/googletest/LICENSE +28 -0
  270. package/cpp/leveldb/third_party/googletest/README.md +132 -0
  271. package/cpp/leveldb/third_party/googletest/WORKSPACE +23 -0
  272. package/cpp/leveldb/third_party/googletest/appveyor.yml +154 -0
  273. package/cpp/leveldb/third_party/googletest/ci/build-linux-bazel.sh +37 -0
  274. package/cpp/leveldb/third_party/googletest/ci/build-platformio.sh +2 -0
  275. package/cpp/leveldb/third_party/googletest/ci/env-linux.sh +41 -0
  276. package/cpp/leveldb/third_party/googletest/ci/env-osx.sh +47 -0
  277. package/cpp/leveldb/third_party/googletest/ci/get-nprocessors.sh +48 -0
  278. package/cpp/leveldb/third_party/googletest/ci/install-linux.sh +49 -0
  279. package/cpp/leveldb/third_party/googletest/ci/install-osx.sh +40 -0
  280. package/cpp/leveldb/third_party/googletest/ci/install-platformio.sh +5 -0
  281. package/cpp/leveldb/third_party/googletest/ci/log-config.sh +51 -0
  282. package/cpp/leveldb/third_party/googletest/ci/travis.sh +44 -0
  283. package/cpp/leveldb/third_party/googletest/googlemock/CMakeLists.txt +233 -0
  284. package/cpp/leveldb/third_party/googletest/googlemock/CONTRIBUTORS +40 -0
  285. package/cpp/leveldb/third_party/googletest/googlemock/LICENSE +28 -0
  286. package/cpp/leveldb/third_party/googletest/googlemock/README.md +44 -0
  287. package/cpp/leveldb/third_party/googletest/googlemock/cmake/gmock.pc.in +10 -0
  288. package/cpp/leveldb/third_party/googletest/googlemock/cmake/gmock_main.pc.in +10 -0
  289. package/cpp/leveldb/third_party/googletest/googlemock/docs/cheat_sheet.md +770 -0
  290. package/cpp/leveldb/third_party/googletest/googlemock/docs/cook_book.md +4270 -0
  291. package/cpp/leveldb/third_party/googletest/googlemock/docs/for_dummies.md +700 -0
  292. package/cpp/leveldb/third_party/googletest/googlemock/docs/gmock_faq.md +396 -0
  293. package/cpp/leveldb/third_party/googletest/googlemock/docs/pump_manual.md +187 -0
  294. package/cpp/leveldb/third_party/googletest/googlemock/include/gmock/gmock-actions.h +1193 -0
  295. package/cpp/leveldb/third_party/googletest/googlemock/include/gmock/gmock-cardinalities.h +157 -0
  296. package/cpp/leveldb/third_party/googletest/googlemock/include/gmock/gmock-function-mocker.h +276 -0
  297. package/cpp/leveldb/third_party/googletest/googlemock/include/gmock/gmock-generated-actions.h +1884 -0
  298. package/cpp/leveldb/third_party/googletest/googlemock/include/gmock/gmock-generated-actions.h.pump +627 -0
  299. package/cpp/leveldb/third_party/googletest/googlemock/include/gmock/gmock-generated-function-mockers.h +752 -0
  300. package/cpp/leveldb/third_party/googletest/googlemock/include/gmock/gmock-generated-function-mockers.h.pump +227 -0
  301. package/cpp/leveldb/third_party/googletest/googlemock/include/gmock/gmock-generated-matchers.h +1097 -0
  302. package/cpp/leveldb/third_party/googletest/googlemock/include/gmock/gmock-generated-matchers.h.pump +346 -0
  303. package/cpp/leveldb/third_party/googletest/googlemock/include/gmock/gmock-matchers.h +4591 -0
  304. package/cpp/leveldb/third_party/googletest/googlemock/include/gmock/gmock-more-actions.h +162 -0
  305. package/cpp/leveldb/third_party/googletest/googlemock/include/gmock/gmock-more-matchers.h +92 -0
  306. package/cpp/leveldb/third_party/googletest/googlemock/include/gmock/gmock-nice-strict.h +215 -0
  307. package/cpp/leveldb/third_party/googletest/googlemock/include/gmock/gmock-spec-builders.h +1985 -0
  308. package/cpp/leveldb/third_party/googletest/googlemock/include/gmock/gmock.h +101 -0
  309. package/cpp/leveldb/third_party/googletest/googlemock/include/gmock/internal/custom/README.md +16 -0
  310. package/cpp/leveldb/third_party/googletest/googlemock/include/gmock/internal/custom/gmock-generated-actions.h +10 -0
  311. package/cpp/leveldb/third_party/googletest/googlemock/include/gmock/internal/custom/gmock-generated-actions.h.pump +12 -0
  312. package/cpp/leveldb/third_party/googletest/googlemock/include/gmock/internal/custom/gmock-matchers.h +36 -0
  313. package/cpp/leveldb/third_party/googletest/googlemock/include/gmock/internal/custom/gmock-port.h +39 -0
  314. package/cpp/leveldb/third_party/googletest/googlemock/include/gmock/internal/gmock-internal-utils.h +472 -0
  315. package/cpp/leveldb/third_party/googletest/googlemock/include/gmock/internal/gmock-port.h +87 -0
  316. package/cpp/leveldb/third_party/googletest/googlemock/include/gmock/internal/gmock-pp.h +271 -0
  317. package/cpp/leveldb/third_party/googletest/googlemock/scripts/README.md +5 -0
  318. package/cpp/leveldb/third_party/googletest/googlemock/scripts/fuse_gmock_files.py +240 -0
  319. package/cpp/leveldb/third_party/googletest/googlemock/scripts/generator/LICENSE +203 -0
  320. package/cpp/leveldb/third_party/googletest/googlemock/scripts/generator/README +34 -0
  321. package/cpp/leveldb/third_party/googletest/googlemock/scripts/generator/README.cppclean +115 -0
  322. package/cpp/leveldb/third_party/googletest/googlemock/scripts/generator/cpp/__init__.py +0 -0
  323. package/cpp/leveldb/third_party/googletest/googlemock/scripts/generator/cpp/ast.py +1761 -0
  324. package/cpp/leveldb/third_party/googletest/googlemock/scripts/generator/cpp/gmock_class.py +248 -0
  325. package/cpp/leveldb/third_party/googletest/googlemock/scripts/generator/cpp/gmock_class_test.py +540 -0
  326. package/cpp/leveldb/third_party/googletest/googlemock/scripts/generator/cpp/keywords.py +56 -0
  327. package/cpp/leveldb/third_party/googletest/googlemock/scripts/generator/cpp/tokenize.py +284 -0
  328. package/cpp/leveldb/third_party/googletest/googlemock/scripts/generator/cpp/utils.py +37 -0
  329. package/cpp/leveldb/third_party/googletest/googlemock/scripts/generator/gmock_gen.py +30 -0
  330. package/cpp/leveldb/third_party/googletest/googlemock/scripts/pump.py +856 -0
  331. package/cpp/leveldb/third_party/googletest/googlemock/src/gmock-all.cc +46 -0
  332. package/cpp/leveldb/third_party/googletest/googlemock/src/gmock-cardinalities.cc +155 -0
  333. package/cpp/leveldb/third_party/googletest/googlemock/src/gmock-internal-utils.cc +200 -0
  334. package/cpp/leveldb/third_party/googletest/googlemock/src/gmock-matchers.cc +462 -0
  335. package/cpp/leveldb/third_party/googletest/googlemock/src/gmock-spec-builders.cc +892 -0
  336. package/cpp/leveldb/third_party/googletest/googlemock/src/gmock.cc +213 -0
  337. package/cpp/leveldb/third_party/googletest/googlemock/src/gmock_main.cc +72 -0
  338. package/cpp/leveldb/third_party/googletest/googlemock/test/BUILD.bazel +110 -0
  339. package/cpp/leveldb/third_party/googletest/googlemock/test/gmock-actions_test.cc +1507 -0
  340. package/cpp/leveldb/third_party/googletest/googlemock/test/gmock-cardinalities_test.cc +429 -0
  341. package/cpp/leveldb/third_party/googletest/googlemock/test/gmock-function-mocker_nc.cc +16 -0
  342. package/cpp/leveldb/third_party/googletest/googlemock/test/gmock-function-mocker_nc_test.py +43 -0
  343. package/cpp/leveldb/third_party/googletest/googlemock/test/gmock-function-mocker_test.cc +696 -0
  344. package/cpp/leveldb/third_party/googletest/googlemock/test/gmock-generated-actions_test.cc +1064 -0
  345. package/cpp/leveldb/third_party/googletest/googlemock/test/gmock-generated-function-mockers_test.cc +659 -0
  346. package/cpp/leveldb/third_party/googletest/googlemock/test/gmock-generated-matchers_test.cc +1323 -0
  347. package/cpp/leveldb/third_party/googletest/googlemock/test/gmock-internal-utils_test.cc +732 -0
  348. package/cpp/leveldb/third_party/googletest/googlemock/test/gmock-matchers_test.cc +6913 -0
  349. package/cpp/leveldb/third_party/googletest/googlemock/test/gmock-more-actions_test.cc +698 -0
  350. package/cpp/leveldb/third_party/googletest/googlemock/test/gmock-nice-strict_test.cc +500 -0
  351. package/cpp/leveldb/third_party/googletest/googlemock/test/gmock-port_test.cc +42 -0
  352. package/cpp/leveldb/third_party/googletest/googlemock/test/gmock-pp-string_test.cc +206 -0
  353. package/cpp/leveldb/third_party/googletest/googlemock/test/gmock-pp_test.cc +83 -0
  354. package/cpp/leveldb/third_party/googletest/googlemock/test/gmock-spec-builders_test.cc +2775 -0
  355. package/cpp/leveldb/third_party/googletest/googlemock/test/gmock_all_test.cc +49 -0
  356. package/cpp/leveldb/third_party/googletest/googlemock/test/gmock_ex_test.cc +80 -0
  357. package/cpp/leveldb/third_party/googletest/googlemock/test/gmock_leak_test.py +104 -0
  358. package/cpp/leveldb/third_party/googletest/googlemock/test/gmock_leak_test_.cc +99 -0
  359. package/cpp/leveldb/third_party/googletest/googlemock/test/gmock_link2_test.cc +39 -0
  360. package/cpp/leveldb/third_party/googletest/googlemock/test/gmock_link_test.cc +39 -0
  361. package/cpp/leveldb/third_party/googletest/googlemock/test/gmock_link_test.h +690 -0
  362. package/cpp/leveldb/third_party/googletest/googlemock/test/gmock_output_test.py +183 -0
  363. package/cpp/leveldb/third_party/googletest/googlemock/test/gmock_output_test_.cc +309 -0
  364. package/cpp/leveldb/third_party/googletest/googlemock/test/gmock_output_test_golden.txt +317 -0
  365. package/cpp/leveldb/third_party/googletest/googlemock/test/gmock_stress_test.cc +240 -0
  366. package/cpp/leveldb/third_party/googletest/googlemock/test/gmock_test.cc +181 -0
  367. package/cpp/leveldb/third_party/googletest/googlemock/test/gmock_test_utils.py +108 -0
  368. package/cpp/leveldb/third_party/googletest/googlemock/test/pump_test.py +182 -0
  369. package/cpp/leveldb/third_party/googletest/googletest/CMakeLists.txt +329 -0
  370. package/cpp/leveldb/third_party/googletest/googletest/CONTRIBUTORS +38 -0
  371. package/cpp/leveldb/third_party/googletest/googletest/LICENSE +28 -0
  372. package/cpp/leveldb/third_party/googletest/googletest/README.md +244 -0
  373. package/cpp/leveldb/third_party/googletest/googletest/cmake/Config.cmake.in +9 -0
  374. package/cpp/leveldb/third_party/googletest/googletest/cmake/gtest.pc.in +9 -0
  375. package/cpp/leveldb/third_party/googletest/googletest/cmake/gtest_main.pc.in +10 -0
  376. package/cpp/leveldb/third_party/googletest/googletest/cmake/internal_utils.cmake +358 -0
  377. package/cpp/leveldb/third_party/googletest/googletest/cmake/libgtest.la.in +21 -0
  378. package/cpp/leveldb/third_party/googletest/googletest/docs/advanced.md +2567 -0
  379. package/cpp/leveldb/third_party/googletest/googletest/docs/faq.md +753 -0
  380. package/cpp/leveldb/third_party/googletest/googletest/docs/pkgconfig.md +219 -0
  381. package/cpp/leveldb/third_party/googletest/googletest/docs/primer.md +579 -0
  382. package/cpp/leveldb/third_party/googletest/googletest/docs/samples.md +22 -0
  383. package/cpp/leveldb/third_party/googletest/googletest/include/gtest/gtest-death-test.h +343 -0
  384. package/cpp/leveldb/third_party/googletest/googletest/include/gtest/gtest-matchers.h +750 -0
  385. package/cpp/leveldb/third_party/googletest/googletest/include/gtest/gtest-message.h +219 -0
  386. package/cpp/leveldb/third_party/googletest/googletest/include/gtest/gtest-param-test.h +514 -0
  387. package/cpp/leveldb/third_party/googletest/googletest/include/gtest/gtest-printers.h +928 -0
  388. package/cpp/leveldb/third_party/googletest/googletest/include/gtest/gtest-spi.h +238 -0
  389. package/cpp/leveldb/third_party/googletest/googletest/include/gtest/gtest-test-part.h +184 -0
  390. package/cpp/leveldb/third_party/googletest/googletest/include/gtest/gtest-typed-test.h +337 -0
  391. package/cpp/leveldb/third_party/googletest/googletest/include/gtest/gtest.h +2477 -0
  392. package/cpp/leveldb/third_party/googletest/googletest/include/gtest/gtest_pred_impl.h +359 -0
  393. package/cpp/leveldb/third_party/googletest/googletest/include/gtest/gtest_prod.h +61 -0
  394. package/cpp/leveldb/third_party/googletest/googletest/include/gtest/internal/custom/README.md +56 -0
  395. package/cpp/leveldb/third_party/googletest/googletest/include/gtest/internal/custom/gtest-port.h +37 -0
  396. package/cpp/leveldb/third_party/googletest/googletest/include/gtest/internal/custom/gtest-printers.h +42 -0
  397. package/cpp/leveldb/third_party/googletest/googletest/include/gtest/internal/custom/gtest.h +37 -0
  398. package/cpp/leveldb/third_party/googletest/googletest/include/gtest/internal/gtest-death-test-internal.h +304 -0
  399. package/cpp/leveldb/third_party/googletest/googletest/include/gtest/internal/gtest-filepath.h +211 -0
  400. package/cpp/leveldb/third_party/googletest/googletest/include/gtest/internal/gtest-internal.h +1411 -0
  401. package/cpp/leveldb/third_party/googletest/googletest/include/gtest/internal/gtest-param-util.h +880 -0
  402. package/cpp/leveldb/third_party/googletest/googletest/include/gtest/internal/gtest-port-arch.h +111 -0
  403. package/cpp/leveldb/third_party/googletest/googletest/include/gtest/internal/gtest-port.h +2227 -0
  404. package/cpp/leveldb/third_party/googletest/googletest/include/gtest/internal/gtest-string.h +171 -0
  405. package/cpp/leveldb/third_party/googletest/googletest/include/gtest/internal/gtest-type-util.h +183 -0
  406. package/cpp/leveldb/third_party/googletest/googletest/samples/prime_tables.h +126 -0
  407. package/cpp/leveldb/third_party/googletest/googletest/samples/sample1.cc +66 -0
  408. package/cpp/leveldb/third_party/googletest/googletest/samples/sample1.h +41 -0
  409. package/cpp/leveldb/third_party/googletest/googletest/samples/sample10_unittest.cc +139 -0
  410. package/cpp/leveldb/third_party/googletest/googletest/samples/sample1_unittest.cc +151 -0
  411. package/cpp/leveldb/third_party/googletest/googletest/samples/sample2.cc +54 -0
  412. package/cpp/leveldb/third_party/googletest/googletest/samples/sample2.h +81 -0
  413. package/cpp/leveldb/third_party/googletest/googletest/samples/sample2_unittest.cc +107 -0
  414. package/cpp/leveldb/third_party/googletest/googletest/samples/sample3-inl.h +172 -0
  415. package/cpp/leveldb/third_party/googletest/googletest/samples/sample3_unittest.cc +149 -0
  416. package/cpp/leveldb/third_party/googletest/googletest/samples/sample4.cc +54 -0
  417. package/cpp/leveldb/third_party/googletest/googletest/samples/sample4.h +53 -0
  418. package/cpp/leveldb/third_party/googletest/googletest/samples/sample4_unittest.cc +53 -0
  419. package/cpp/leveldb/third_party/googletest/googletest/samples/sample5_unittest.cc +196 -0
  420. package/cpp/leveldb/third_party/googletest/googletest/samples/sample6_unittest.cc +224 -0
  421. package/cpp/leveldb/third_party/googletest/googletest/samples/sample7_unittest.cc +117 -0
  422. package/cpp/leveldb/third_party/googletest/googletest/samples/sample8_unittest.cc +154 -0
  423. package/cpp/leveldb/third_party/googletest/googletest/samples/sample9_unittest.cc +156 -0
  424. package/cpp/leveldb/third_party/googletest/googletest/scripts/README.md +5 -0
  425. package/cpp/leveldb/third_party/googletest/googletest/scripts/common.py +83 -0
  426. package/cpp/leveldb/third_party/googletest/googletest/scripts/fuse_gtest_files.py +253 -0
  427. package/cpp/leveldb/third_party/googletest/googletest/scripts/gen_gtest_pred_impl.py +734 -0
  428. package/cpp/leveldb/third_party/googletest/googletest/scripts/gtest-config.in +274 -0
  429. package/cpp/leveldb/third_party/googletest/googletest/scripts/release_docs.py +158 -0
  430. package/cpp/leveldb/third_party/googletest/googletest/scripts/run_with_path.py +32 -0
  431. package/cpp/leveldb/third_party/googletest/googletest/scripts/upload.py +1402 -0
  432. package/cpp/leveldb/third_party/googletest/googletest/scripts/upload_gtest.py +78 -0
  433. package/cpp/leveldb/third_party/googletest/googletest/src/gtest-all.cc +48 -0
  434. package/cpp/leveldb/third_party/googletest/googletest/src/gtest-death-test.cc +1653 -0
  435. package/cpp/leveldb/third_party/googletest/googletest/src/gtest-filepath.cc +382 -0
  436. package/cpp/leveldb/third_party/googletest/googletest/src/gtest-internal-inl.h +1211 -0
  437. package/cpp/leveldb/third_party/googletest/googletest/src/gtest-matchers.cc +97 -0
  438. package/cpp/leveldb/third_party/googletest/googletest/src/gtest-port.cc +1399 -0
  439. package/cpp/leveldb/third_party/googletest/googletest/src/gtest-printers.cc +442 -0
  440. package/cpp/leveldb/third_party/googletest/googletest/src/gtest-test-part.cc +108 -0
  441. package/cpp/leveldb/third_party/googletest/googletest/src/gtest-typed-test.cc +118 -0
  442. package/cpp/leveldb/third_party/googletest/googletest/src/gtest.cc +6180 -0
  443. package/cpp/leveldb/third_party/googletest/googletest/src/gtest_main.cc +54 -0
  444. package/cpp/leveldb/third_party/googletest/googletest/test/BUILD.bazel +529 -0
  445. package/cpp/leveldb/third_party/googletest/googletest/test/googletest-break-on-failure-unittest.py +208 -0
  446. package/cpp/leveldb/third_party/googletest/googletest/test/googletest-break-on-failure-unittest_.cc +86 -0
  447. package/cpp/leveldb/third_party/googletest/googletest/test/googletest-catch-exceptions-test.py +236 -0
  448. package/cpp/leveldb/third_party/googletest/googletest/test/googletest-catch-exceptions-test_.cc +293 -0
  449. package/cpp/leveldb/third_party/googletest/googletest/test/googletest-color-test.py +127 -0
  450. package/cpp/leveldb/third_party/googletest/googletest/test/googletest-color-test_.cc +62 -0
  451. package/cpp/leveldb/third_party/googletest/googletest/test/googletest-death-test-test.cc +1516 -0
  452. package/cpp/leveldb/third_party/googletest/googletest/test/googletest-death-test_ex_test.cc +92 -0
  453. package/cpp/leveldb/third_party/googletest/googletest/test/googletest-env-var-test.py +117 -0
  454. package/cpp/leveldb/third_party/googletest/googletest/test/googletest-env-var-test_.cc +122 -0
  455. package/cpp/leveldb/third_party/googletest/googletest/test/googletest-filepath-test.cc +649 -0
  456. package/cpp/leveldb/third_party/googletest/googletest/test/googletest-filter-unittest.py +639 -0
  457. package/cpp/leveldb/third_party/googletest/googletest/test/googletest-filter-unittest_.cc +137 -0
  458. package/cpp/leveldb/third_party/googletest/googletest/test/googletest-json-outfiles-test.py +191 -0
  459. package/cpp/leveldb/third_party/googletest/googletest/test/googletest-json-output-unittest.py +778 -0
  460. package/cpp/leveldb/third_party/googletest/googletest/test/googletest-list-tests-unittest.py +205 -0
  461. package/cpp/leveldb/third_party/googletest/googletest/test/googletest-list-tests-unittest_.cc +156 -0
  462. package/cpp/leveldb/third_party/googletest/googletest/test/googletest-listener-test.cc +518 -0
  463. package/cpp/leveldb/third_party/googletest/googletest/test/googletest-message-test.cc +158 -0
  464. package/cpp/leveldb/third_party/googletest/googletest/test/googletest-options-test.cc +216 -0
  465. package/cpp/leveldb/third_party/googletest/googletest/test/googletest-output-test-golden-lin.txt +1137 -0
  466. package/cpp/leveldb/third_party/googletest/googletest/test/googletest-output-test.py +346 -0
  467. package/cpp/leveldb/third_party/googletest/googletest/test/googletest-output-test_.cc +1149 -0
  468. package/cpp/leveldb/third_party/googletest/googletest/test/googletest-param-test-invalid-name1-test.py +63 -0
  469. package/cpp/leveldb/third_party/googletest/googletest/test/googletest-param-test-invalid-name1-test_.cc +50 -0
  470. package/cpp/leveldb/third_party/googletest/googletest/test/googletest-param-test-invalid-name2-test.py +62 -0
  471. package/cpp/leveldb/third_party/googletest/googletest/test/googletest-param-test-invalid-name2-test_.cc +55 -0
  472. package/cpp/leveldb/third_party/googletest/googletest/test/googletest-param-test-test.cc +1086 -0
  473. package/cpp/leveldb/third_party/googletest/googletest/test/googletest-param-test-test.h +51 -0
  474. package/cpp/leveldb/third_party/googletest/googletest/test/googletest-param-test2-test.cc +61 -0
  475. package/cpp/leveldb/third_party/googletest/googletest/test/googletest-port-test.cc +1272 -0
  476. package/cpp/leveldb/third_party/googletest/googletest/test/googletest-printers-test.cc +1619 -0
  477. package/cpp/leveldb/third_party/googletest/googletest/test/googletest-shuffle-test.py +323 -0
  478. package/cpp/leveldb/third_party/googletest/googletest/test/googletest-shuffle-test_.cc +101 -0
  479. package/cpp/leveldb/third_party/googletest/googletest/test/googletest-test-part-test.cc +230 -0
  480. package/cpp/leveldb/third_party/googletest/googletest/test/googletest-test2_test.cc +61 -0
  481. package/cpp/leveldb/third_party/googletest/googletest/test/googletest-throw-on-failure-test.py +168 -0
  482. package/cpp/leveldb/third_party/googletest/googletest/test/googletest-throw-on-failure-test_.cc +71 -0
  483. package/cpp/leveldb/third_party/googletest/googletest/test/googletest-uninitialized-test.py +67 -0
  484. package/cpp/leveldb/third_party/googletest/googletest/test/googletest-uninitialized-test_.cc +42 -0
  485. package/cpp/leveldb/third_party/googletest/googletest/test/gtest-typed-test2_test.cc +44 -0
  486. package/cpp/leveldb/third_party/googletest/googletest/test/gtest-typed-test_test.cc +462 -0
  487. package/cpp/leveldb/third_party/googletest/googletest/test/gtest-typed-test_test.h +65 -0
  488. package/cpp/leveldb/third_party/googletest/googletest/test/gtest-unittest-api_test.cc +341 -0
  489. package/cpp/leveldb/third_party/googletest/googletest/test/gtest_all_test.cc +46 -0
  490. package/cpp/leveldb/third_party/googletest/googletest/test/gtest_assert_by_exception_test.cc +116 -0
  491. package/cpp/leveldb/third_party/googletest/googletest/test/gtest_environment_test.cc +188 -0
  492. package/cpp/leveldb/third_party/googletest/googletest/test/gtest_help_test.py +170 -0
  493. package/cpp/leveldb/third_party/googletest/googletest/test/gtest_help_test_.cc +45 -0
  494. package/cpp/leveldb/third_party/googletest/googletest/test/gtest_json_test_utils.py +60 -0
  495. package/cpp/leveldb/third_party/googletest/googletest/test/gtest_list_output_unittest.py +141 -0
  496. package/cpp/leveldb/third_party/googletest/googletest/test/gtest_list_output_unittest_.cc +51 -0
  497. package/cpp/leveldb/third_party/googletest/googletest/test/gtest_main_unittest.cc +44 -0
  498. package/cpp/leveldb/third_party/googletest/googletest/test/gtest_no_test_unittest.cc +54 -0
  499. package/cpp/leveldb/third_party/googletest/googletest/test/gtest_pred_impl_unittest.cc +2427 -0
  500. package/cpp/leveldb/third_party/googletest/googletest/test/gtest_premature_exit_test.cc +126 -0
  501. package/cpp/leveldb/third_party/googletest/googletest/test/gtest_prod_test.cc +56 -0
  502. package/cpp/leveldb/third_party/googletest/googletest/test/gtest_repeat_test.cc +233 -0
  503. package/cpp/leveldb/third_party/googletest/googletest/test/gtest_skip_check_output_test.py +59 -0
  504. package/cpp/leveldb/third_party/googletest/googletest/test/gtest_skip_environment_check_output_test.py +54 -0
  505. package/cpp/leveldb/third_party/googletest/googletest/test/gtest_skip_in_environment_setup_test.cc +49 -0
  506. package/cpp/leveldb/third_party/googletest/googletest/test/gtest_skip_test.cc +55 -0
  507. package/cpp/leveldb/third_party/googletest/googletest/test/gtest_sole_header_test.cc +56 -0
  508. package/cpp/leveldb/third_party/googletest/googletest/test/gtest_stress_test.cc +248 -0
  509. package/cpp/leveldb/third_party/googletest/googletest/test/gtest_test_macro_stack_footprint_test.cc +89 -0
  510. package/cpp/leveldb/third_party/googletest/googletest/test/gtest_test_utils.py +314 -0
  511. package/cpp/leveldb/third_party/googletest/googletest/test/gtest_testbridge_test.py +63 -0
  512. package/cpp/leveldb/third_party/googletest/googletest/test/gtest_testbridge_test_.cc +43 -0
  513. package/cpp/leveldb/third_party/googletest/googletest/test/gtest_throw_on_failure_ex_test.cc +90 -0
  514. package/cpp/leveldb/third_party/googletest/googletest/test/gtest_unittest.cc +7496 -0
  515. package/cpp/leveldb/third_party/googletest/googletest/test/gtest_xml_outfile1_test_.cc +43 -0
  516. package/cpp/leveldb/third_party/googletest/googletest/test/gtest_xml_outfile2_test_.cc +43 -0
  517. package/cpp/leveldb/third_party/googletest/googletest/test/gtest_xml_outfiles_test.py +135 -0
  518. package/cpp/leveldb/third_party/googletest/googletest/test/gtest_xml_output_unittest.py +389 -0
  519. package/cpp/leveldb/third_party/googletest/googletest/test/gtest_xml_output_unittest_.cc +188 -0
  520. package/cpp/leveldb/third_party/googletest/googletest/test/gtest_xml_test_utils.py +196 -0
  521. package/cpp/leveldb/third_party/googletest/googletest/test/production.cc +35 -0
  522. package/cpp/leveldb/third_party/googletest/googletest/test/production.h +54 -0
  523. package/cpp/leveldb/third_party/googletest/library.json +66 -0
  524. package/cpp/leveldb/third_party/googletest/platformio.ini +47 -0
  525. package/cpp/leveldb/util/arena.cc +66 -0
  526. package/cpp/leveldb/util/arena.h +71 -0
  527. package/cpp/leveldb/util/arena_test.cc +66 -0
  528. package/cpp/leveldb/util/bloom.cc +92 -0
  529. package/cpp/leveldb/util/bloom_test.cc +159 -0
  530. package/cpp/leveldb/util/cache.cc +401 -0
  531. package/cpp/leveldb/util/cache_test.cc +229 -0
  532. package/cpp/leveldb/util/coding.cc +166 -0
  533. package/cpp/leveldb/util/coding.h +122 -0
  534. package/cpp/leveldb/util/coding_test.cc +198 -0
  535. package/cpp/leveldb/util/comparator.cc +75 -0
  536. package/cpp/leveldb/util/crc32c.cc +380 -0
  537. package/cpp/leveldb/util/crc32c.h +43 -0
  538. package/cpp/leveldb/util/crc32c_test.cc +61 -0
  539. package/cpp/leveldb/util/env.cc +108 -0
  540. package/cpp/leveldb/util/env_posix.cc +893 -0
  541. package/cpp/leveldb/util/env_posix_test.cc +353 -0
  542. package/cpp/leveldb/util/env_posix_test_helper.h +28 -0
  543. package/cpp/leveldb/util/env_test.cc +240 -0
  544. package/cpp/leveldb/util/env_windows.cc +796 -0
  545. package/cpp/leveldb/util/env_windows_test.cc +65 -0
  546. package/cpp/leveldb/util/env_windows_test_helper.h +25 -0
  547. package/cpp/leveldb/util/filter_policy.cc +11 -0
  548. package/cpp/leveldb/util/hash.cc +55 -0
  549. package/cpp/leveldb/util/hash.h +19 -0
  550. package/cpp/leveldb/util/hash_test.cc +46 -0
  551. package/cpp/leveldb/util/histogram.cc +272 -0
  552. package/cpp/leveldb/util/histogram.h +44 -0
  553. package/cpp/leveldb/util/logging.cc +82 -0
  554. package/cpp/leveldb/util/logging.h +44 -0
  555. package/cpp/leveldb/util/logging_test.cc +145 -0
  556. package/cpp/leveldb/util/mutexlock.h +39 -0
  557. package/cpp/leveldb/util/no_destructor.h +46 -0
  558. package/cpp/leveldb/util/no_destructor_test.cc +49 -0
  559. package/cpp/leveldb/util/options.cc +14 -0
  560. package/cpp/leveldb/util/posix_logger.h +130 -0
  561. package/cpp/leveldb/util/random.h +63 -0
  562. package/cpp/leveldb/util/status.cc +77 -0
  563. package/cpp/leveldb/util/status_test.cc +44 -0
  564. package/cpp/leveldb/util/testutil.cc +51 -0
  565. package/cpp/leveldb/util/testutil.h +82 -0
  566. package/cpp/leveldb/util/windows_logger.h +124 -0
  567. package/cpp/react-native-leveldb.cpp +694 -0
  568. package/cpp/react-native-leveldb.h +4 -0
  569. package/ios/Leveldb.h +9 -0
  570. package/ios/Leveldb.mm +35 -0
  571. package/ios/Leveldb.xcodeproj/project.pbxproj +288 -0
  572. package/lib/commonjs/fake.js +181 -0
  573. package/lib/commonjs/fake.js.map +1 -0
  574. package/lib/commonjs/fake.test.js +30 -0
  575. package/lib/commonjs/fake.test.js.map +1 -0
  576. package/lib/commonjs/index.js +172 -0
  577. package/lib/commonjs/index.js.map +1 -0
  578. package/lib/commonjs/package.json +1 -0
  579. package/lib/module/fake.js +171 -0
  580. package/lib/module/fake.js.map +1 -0
  581. package/lib/module/fake.test.js +30 -0
  582. package/lib/module/fake.test.js.map +1 -0
  583. package/lib/module/index.js +165 -0
  584. package/lib/module/index.js.map +1 -0
  585. package/lib/typescript/fake.d.ts +34 -0
  586. package/lib/typescript/fake.d.ts.map +1 -0
  587. package/lib/typescript/fake.test.d.ts +2 -0
  588. package/lib/typescript/fake.test.d.ts.map +1 -0
  589. package/lib/typescript/index.d.ts +72 -0
  590. package/lib/typescript/index.d.ts.map +1 -0
  591. package/package.json +157 -0
  592. package/rn-leveldb.podspec +30 -0
  593. package/src/fake.test.ts +37 -0
  594. package/src/fake.ts +203 -0
  595. package/src/index.ts +291 -0
@@ -0,0 +1,1562 @@
1
+ // Copyright (c) 2011 The LevelDB Authors. All rights reserved.
2
+ // Use of this source code is governed by a BSD-style license that can be
3
+ // found in the LICENSE file. See the AUTHORS file for names of contributors.
4
+
5
+ #include "db/version_set.h"
6
+
7
+ #include <algorithm>
8
+ #include <cstdio>
9
+
10
+ #include "db/filename.h"
11
+ #include "db/log_reader.h"
12
+ #include "db/log_writer.h"
13
+ #include "db/memtable.h"
14
+ #include "db/table_cache.h"
15
+ #include "leveldb/env.h"
16
+ #include "leveldb/table_builder.h"
17
+ #include "table/merger.h"
18
+ #include "table/two_level_iterator.h"
19
+ #include "util/coding.h"
20
+ #include "util/logging.h"
21
+
22
+ namespace leveldb {
23
+
24
+ static size_t TargetFileSize(const Options* options) {
25
+ return options->max_file_size;
26
+ }
27
+
28
+ // Maximum bytes of overlaps in grandparent (i.e., level+2) before we
29
+ // stop building a single file in a level->level+1 compaction.
30
+ static int64_t MaxGrandParentOverlapBytes(const Options* options) {
31
+ return 10 * TargetFileSize(options);
32
+ }
33
+
34
+ // Maximum number of bytes in all compacted files. We avoid expanding
35
+ // the lower level file set of a compaction if it would make the
36
+ // total compaction cover more than this many bytes.
37
+ static int64_t ExpandedCompactionByteSizeLimit(const Options* options) {
38
+ return 25 * TargetFileSize(options);
39
+ }
40
+
41
+ static double MaxBytesForLevel(const Options* options, int level) {
42
+ // Note: the result for level zero is not really used since we set
43
+ // the level-0 compaction threshold based on number of files.
44
+
45
+ // Result for both level-0 and level-1
46
+ double result = 10. * 1048576.0;
47
+ while (level > 1) {
48
+ result *= 10;
49
+ level--;
50
+ }
51
+ return result;
52
+ }
53
+
54
+ static uint64_t MaxFileSizeForLevel(const Options* options, int level) {
55
+ // We could vary per level to reduce number of files?
56
+ return TargetFileSize(options);
57
+ }
58
+
59
+ static int64_t TotalFileSize(const std::vector<FileMetaData*>& files) {
60
+ int64_t sum = 0;
61
+ for (size_t i = 0; i < files.size(); i++) {
62
+ sum += files[i]->file_size;
63
+ }
64
+ return sum;
65
+ }
66
+
67
+ Version::~Version() {
68
+ assert(refs_ == 0);
69
+
70
+ // Remove from linked list
71
+ prev_->next_ = next_;
72
+ next_->prev_ = prev_;
73
+
74
+ // Drop references to files
75
+ for (int level = 0; level < config::kNumLevels; level++) {
76
+ for (size_t i = 0; i < files_[level].size(); i++) {
77
+ FileMetaData* f = files_[level][i];
78
+ assert(f->refs > 0);
79
+ f->refs--;
80
+ if (f->refs <= 0) {
81
+ delete f;
82
+ }
83
+ }
84
+ }
85
+ }
86
+
87
+ int FindFile(const InternalKeyComparator& icmp,
88
+ const std::vector<FileMetaData*>& files, const Slice& key) {
89
+ uint32_t left = 0;
90
+ uint32_t right = files.size();
91
+ while (left < right) {
92
+ uint32_t mid = (left + right) / 2;
93
+ const FileMetaData* f = files[mid];
94
+ if (icmp.InternalKeyComparator::Compare(f->largest.Encode(), key) < 0) {
95
+ // Key at "mid.largest" is < "target". Therefore all
96
+ // files at or before "mid" are uninteresting.
97
+ left = mid + 1;
98
+ } else {
99
+ // Key at "mid.largest" is >= "target". Therefore all files
100
+ // after "mid" are uninteresting.
101
+ right = mid;
102
+ }
103
+ }
104
+ return right;
105
+ }
106
+
107
+ static bool AfterFile(const Comparator* ucmp, const Slice* user_key,
108
+ const FileMetaData* f) {
109
+ // null user_key occurs before all keys and is therefore never after *f
110
+ return (user_key != nullptr &&
111
+ ucmp->Compare(*user_key, f->largest.user_key()) > 0);
112
+ }
113
+
114
+ static bool BeforeFile(const Comparator* ucmp, const Slice* user_key,
115
+ const FileMetaData* f) {
116
+ // null user_key occurs after all keys and is therefore never before *f
117
+ return (user_key != nullptr &&
118
+ ucmp->Compare(*user_key, f->smallest.user_key()) < 0);
119
+ }
120
+
121
+ bool SomeFileOverlapsRange(const InternalKeyComparator& icmp,
122
+ bool disjoint_sorted_files,
123
+ const std::vector<FileMetaData*>& files,
124
+ const Slice* smallest_user_key,
125
+ const Slice* largest_user_key) {
126
+ const Comparator* ucmp = icmp.user_comparator();
127
+ if (!disjoint_sorted_files) {
128
+ // Need to check against all files
129
+ for (size_t i = 0; i < files.size(); i++) {
130
+ const FileMetaData* f = files[i];
131
+ if (AfterFile(ucmp, smallest_user_key, f) ||
132
+ BeforeFile(ucmp, largest_user_key, f)) {
133
+ // No overlap
134
+ } else {
135
+ return true; // Overlap
136
+ }
137
+ }
138
+ return false;
139
+ }
140
+
141
+ // Binary search over file list
142
+ uint32_t index = 0;
143
+ if (smallest_user_key != nullptr) {
144
+ // Find the earliest possible internal key for smallest_user_key
145
+ InternalKey small_key(*smallest_user_key, kMaxSequenceNumber,
146
+ kValueTypeForSeek);
147
+ index = FindFile(icmp, files, small_key.Encode());
148
+ }
149
+
150
+ if (index >= files.size()) {
151
+ // beginning of range is after all files, so no overlap.
152
+ return false;
153
+ }
154
+
155
+ return !BeforeFile(ucmp, largest_user_key, files[index]);
156
+ }
157
+
158
+ // An internal iterator. For a given version/level pair, yields
159
+ // information about the files in the level. For a given entry, key()
160
+ // is the largest key that occurs in the file, and value() is an
161
+ // 16-byte value containing the file number and file size, both
162
+ // encoded using EncodeFixed64.
163
+ class Version::LevelFileNumIterator : public Iterator {
164
+ public:
165
+ LevelFileNumIterator(const InternalKeyComparator& icmp,
166
+ const std::vector<FileMetaData*>* flist)
167
+ : icmp_(icmp), flist_(flist), index_(flist->size()) { // Marks as invalid
168
+ }
169
+ bool Valid() const override { return index_ < flist_->size(); }
170
+ void Seek(const Slice& target) override {
171
+ index_ = FindFile(icmp_, *flist_, target);
172
+ }
173
+ void SeekToFirst() override { index_ = 0; }
174
+ void SeekToLast() override {
175
+ index_ = flist_->empty() ? 0 : flist_->size() - 1;
176
+ }
177
+ void Next() override {
178
+ assert(Valid());
179
+ index_++;
180
+ }
181
+ void Prev() override {
182
+ assert(Valid());
183
+ if (index_ == 0) {
184
+ index_ = flist_->size(); // Marks as invalid
185
+ } else {
186
+ index_--;
187
+ }
188
+ }
189
+ Slice key() const override {
190
+ assert(Valid());
191
+ return (*flist_)[index_]->largest.Encode();
192
+ }
193
+ Slice value() const override {
194
+ assert(Valid());
195
+ EncodeFixed64(value_buf_, (*flist_)[index_]->number);
196
+ EncodeFixed64(value_buf_ + 8, (*flist_)[index_]->file_size);
197
+ return Slice(value_buf_, sizeof(value_buf_));
198
+ }
199
+ Status status() const override { return Status::OK(); }
200
+
201
+ private:
202
+ const InternalKeyComparator icmp_;
203
+ const std::vector<FileMetaData*>* const flist_;
204
+ uint32_t index_;
205
+
206
+ // Backing store for value(). Holds the file number and size.
207
+ mutable char value_buf_[16];
208
+ };
209
+
210
+ static Iterator* GetFileIterator(void* arg, const ReadOptions& options,
211
+ const Slice& file_value) {
212
+ TableCache* cache = reinterpret_cast<TableCache*>(arg);
213
+ if (file_value.size() != 16) {
214
+ return NewErrorIterator(
215
+ Status::Corruption("FileReader invoked with unexpected value"));
216
+ } else {
217
+ return cache->NewIterator(options, DecodeFixed64(file_value.data()),
218
+ DecodeFixed64(file_value.data() + 8));
219
+ }
220
+ }
221
+
222
+ Iterator* Version::NewConcatenatingIterator(const ReadOptions& options,
223
+ int level) const {
224
+ return NewTwoLevelIterator(
225
+ new LevelFileNumIterator(vset_->icmp_, &files_[level]), &GetFileIterator,
226
+ vset_->table_cache_, options);
227
+ }
228
+
229
+ void Version::AddIterators(const ReadOptions& options,
230
+ std::vector<Iterator*>* iters) {
231
+ // Merge all level zero files together since they may overlap
232
+ for (size_t i = 0; i < files_[0].size(); i++) {
233
+ iters->push_back(vset_->table_cache_->NewIterator(
234
+ options, files_[0][i]->number, files_[0][i]->file_size));
235
+ }
236
+
237
+ // For levels > 0, we can use a concatenating iterator that sequentially
238
+ // walks through the non-overlapping files in the level, opening them
239
+ // lazily.
240
+ for (int level = 1; level < config::kNumLevels; level++) {
241
+ if (!files_[level].empty()) {
242
+ iters->push_back(NewConcatenatingIterator(options, level));
243
+ }
244
+ }
245
+ }
246
+
247
+ // Callback from TableCache::Get()
248
+ namespace {
249
+ enum SaverState {
250
+ kNotFound,
251
+ kFound,
252
+ kDeleted,
253
+ kCorrupt,
254
+ };
255
+ struct Saver {
256
+ SaverState state;
257
+ const Comparator* ucmp;
258
+ Slice user_key;
259
+ std::string* value;
260
+ };
261
+ } // namespace
262
+ static void SaveValue(void* arg, const Slice& ikey, const Slice& v) {
263
+ Saver* s = reinterpret_cast<Saver*>(arg);
264
+ ParsedInternalKey parsed_key;
265
+ if (!ParseInternalKey(ikey, &parsed_key)) {
266
+ s->state = kCorrupt;
267
+ } else {
268
+ if (s->ucmp->Compare(parsed_key.user_key, s->user_key) == 0) {
269
+ s->state = (parsed_key.type == kTypeValue) ? kFound : kDeleted;
270
+ if (s->state == kFound) {
271
+ s->value->assign(v.data(), v.size());
272
+ }
273
+ }
274
+ }
275
+ }
276
+
277
+ static bool NewestFirst(FileMetaData* a, FileMetaData* b) {
278
+ return a->number > b->number;
279
+ }
280
+
281
+ void Version::ForEachOverlapping(Slice user_key, Slice internal_key, void* arg,
282
+ bool (*func)(void*, int, FileMetaData*)) {
283
+ const Comparator* ucmp = vset_->icmp_.user_comparator();
284
+
285
+ // Search level-0 in order from newest to oldest.
286
+ std::vector<FileMetaData*> tmp;
287
+ tmp.reserve(files_[0].size());
288
+ for (uint32_t i = 0; i < files_[0].size(); i++) {
289
+ FileMetaData* f = files_[0][i];
290
+ if (ucmp->Compare(user_key, f->smallest.user_key()) >= 0 &&
291
+ ucmp->Compare(user_key, f->largest.user_key()) <= 0) {
292
+ tmp.push_back(f);
293
+ }
294
+ }
295
+ if (!tmp.empty()) {
296
+ std::sort(tmp.begin(), tmp.end(), NewestFirst);
297
+ for (uint32_t i = 0; i < tmp.size(); i++) {
298
+ if (!(*func)(arg, 0, tmp[i])) {
299
+ return;
300
+ }
301
+ }
302
+ }
303
+
304
+ // Search other levels.
305
+ for (int level = 1; level < config::kNumLevels; level++) {
306
+ size_t num_files = files_[level].size();
307
+ if (num_files == 0) continue;
308
+
309
+ // Binary search to find earliest index whose largest key >= internal_key.
310
+ uint32_t index = FindFile(vset_->icmp_, files_[level], internal_key);
311
+ if (index < num_files) {
312
+ FileMetaData* f = files_[level][index];
313
+ if (ucmp->Compare(user_key, f->smallest.user_key()) < 0) {
314
+ // All of "f" is past any data for user_key
315
+ } else {
316
+ if (!(*func)(arg, level, f)) {
317
+ return;
318
+ }
319
+ }
320
+ }
321
+ }
322
+ }
323
+
324
+ Status Version::Get(const ReadOptions& options, const LookupKey& k,
325
+ std::string* value, GetStats* stats) {
326
+ stats->seek_file = nullptr;
327
+ stats->seek_file_level = -1;
328
+
329
+ struct State {
330
+ Saver saver;
331
+ GetStats* stats;
332
+ const ReadOptions* options;
333
+ Slice ikey;
334
+ FileMetaData* last_file_read;
335
+ int last_file_read_level;
336
+
337
+ VersionSet* vset;
338
+ Status s;
339
+ bool found;
340
+
341
+ static bool Match(void* arg, int level, FileMetaData* f) {
342
+ State* state = reinterpret_cast<State*>(arg);
343
+
344
+ if (state->stats->seek_file == nullptr &&
345
+ state->last_file_read != nullptr) {
346
+ // We have had more than one seek for this read. Charge the 1st file.
347
+ state->stats->seek_file = state->last_file_read;
348
+ state->stats->seek_file_level = state->last_file_read_level;
349
+ }
350
+
351
+ state->last_file_read = f;
352
+ state->last_file_read_level = level;
353
+
354
+ state->s = state->vset->table_cache_->Get(*state->options, f->number,
355
+ f->file_size, state->ikey,
356
+ &state->saver, SaveValue);
357
+ if (!state->s.ok()) {
358
+ state->found = true;
359
+ return false;
360
+ }
361
+ switch (state->saver.state) {
362
+ case kNotFound:
363
+ return true; // Keep searching in other files
364
+ case kFound:
365
+ state->found = true;
366
+ return false;
367
+ case kDeleted:
368
+ return false;
369
+ case kCorrupt:
370
+ state->s =
371
+ Status::Corruption("corrupted key for ", state->saver.user_key);
372
+ state->found = true;
373
+ return false;
374
+ }
375
+
376
+ // Not reached. Added to avoid false compilation warnings of
377
+ // "control reaches end of non-void function".
378
+ return false;
379
+ }
380
+ };
381
+
382
+ State state;
383
+ state.found = false;
384
+ state.stats = stats;
385
+ state.last_file_read = nullptr;
386
+ state.last_file_read_level = -1;
387
+
388
+ state.options = &options;
389
+ state.ikey = k.internal_key();
390
+ state.vset = vset_;
391
+
392
+ state.saver.state = kNotFound;
393
+ state.saver.ucmp = vset_->icmp_.user_comparator();
394
+ state.saver.user_key = k.user_key();
395
+ state.saver.value = value;
396
+
397
+ ForEachOverlapping(state.saver.user_key, state.ikey, &state, &State::Match);
398
+
399
+ return state.found ? state.s : Status::NotFound(Slice());
400
+ }
401
+
402
+ bool Version::UpdateStats(const GetStats& stats) {
403
+ FileMetaData* f = stats.seek_file;
404
+ if (f != nullptr) {
405
+ f->allowed_seeks--;
406
+ if (f->allowed_seeks <= 0 && file_to_compact_ == nullptr) {
407
+ file_to_compact_ = f;
408
+ file_to_compact_level_ = stats.seek_file_level;
409
+ return true;
410
+ }
411
+ }
412
+ return false;
413
+ }
414
+
415
+ bool Version::RecordReadSample(Slice internal_key) {
416
+ ParsedInternalKey ikey;
417
+ if (!ParseInternalKey(internal_key, &ikey)) {
418
+ return false;
419
+ }
420
+
421
+ struct State {
422
+ GetStats stats; // Holds first matching file
423
+ int matches;
424
+
425
+ static bool Match(void* arg, int level, FileMetaData* f) {
426
+ State* state = reinterpret_cast<State*>(arg);
427
+ state->matches++;
428
+ if (state->matches == 1) {
429
+ // Remember first match.
430
+ state->stats.seek_file = f;
431
+ state->stats.seek_file_level = level;
432
+ }
433
+ // We can stop iterating once we have a second match.
434
+ return state->matches < 2;
435
+ }
436
+ };
437
+
438
+ State state;
439
+ state.matches = 0;
440
+ ForEachOverlapping(ikey.user_key, internal_key, &state, &State::Match);
441
+
442
+ // Must have at least two matches since we want to merge across
443
+ // files. But what if we have a single file that contains many
444
+ // overwrites and deletions? Should we have another mechanism for
445
+ // finding such files?
446
+ if (state.matches >= 2) {
447
+ // 1MB cost is about 1 seek (see comment in Builder::Apply).
448
+ return UpdateStats(state.stats);
449
+ }
450
+ return false;
451
+ }
452
+
453
+ void Version::Ref() { ++refs_; }
454
+
455
+ void Version::Unref() {
456
+ assert(this != &vset_->dummy_versions_);
457
+ assert(refs_ >= 1);
458
+ --refs_;
459
+ if (refs_ == 0) {
460
+ delete this;
461
+ }
462
+ }
463
+
464
+ bool Version::OverlapInLevel(int level, const Slice* smallest_user_key,
465
+ const Slice* largest_user_key) {
466
+ return SomeFileOverlapsRange(vset_->icmp_, (level > 0), files_[level],
467
+ smallest_user_key, largest_user_key);
468
+ }
469
+
470
+ int Version::PickLevelForMemTableOutput(const Slice& smallest_user_key,
471
+ const Slice& largest_user_key) {
472
+ int level = 0;
473
+ if (!OverlapInLevel(0, &smallest_user_key, &largest_user_key)) {
474
+ // Push to next level if there is no overlap in next level,
475
+ // and the #bytes overlapping in the level after that are limited.
476
+ InternalKey start(smallest_user_key, kMaxSequenceNumber, kValueTypeForSeek);
477
+ InternalKey limit(largest_user_key, 0, static_cast<ValueType>(0));
478
+ std::vector<FileMetaData*> overlaps;
479
+ while (level < config::kMaxMemCompactLevel) {
480
+ if (OverlapInLevel(level + 1, &smallest_user_key, &largest_user_key)) {
481
+ break;
482
+ }
483
+ if (level + 2 < config::kNumLevels) {
484
+ // Check that file does not overlap too many grandparent bytes.
485
+ GetOverlappingInputs(level + 2, &start, &limit, &overlaps);
486
+ const int64_t sum = TotalFileSize(overlaps);
487
+ if (sum > MaxGrandParentOverlapBytes(vset_->options_)) {
488
+ break;
489
+ }
490
+ }
491
+ level++;
492
+ }
493
+ }
494
+ return level;
495
+ }
496
+
497
+ // Store in "*inputs" all files in "level" that overlap [begin,end]
498
+ void Version::GetOverlappingInputs(int level, const InternalKey* begin,
499
+ const InternalKey* end,
500
+ std::vector<FileMetaData*>* inputs) {
501
+ assert(level >= 0);
502
+ assert(level < config::kNumLevels);
503
+ inputs->clear();
504
+ Slice user_begin, user_end;
505
+ if (begin != nullptr) {
506
+ user_begin = begin->user_key();
507
+ }
508
+ if (end != nullptr) {
509
+ user_end = end->user_key();
510
+ }
511
+ const Comparator* user_cmp = vset_->icmp_.user_comparator();
512
+ for (size_t i = 0; i < files_[level].size();) {
513
+ FileMetaData* f = files_[level][i++];
514
+ const Slice file_start = f->smallest.user_key();
515
+ const Slice file_limit = f->largest.user_key();
516
+ if (begin != nullptr && user_cmp->Compare(file_limit, user_begin) < 0) {
517
+ // "f" is completely before specified range; skip it
518
+ } else if (end != nullptr && user_cmp->Compare(file_start, user_end) > 0) {
519
+ // "f" is completely after specified range; skip it
520
+ } else {
521
+ inputs->push_back(f);
522
+ if (level == 0) {
523
+ // Level-0 files may overlap each other. So check if the newly
524
+ // added file has expanded the range. If so, restart search.
525
+ if (begin != nullptr && user_cmp->Compare(file_start, user_begin) < 0) {
526
+ user_begin = file_start;
527
+ inputs->clear();
528
+ i = 0;
529
+ } else if (end != nullptr &&
530
+ user_cmp->Compare(file_limit, user_end) > 0) {
531
+ user_end = file_limit;
532
+ inputs->clear();
533
+ i = 0;
534
+ }
535
+ }
536
+ }
537
+ }
538
+ }
539
+
540
+ std::string Version::DebugString() const {
541
+ std::string r;
542
+ for (int level = 0; level < config::kNumLevels; level++) {
543
+ // E.g.,
544
+ // --- level 1 ---
545
+ // 17:123['a' .. 'd']
546
+ // 20:43['e' .. 'g']
547
+ r.append("--- level ");
548
+ AppendNumberTo(&r, level);
549
+ r.append(" ---\n");
550
+ const std::vector<FileMetaData*>& files = files_[level];
551
+ for (size_t i = 0; i < files.size(); i++) {
552
+ r.push_back(' ');
553
+ AppendNumberTo(&r, files[i]->number);
554
+ r.push_back(':');
555
+ AppendNumberTo(&r, files[i]->file_size);
556
+ r.append("[");
557
+ r.append(files[i]->smallest.DebugString());
558
+ r.append(" .. ");
559
+ r.append(files[i]->largest.DebugString());
560
+ r.append("]\n");
561
+ }
562
+ }
563
+ return r;
564
+ }
565
+
566
+ // A helper class so we can efficiently apply a whole sequence
567
+ // of edits to a particular state without creating intermediate
568
+ // Versions that contain full copies of the intermediate state.
569
+ class VersionSet::Builder {
570
+ private:
571
+ // Helper to sort by v->files_[file_number].smallest
572
+ struct BySmallestKey {
573
+ const InternalKeyComparator* internal_comparator;
574
+
575
+ bool operator()(FileMetaData* f1, FileMetaData* f2) const {
576
+ int r = internal_comparator->Compare(f1->smallest, f2->smallest);
577
+ if (r != 0) {
578
+ return (r < 0);
579
+ } else {
580
+ // Break ties by file number
581
+ return (f1->number < f2->number);
582
+ }
583
+ }
584
+ };
585
+
586
+ typedef std::set<FileMetaData*, BySmallestKey> FileSet;
587
+ struct LevelState {
588
+ std::set<uint64_t> deleted_files;
589
+ FileSet* added_files;
590
+ };
591
+
592
+ VersionSet* vset_;
593
+ Version* base_;
594
+ LevelState levels_[config::kNumLevels];
595
+
596
+ public:
597
+ // Initialize a builder with the files from *base and other info from *vset
598
+ Builder(VersionSet* vset, Version* base) : vset_(vset), base_(base) {
599
+ base_->Ref();
600
+ BySmallestKey cmp;
601
+ cmp.internal_comparator = &vset_->icmp_;
602
+ for (int level = 0; level < config::kNumLevels; level++) {
603
+ levels_[level].added_files = new FileSet(cmp);
604
+ }
605
+ }
606
+
607
+ ~Builder() {
608
+ for (int level = 0; level < config::kNumLevels; level++) {
609
+ const FileSet* added = levels_[level].added_files;
610
+ std::vector<FileMetaData*> to_unref;
611
+ to_unref.reserve(added->size());
612
+ for (FileSet::const_iterator it = added->begin(); it != added->end();
613
+ ++it) {
614
+ to_unref.push_back(*it);
615
+ }
616
+ delete added;
617
+ for (uint32_t i = 0; i < to_unref.size(); i++) {
618
+ FileMetaData* f = to_unref[i];
619
+ f->refs--;
620
+ if (f->refs <= 0) {
621
+ delete f;
622
+ }
623
+ }
624
+ }
625
+ base_->Unref();
626
+ }
627
+
628
+ // Apply all of the edits in *edit to the current state.
629
+ void Apply(VersionEdit* edit) {
630
+ // Update compaction pointers
631
+ for (size_t i = 0; i < edit->compact_pointers_.size(); i++) {
632
+ const int level = edit->compact_pointers_[i].first;
633
+ vset_->compact_pointer_[level] =
634
+ edit->compact_pointers_[i].second.Encode().ToString();
635
+ }
636
+
637
+ // Delete files
638
+ for (const auto& deleted_file_set_kvp : edit->deleted_files_) {
639
+ const int level = deleted_file_set_kvp.first;
640
+ const uint64_t number = deleted_file_set_kvp.second;
641
+ levels_[level].deleted_files.insert(number);
642
+ }
643
+
644
+ // Add new files
645
+ for (size_t i = 0; i < edit->new_files_.size(); i++) {
646
+ const int level = edit->new_files_[i].first;
647
+ FileMetaData* f = new FileMetaData(edit->new_files_[i].second);
648
+ f->refs = 1;
649
+
650
+ // We arrange to automatically compact this file after
651
+ // a certain number of seeks. Let's assume:
652
+ // (1) One seek costs 10ms
653
+ // (2) Writing or reading 1MB costs 10ms (100MB/s)
654
+ // (3) A compaction of 1MB does 25MB of IO:
655
+ // 1MB read from this level
656
+ // 10-12MB read from next level (boundaries may be misaligned)
657
+ // 10-12MB written to next level
658
+ // This implies that 25 seeks cost the same as the compaction
659
+ // of 1MB of data. I.e., one seek costs approximately the
660
+ // same as the compaction of 40KB of data. We are a little
661
+ // conservative and allow approximately one seek for every 16KB
662
+ // of data before triggering a compaction.
663
+ f->allowed_seeks = static_cast<int>((f->file_size / 16384U));
664
+ if (f->allowed_seeks < 100) f->allowed_seeks = 100;
665
+
666
+ levels_[level].deleted_files.erase(f->number);
667
+ levels_[level].added_files->insert(f);
668
+ }
669
+ }
670
+
671
+ // Save the current state in *v.
672
+ void SaveTo(Version* v) {
673
+ BySmallestKey cmp;
674
+ cmp.internal_comparator = &vset_->icmp_;
675
+ for (int level = 0; level < config::kNumLevels; level++) {
676
+ // Merge the set of added files with the set of pre-existing files.
677
+ // Drop any deleted files. Store the result in *v.
678
+ const std::vector<FileMetaData*>& base_files = base_->files_[level];
679
+ std::vector<FileMetaData*>::const_iterator base_iter = base_files.begin();
680
+ std::vector<FileMetaData*>::const_iterator base_end = base_files.end();
681
+ const FileSet* added_files = levels_[level].added_files;
682
+ v->files_[level].reserve(base_files.size() + added_files->size());
683
+ for (const auto& added_file : *added_files) {
684
+ // Add all smaller files listed in base_
685
+ for (std::vector<FileMetaData*>::const_iterator bpos =
686
+ std::upper_bound(base_iter, base_end, added_file, cmp);
687
+ base_iter != bpos; ++base_iter) {
688
+ MaybeAddFile(v, level, *base_iter);
689
+ }
690
+
691
+ MaybeAddFile(v, level, added_file);
692
+ }
693
+
694
+ // Add remaining base files
695
+ for (; base_iter != base_end; ++base_iter) {
696
+ MaybeAddFile(v, level, *base_iter);
697
+ }
698
+
699
+ #ifndef NDEBUG
700
+ // Make sure there is no overlap in levels > 0
701
+ if (level > 0) {
702
+ for (uint32_t i = 1; i < v->files_[level].size(); i++) {
703
+ const InternalKey& prev_end = v->files_[level][i - 1]->largest;
704
+ const InternalKey& this_begin = v->files_[level][i]->smallest;
705
+ if (vset_->icmp_.Compare(prev_end, this_begin) >= 0) {
706
+ std::fprintf(stderr, "overlapping ranges in same level %s vs. %s\n",
707
+ prev_end.DebugString().c_str(),
708
+ this_begin.DebugString().c_str());
709
+ std::abort();
710
+ }
711
+ }
712
+ }
713
+ #endif
714
+ }
715
+ }
716
+
717
+ void MaybeAddFile(Version* v, int level, FileMetaData* f) {
718
+ if (levels_[level].deleted_files.count(f->number) > 0) {
719
+ // File is deleted: do nothing
720
+ } else {
721
+ std::vector<FileMetaData*>* files = &v->files_[level];
722
+ if (level > 0 && !files->empty()) {
723
+ // Must not overlap
724
+ assert(vset_->icmp_.Compare((*files)[files->size() - 1]->largest,
725
+ f->smallest) < 0);
726
+ }
727
+ f->refs++;
728
+ files->push_back(f);
729
+ }
730
+ }
731
+ };
732
+
733
+ VersionSet::VersionSet(const std::string& dbname, const Options* options,
734
+ TableCache* table_cache,
735
+ const InternalKeyComparator* cmp)
736
+ : env_(options->env),
737
+ dbname_(dbname),
738
+ options_(options),
739
+ table_cache_(table_cache),
740
+ icmp_(*cmp),
741
+ next_file_number_(2),
742
+ manifest_file_number_(0), // Filled by Recover()
743
+ last_sequence_(0),
744
+ log_number_(0),
745
+ prev_log_number_(0),
746
+ descriptor_file_(nullptr),
747
+ descriptor_log_(nullptr),
748
+ dummy_versions_(this),
749
+ current_(nullptr) {
750
+ AppendVersion(new Version(this));
751
+ }
752
+
753
+ VersionSet::~VersionSet() {
754
+ current_->Unref();
755
+ assert(dummy_versions_.next_ == &dummy_versions_); // List must be empty
756
+ delete descriptor_log_;
757
+ delete descriptor_file_;
758
+ }
759
+
760
+ void VersionSet::AppendVersion(Version* v) {
761
+ // Make "v" current
762
+ assert(v->refs_ == 0);
763
+ assert(v != current_);
764
+ if (current_ != nullptr) {
765
+ current_->Unref();
766
+ }
767
+ current_ = v;
768
+ v->Ref();
769
+
770
+ // Append to linked list
771
+ v->prev_ = dummy_versions_.prev_;
772
+ v->next_ = &dummy_versions_;
773
+ v->prev_->next_ = v;
774
+ v->next_->prev_ = v;
775
+ }
776
+
777
+ Status VersionSet::LogAndApply(VersionEdit* edit, port::Mutex* mu) {
778
+ if (edit->has_log_number_) {
779
+ assert(edit->log_number_ >= log_number_);
780
+ assert(edit->log_number_ < next_file_number_);
781
+ } else {
782
+ edit->SetLogNumber(log_number_);
783
+ }
784
+
785
+ if (!edit->has_prev_log_number_) {
786
+ edit->SetPrevLogNumber(prev_log_number_);
787
+ }
788
+
789
+ edit->SetNextFile(next_file_number_);
790
+ edit->SetLastSequence(last_sequence_);
791
+
792
+ Version* v = new Version(this);
793
+ {
794
+ Builder builder(this, current_);
795
+ builder.Apply(edit);
796
+ builder.SaveTo(v);
797
+ }
798
+ Finalize(v);
799
+
800
+ // Initialize new descriptor log file if necessary by creating
801
+ // a temporary file that contains a snapshot of the current version.
802
+ std::string new_manifest_file;
803
+ Status s;
804
+ if (descriptor_log_ == nullptr) {
805
+ // No reason to unlock *mu here since we only hit this path in the
806
+ // first call to LogAndApply (when opening the database).
807
+ assert(descriptor_file_ == nullptr);
808
+ new_manifest_file = DescriptorFileName(dbname_, manifest_file_number_);
809
+ edit->SetNextFile(next_file_number_);
810
+ s = env_->NewWritableFile(new_manifest_file, &descriptor_file_);
811
+ if (s.ok()) {
812
+ descriptor_log_ = new log::Writer(descriptor_file_);
813
+ s = WriteSnapshot(descriptor_log_);
814
+ }
815
+ }
816
+
817
+ // Unlock during expensive MANIFEST log write
818
+ {
819
+ mu->Unlock();
820
+
821
+ // Write new record to MANIFEST log
822
+ if (s.ok()) {
823
+ std::string record;
824
+ edit->EncodeTo(&record);
825
+ s = descriptor_log_->AddRecord(record);
826
+ if (s.ok()) {
827
+ s = descriptor_file_->Sync();
828
+ }
829
+ if (!s.ok()) {
830
+ Log(options_->info_log, "MANIFEST write: %s\n", s.ToString().c_str());
831
+ }
832
+ }
833
+
834
+ // If we just created a new descriptor file, install it by writing a
835
+ // new CURRENT file that points to it.
836
+ if (s.ok() && !new_manifest_file.empty()) {
837
+ s = SetCurrentFile(env_, dbname_, manifest_file_number_);
838
+ }
839
+
840
+ mu->Lock();
841
+ }
842
+
843
+ // Install the new version
844
+ if (s.ok()) {
845
+ AppendVersion(v);
846
+ log_number_ = edit->log_number_;
847
+ prev_log_number_ = edit->prev_log_number_;
848
+ } else {
849
+ delete v;
850
+ if (!new_manifest_file.empty()) {
851
+ delete descriptor_log_;
852
+ delete descriptor_file_;
853
+ descriptor_log_ = nullptr;
854
+ descriptor_file_ = nullptr;
855
+ env_->RemoveFile(new_manifest_file);
856
+ }
857
+ }
858
+
859
+ return s;
860
+ }
861
+
862
+ Status VersionSet::Recover(bool* save_manifest) {
863
+ struct LogReporter : public log::Reader::Reporter {
864
+ Status* status;
865
+ void Corruption(size_t bytes, const Status& s) override {
866
+ if (this->status->ok()) *this->status = s;
867
+ }
868
+ };
869
+
870
+ // Read "CURRENT" file, which contains a pointer to the current manifest file
871
+ std::string current;
872
+ Status s = ReadFileToString(env_, CurrentFileName(dbname_), &current);
873
+ if (!s.ok()) {
874
+ return s;
875
+ }
876
+ if (current.empty() || current[current.size() - 1] != '\n') {
877
+ return Status::Corruption("CURRENT file does not end with newline");
878
+ }
879
+ current.resize(current.size() - 1);
880
+
881
+ std::string dscname = dbname_ + "/" + current;
882
+ SequentialFile* file;
883
+ s = env_->NewSequentialFile(dscname, &file);
884
+ if (!s.ok()) {
885
+ if (s.IsNotFound()) {
886
+ return Status::Corruption("CURRENT points to a non-existent file",
887
+ s.ToString());
888
+ }
889
+ return s;
890
+ }
891
+
892
+ bool have_log_number = false;
893
+ bool have_prev_log_number = false;
894
+ bool have_next_file = false;
895
+ bool have_last_sequence = false;
896
+ uint64_t next_file = 0;
897
+ uint64_t last_sequence = 0;
898
+ uint64_t log_number = 0;
899
+ uint64_t prev_log_number = 0;
900
+ Builder builder(this, current_);
901
+
902
+ {
903
+ LogReporter reporter;
904
+ reporter.status = &s;
905
+ log::Reader reader(file, &reporter, true /*checksum*/,
906
+ 0 /*initial_offset*/);
907
+ Slice record;
908
+ std::string scratch;
909
+ while (reader.ReadRecord(&record, &scratch) && s.ok()) {
910
+ VersionEdit edit;
911
+ s = edit.DecodeFrom(record);
912
+ if (s.ok()) {
913
+ if (edit.has_comparator_ &&
914
+ edit.comparator_ != icmp_.user_comparator()->Name()) {
915
+ s = Status::InvalidArgument(
916
+ edit.comparator_ + " does not match existing comparator ",
917
+ icmp_.user_comparator()->Name());
918
+ }
919
+ }
920
+
921
+ if (s.ok()) {
922
+ builder.Apply(&edit);
923
+ }
924
+
925
+ if (edit.has_log_number_) {
926
+ log_number = edit.log_number_;
927
+ have_log_number = true;
928
+ }
929
+
930
+ if (edit.has_prev_log_number_) {
931
+ prev_log_number = edit.prev_log_number_;
932
+ have_prev_log_number = true;
933
+ }
934
+
935
+ if (edit.has_next_file_number_) {
936
+ next_file = edit.next_file_number_;
937
+ have_next_file = true;
938
+ }
939
+
940
+ if (edit.has_last_sequence_) {
941
+ last_sequence = edit.last_sequence_;
942
+ have_last_sequence = true;
943
+ }
944
+ }
945
+ }
946
+ delete file;
947
+ file = nullptr;
948
+
949
+ if (s.ok()) {
950
+ if (!have_next_file) {
951
+ s = Status::Corruption("no meta-nextfile entry in descriptor");
952
+ } else if (!have_log_number) {
953
+ s = Status::Corruption("no meta-lognumber entry in descriptor");
954
+ } else if (!have_last_sequence) {
955
+ s = Status::Corruption("no last-sequence-number entry in descriptor");
956
+ }
957
+
958
+ if (!have_prev_log_number) {
959
+ prev_log_number = 0;
960
+ }
961
+
962
+ MarkFileNumberUsed(prev_log_number);
963
+ MarkFileNumberUsed(log_number);
964
+ }
965
+
966
+ if (s.ok()) {
967
+ Version* v = new Version(this);
968
+ builder.SaveTo(v);
969
+ // Install recovered version
970
+ Finalize(v);
971
+ AppendVersion(v);
972
+ manifest_file_number_ = next_file;
973
+ next_file_number_ = next_file + 1;
974
+ last_sequence_ = last_sequence;
975
+ log_number_ = log_number;
976
+ prev_log_number_ = prev_log_number;
977
+
978
+ // See if we can reuse the existing MANIFEST file.
979
+ if (ReuseManifest(dscname, current)) {
980
+ // No need to save new manifest
981
+ } else {
982
+ *save_manifest = true;
983
+ }
984
+ }
985
+
986
+ return s;
987
+ }
988
+
989
+ bool VersionSet::ReuseManifest(const std::string& dscname,
990
+ const std::string& dscbase) {
991
+ if (!options_->reuse_logs) {
992
+ return false;
993
+ }
994
+ FileType manifest_type;
995
+ uint64_t manifest_number;
996
+ uint64_t manifest_size;
997
+ if (!ParseFileName(dscbase, &manifest_number, &manifest_type) ||
998
+ manifest_type != kDescriptorFile ||
999
+ !env_->GetFileSize(dscname, &manifest_size).ok() ||
1000
+ // Make new compacted MANIFEST if old one is too big
1001
+ manifest_size >= TargetFileSize(options_)) {
1002
+ return false;
1003
+ }
1004
+
1005
+ assert(descriptor_file_ == nullptr);
1006
+ assert(descriptor_log_ == nullptr);
1007
+ Status r = env_->NewAppendableFile(dscname, &descriptor_file_);
1008
+ if (!r.ok()) {
1009
+ Log(options_->info_log, "Reuse MANIFEST: %s\n", r.ToString().c_str());
1010
+ assert(descriptor_file_ == nullptr);
1011
+ return false;
1012
+ }
1013
+
1014
+ Log(options_->info_log, "Reusing MANIFEST %s\n", dscname.c_str());
1015
+ descriptor_log_ = new log::Writer(descriptor_file_, manifest_size);
1016
+ manifest_file_number_ = manifest_number;
1017
+ return true;
1018
+ }
1019
+
1020
+ void VersionSet::MarkFileNumberUsed(uint64_t number) {
1021
+ if (next_file_number_ <= number) {
1022
+ next_file_number_ = number + 1;
1023
+ }
1024
+ }
1025
+
1026
+ void VersionSet::Finalize(Version* v) {
1027
+ // Precomputed best level for next compaction
1028
+ int best_level = -1;
1029
+ double best_score = -1;
1030
+
1031
+ for (int level = 0; level < config::kNumLevels - 1; level++) {
1032
+ double score;
1033
+ if (level == 0) {
1034
+ // We treat level-0 specially by bounding the number of files
1035
+ // instead of number of bytes for two reasons:
1036
+ //
1037
+ // (1) With larger write-buffer sizes, it is nice not to do too
1038
+ // many level-0 compactions.
1039
+ //
1040
+ // (2) The files in level-0 are merged on every read and
1041
+ // therefore we wish to avoid too many files when the individual
1042
+ // file size is small (perhaps because of a small write-buffer
1043
+ // setting, or very high compression ratios, or lots of
1044
+ // overwrites/deletions).
1045
+ score = v->files_[level].size() /
1046
+ static_cast<double>(config::kL0_CompactionTrigger);
1047
+ } else {
1048
+ // Compute the ratio of current size to size limit.
1049
+ const uint64_t level_bytes = TotalFileSize(v->files_[level]);
1050
+ score =
1051
+ static_cast<double>(level_bytes) / MaxBytesForLevel(options_, level);
1052
+ }
1053
+
1054
+ if (score > best_score) {
1055
+ best_level = level;
1056
+ best_score = score;
1057
+ }
1058
+ }
1059
+
1060
+ v->compaction_level_ = best_level;
1061
+ v->compaction_score_ = best_score;
1062
+ }
1063
+
1064
+ Status VersionSet::WriteSnapshot(log::Writer* log) {
1065
+ // TODO: Break up into multiple records to reduce memory usage on recovery?
1066
+
1067
+ // Save metadata
1068
+ VersionEdit edit;
1069
+ edit.SetComparatorName(icmp_.user_comparator()->Name());
1070
+
1071
+ // Save compaction pointers
1072
+ for (int level = 0; level < config::kNumLevels; level++) {
1073
+ if (!compact_pointer_[level].empty()) {
1074
+ InternalKey key;
1075
+ key.DecodeFrom(compact_pointer_[level]);
1076
+ edit.SetCompactPointer(level, key);
1077
+ }
1078
+ }
1079
+
1080
+ // Save files
1081
+ for (int level = 0; level < config::kNumLevels; level++) {
1082
+ const std::vector<FileMetaData*>& files = current_->files_[level];
1083
+ for (size_t i = 0; i < files.size(); i++) {
1084
+ const FileMetaData* f = files[i];
1085
+ edit.AddFile(level, f->number, f->file_size, f->smallest, f->largest);
1086
+ }
1087
+ }
1088
+
1089
+ std::string record;
1090
+ edit.EncodeTo(&record);
1091
+ return log->AddRecord(record);
1092
+ }
1093
+
1094
+ int VersionSet::NumLevelFiles(int level) const {
1095
+ assert(level >= 0);
1096
+ assert(level < config::kNumLevels);
1097
+ return current_->files_[level].size();
1098
+ }
1099
+
1100
+ const char* VersionSet::LevelSummary(LevelSummaryStorage* scratch) const {
1101
+ // Update code if kNumLevels changes
1102
+ static_assert(config::kNumLevels == 7, "");
1103
+ std::snprintf(
1104
+ scratch->buffer, sizeof(scratch->buffer), "files[ %d %d %d %d %d %d %d ]",
1105
+ int(current_->files_[0].size()), int(current_->files_[1].size()),
1106
+ int(current_->files_[2].size()), int(current_->files_[3].size()),
1107
+ int(current_->files_[4].size()), int(current_->files_[5].size()),
1108
+ int(current_->files_[6].size()));
1109
+ return scratch->buffer;
1110
+ }
1111
+
1112
+ uint64_t VersionSet::ApproximateOffsetOf(Version* v, const InternalKey& ikey) {
1113
+ uint64_t result = 0;
1114
+ for (int level = 0; level < config::kNumLevels; level++) {
1115
+ const std::vector<FileMetaData*>& files = v->files_[level];
1116
+ for (size_t i = 0; i < files.size(); i++) {
1117
+ if (icmp_.Compare(files[i]->largest, ikey) <= 0) {
1118
+ // Entire file is before "ikey", so just add the file size
1119
+ result += files[i]->file_size;
1120
+ } else if (icmp_.Compare(files[i]->smallest, ikey) > 0) {
1121
+ // Entire file is after "ikey", so ignore
1122
+ if (level > 0) {
1123
+ // Files other than level 0 are sorted by meta->smallest, so
1124
+ // no further files in this level will contain data for
1125
+ // "ikey".
1126
+ break;
1127
+ }
1128
+ } else {
1129
+ // "ikey" falls in the range for this table. Add the
1130
+ // approximate offset of "ikey" within the table.
1131
+ Table* tableptr;
1132
+ Iterator* iter = table_cache_->NewIterator(
1133
+ ReadOptions(), files[i]->number, files[i]->file_size, &tableptr);
1134
+ if (tableptr != nullptr) {
1135
+ result += tableptr->ApproximateOffsetOf(ikey.Encode());
1136
+ }
1137
+ delete iter;
1138
+ }
1139
+ }
1140
+ }
1141
+ return result;
1142
+ }
1143
+
1144
+ void VersionSet::AddLiveFiles(std::set<uint64_t>* live) {
1145
+ for (Version* v = dummy_versions_.next_; v != &dummy_versions_;
1146
+ v = v->next_) {
1147
+ for (int level = 0; level < config::kNumLevels; level++) {
1148
+ const std::vector<FileMetaData*>& files = v->files_[level];
1149
+ for (size_t i = 0; i < files.size(); i++) {
1150
+ live->insert(files[i]->number);
1151
+ }
1152
+ }
1153
+ }
1154
+ }
1155
+
1156
+ int64_t VersionSet::NumLevelBytes(int level) const {
1157
+ assert(level >= 0);
1158
+ assert(level < config::kNumLevels);
1159
+ return TotalFileSize(current_->files_[level]);
1160
+ }
1161
+
1162
+ int64_t VersionSet::MaxNextLevelOverlappingBytes() {
1163
+ int64_t result = 0;
1164
+ std::vector<FileMetaData*> overlaps;
1165
+ for (int level = 1; level < config::kNumLevels - 1; level++) {
1166
+ for (size_t i = 0; i < current_->files_[level].size(); i++) {
1167
+ const FileMetaData* f = current_->files_[level][i];
1168
+ current_->GetOverlappingInputs(level + 1, &f->smallest, &f->largest,
1169
+ &overlaps);
1170
+ const int64_t sum = TotalFileSize(overlaps);
1171
+ if (sum > result) {
1172
+ result = sum;
1173
+ }
1174
+ }
1175
+ }
1176
+ return result;
1177
+ }
1178
+
1179
+ // Stores the minimal range that covers all entries in inputs in
1180
+ // *smallest, *largest.
1181
+ // REQUIRES: inputs is not empty
1182
+ void VersionSet::GetRange(const std::vector<FileMetaData*>& inputs,
1183
+ InternalKey* smallest, InternalKey* largest) {
1184
+ assert(!inputs.empty());
1185
+ smallest->Clear();
1186
+ largest->Clear();
1187
+ for (size_t i = 0; i < inputs.size(); i++) {
1188
+ FileMetaData* f = inputs[i];
1189
+ if (i == 0) {
1190
+ *smallest = f->smallest;
1191
+ *largest = f->largest;
1192
+ } else {
1193
+ if (icmp_.Compare(f->smallest, *smallest) < 0) {
1194
+ *smallest = f->smallest;
1195
+ }
1196
+ if (icmp_.Compare(f->largest, *largest) > 0) {
1197
+ *largest = f->largest;
1198
+ }
1199
+ }
1200
+ }
1201
+ }
1202
+
1203
+ // Stores the minimal range that covers all entries in inputs1 and inputs2
1204
+ // in *smallest, *largest.
1205
+ // REQUIRES: inputs is not empty
1206
+ void VersionSet::GetRange2(const std::vector<FileMetaData*>& inputs1,
1207
+ const std::vector<FileMetaData*>& inputs2,
1208
+ InternalKey* smallest, InternalKey* largest) {
1209
+ std::vector<FileMetaData*> all = inputs1;
1210
+ all.insert(all.end(), inputs2.begin(), inputs2.end());
1211
+ GetRange(all, smallest, largest);
1212
+ }
1213
+
1214
+ Iterator* VersionSet::MakeInputIterator(Compaction* c) {
1215
+ ReadOptions options;
1216
+ options.verify_checksums = options_->paranoid_checks;
1217
+ options.fill_cache = false;
1218
+
1219
+ // Level-0 files have to be merged together. For other levels,
1220
+ // we will make a concatenating iterator per level.
1221
+ // TODO(opt): use concatenating iterator for level-0 if there is no overlap
1222
+ const int space = (c->level() == 0 ? c->inputs_[0].size() + 1 : 2);
1223
+ Iterator** list = new Iterator*[space];
1224
+ int num = 0;
1225
+ for (int which = 0; which < 2; which++) {
1226
+ if (!c->inputs_[which].empty()) {
1227
+ if (c->level() + which == 0) {
1228
+ const std::vector<FileMetaData*>& files = c->inputs_[which];
1229
+ for (size_t i = 0; i < files.size(); i++) {
1230
+ list[num++] = table_cache_->NewIterator(options, files[i]->number,
1231
+ files[i]->file_size);
1232
+ }
1233
+ } else {
1234
+ // Create concatenating iterator for the files from this level
1235
+ list[num++] = NewTwoLevelIterator(
1236
+ new Version::LevelFileNumIterator(icmp_, &c->inputs_[which]),
1237
+ &GetFileIterator, table_cache_, options);
1238
+ }
1239
+ }
1240
+ }
1241
+ assert(num <= space);
1242
+ Iterator* result = NewMergingIterator(&icmp_, list, num);
1243
+ delete[] list;
1244
+ return result;
1245
+ }
1246
+
1247
+ Compaction* VersionSet::PickCompaction() {
1248
+ Compaction* c;
1249
+ int level;
1250
+
1251
+ // We prefer compactions triggered by too much data in a level over
1252
+ // the compactions triggered by seeks.
1253
+ const bool size_compaction = (current_->compaction_score_ >= 1);
1254
+ const bool seek_compaction = (current_->file_to_compact_ != nullptr);
1255
+ if (size_compaction) {
1256
+ level = current_->compaction_level_;
1257
+ assert(level >= 0);
1258
+ assert(level + 1 < config::kNumLevels);
1259
+ c = new Compaction(options_, level);
1260
+
1261
+ // Pick the first file that comes after compact_pointer_[level]
1262
+ for (size_t i = 0; i < current_->files_[level].size(); i++) {
1263
+ FileMetaData* f = current_->files_[level][i];
1264
+ if (compact_pointer_[level].empty() ||
1265
+ icmp_.Compare(f->largest.Encode(), compact_pointer_[level]) > 0) {
1266
+ c->inputs_[0].push_back(f);
1267
+ break;
1268
+ }
1269
+ }
1270
+ if (c->inputs_[0].empty()) {
1271
+ // Wrap-around to the beginning of the key space
1272
+ c->inputs_[0].push_back(current_->files_[level][0]);
1273
+ }
1274
+ } else if (seek_compaction) {
1275
+ level = current_->file_to_compact_level_;
1276
+ c = new Compaction(options_, level);
1277
+ c->inputs_[0].push_back(current_->file_to_compact_);
1278
+ } else {
1279
+ return nullptr;
1280
+ }
1281
+
1282
+ c->input_version_ = current_;
1283
+ c->input_version_->Ref();
1284
+
1285
+ // Files in level 0 may overlap each other, so pick up all overlapping ones
1286
+ if (level == 0) {
1287
+ InternalKey smallest, largest;
1288
+ GetRange(c->inputs_[0], &smallest, &largest);
1289
+ // Note that the next call will discard the file we placed in
1290
+ // c->inputs_[0] earlier and replace it with an overlapping set
1291
+ // which will include the picked file.
1292
+ current_->GetOverlappingInputs(0, &smallest, &largest, &c->inputs_[0]);
1293
+ assert(!c->inputs_[0].empty());
1294
+ }
1295
+
1296
+ SetupOtherInputs(c);
1297
+
1298
+ return c;
1299
+ }
1300
+
1301
+ // Finds the largest key in a vector of files. Returns true if files it not
1302
+ // empty.
1303
+ bool FindLargestKey(const InternalKeyComparator& icmp,
1304
+ const std::vector<FileMetaData*>& files,
1305
+ InternalKey* largest_key) {
1306
+ if (files.empty()) {
1307
+ return false;
1308
+ }
1309
+ *largest_key = files[0]->largest;
1310
+ for (size_t i = 1; i < files.size(); ++i) {
1311
+ FileMetaData* f = files[i];
1312
+ if (icmp.Compare(f->largest, *largest_key) > 0) {
1313
+ *largest_key = f->largest;
1314
+ }
1315
+ }
1316
+ return true;
1317
+ }
1318
+
1319
+ // Finds minimum file b2=(l2, u2) in level file for which l2 > u1 and
1320
+ // user_key(l2) = user_key(u1)
1321
+ FileMetaData* FindSmallestBoundaryFile(
1322
+ const InternalKeyComparator& icmp,
1323
+ const std::vector<FileMetaData*>& level_files,
1324
+ const InternalKey& largest_key) {
1325
+ const Comparator* user_cmp = icmp.user_comparator();
1326
+ FileMetaData* smallest_boundary_file = nullptr;
1327
+ for (size_t i = 0; i < level_files.size(); ++i) {
1328
+ FileMetaData* f = level_files[i];
1329
+ if (icmp.Compare(f->smallest, largest_key) > 0 &&
1330
+ user_cmp->Compare(f->smallest.user_key(), largest_key.user_key()) ==
1331
+ 0) {
1332
+ if (smallest_boundary_file == nullptr ||
1333
+ icmp.Compare(f->smallest, smallest_boundary_file->smallest) < 0) {
1334
+ smallest_boundary_file = f;
1335
+ }
1336
+ }
1337
+ }
1338
+ return smallest_boundary_file;
1339
+ }
1340
+
1341
+ // Extracts the largest file b1 from |compaction_files| and then searches for a
1342
+ // b2 in |level_files| for which user_key(u1) = user_key(l2). If it finds such a
1343
+ // file b2 (known as a boundary file) it adds it to |compaction_files| and then
1344
+ // searches again using this new upper bound.
1345
+ //
1346
+ // If there are two blocks, b1=(l1, u1) and b2=(l2, u2) and
1347
+ // user_key(u1) = user_key(l2), and if we compact b1 but not b2 then a
1348
+ // subsequent get operation will yield an incorrect result because it will
1349
+ // return the record from b2 in level i rather than from b1 because it searches
1350
+ // level by level for records matching the supplied user key.
1351
+ //
1352
+ // parameters:
1353
+ // in level_files: List of files to search for boundary files.
1354
+ // in/out compaction_files: List of files to extend by adding boundary files.
1355
+ void AddBoundaryInputs(const InternalKeyComparator& icmp,
1356
+ const std::vector<FileMetaData*>& level_files,
1357
+ std::vector<FileMetaData*>* compaction_files) {
1358
+ InternalKey largest_key;
1359
+
1360
+ // Quick return if compaction_files is empty.
1361
+ if (!FindLargestKey(icmp, *compaction_files, &largest_key)) {
1362
+ return;
1363
+ }
1364
+
1365
+ bool continue_searching = true;
1366
+ while (continue_searching) {
1367
+ FileMetaData* smallest_boundary_file =
1368
+ FindSmallestBoundaryFile(icmp, level_files, largest_key);
1369
+
1370
+ // If a boundary file was found advance largest_key, otherwise we're done.
1371
+ if (smallest_boundary_file != NULL) {
1372
+ compaction_files->push_back(smallest_boundary_file);
1373
+ largest_key = smallest_boundary_file->largest;
1374
+ } else {
1375
+ continue_searching = false;
1376
+ }
1377
+ }
1378
+ }
1379
+
1380
+ void VersionSet::SetupOtherInputs(Compaction* c) {
1381
+ const int level = c->level();
1382
+ InternalKey smallest, largest;
1383
+
1384
+ AddBoundaryInputs(icmp_, current_->files_[level], &c->inputs_[0]);
1385
+ GetRange(c->inputs_[0], &smallest, &largest);
1386
+
1387
+ current_->GetOverlappingInputs(level + 1, &smallest, &largest,
1388
+ &c->inputs_[1]);
1389
+
1390
+ // Get entire range covered by compaction
1391
+ InternalKey all_start, all_limit;
1392
+ GetRange2(c->inputs_[0], c->inputs_[1], &all_start, &all_limit);
1393
+
1394
+ // See if we can grow the number of inputs in "level" without
1395
+ // changing the number of "level+1" files we pick up.
1396
+ if (!c->inputs_[1].empty()) {
1397
+ std::vector<FileMetaData*> expanded0;
1398
+ current_->GetOverlappingInputs(level, &all_start, &all_limit, &expanded0);
1399
+ AddBoundaryInputs(icmp_, current_->files_[level], &expanded0);
1400
+ const int64_t inputs0_size = TotalFileSize(c->inputs_[0]);
1401
+ const int64_t inputs1_size = TotalFileSize(c->inputs_[1]);
1402
+ const int64_t expanded0_size = TotalFileSize(expanded0);
1403
+ if (expanded0.size() > c->inputs_[0].size() &&
1404
+ inputs1_size + expanded0_size <
1405
+ ExpandedCompactionByteSizeLimit(options_)) {
1406
+ InternalKey new_start, new_limit;
1407
+ GetRange(expanded0, &new_start, &new_limit);
1408
+ std::vector<FileMetaData*> expanded1;
1409
+ current_->GetOverlappingInputs(level + 1, &new_start, &new_limit,
1410
+ &expanded1);
1411
+ if (expanded1.size() == c->inputs_[1].size()) {
1412
+ Log(options_->info_log,
1413
+ "Expanding@%d %d+%d (%ld+%ld bytes) to %d+%d (%ld+%ld bytes)\n",
1414
+ level, int(c->inputs_[0].size()), int(c->inputs_[1].size()),
1415
+ long(inputs0_size), long(inputs1_size), int(expanded0.size()),
1416
+ int(expanded1.size()), long(expanded0_size), long(inputs1_size));
1417
+ smallest = new_start;
1418
+ largest = new_limit;
1419
+ c->inputs_[0] = expanded0;
1420
+ c->inputs_[1] = expanded1;
1421
+ GetRange2(c->inputs_[0], c->inputs_[1], &all_start, &all_limit);
1422
+ }
1423
+ }
1424
+ }
1425
+
1426
+ // Compute the set of grandparent files that overlap this compaction
1427
+ // (parent == level+1; grandparent == level+2)
1428
+ if (level + 2 < config::kNumLevels) {
1429
+ current_->GetOverlappingInputs(level + 2, &all_start, &all_limit,
1430
+ &c->grandparents_);
1431
+ }
1432
+
1433
+ // Update the place where we will do the next compaction for this level.
1434
+ // We update this immediately instead of waiting for the VersionEdit
1435
+ // to be applied so that if the compaction fails, we will try a different
1436
+ // key range next time.
1437
+ compact_pointer_[level] = largest.Encode().ToString();
1438
+ c->edit_.SetCompactPointer(level, largest);
1439
+ }
1440
+
1441
+ Compaction* VersionSet::CompactRange(int level, const InternalKey* begin,
1442
+ const InternalKey* end) {
1443
+ std::vector<FileMetaData*> inputs;
1444
+ current_->GetOverlappingInputs(level, begin, end, &inputs);
1445
+ if (inputs.empty()) {
1446
+ return nullptr;
1447
+ }
1448
+
1449
+ // Avoid compacting too much in one shot in case the range is large.
1450
+ // But we cannot do this for level-0 since level-0 files can overlap
1451
+ // and we must not pick one file and drop another older file if the
1452
+ // two files overlap.
1453
+ if (level > 0) {
1454
+ const uint64_t limit = MaxFileSizeForLevel(options_, level);
1455
+ uint64_t total = 0;
1456
+ for (size_t i = 0; i < inputs.size(); i++) {
1457
+ uint64_t s = inputs[i]->file_size;
1458
+ total += s;
1459
+ if (total >= limit) {
1460
+ inputs.resize(i + 1);
1461
+ break;
1462
+ }
1463
+ }
1464
+ }
1465
+
1466
+ Compaction* c = new Compaction(options_, level);
1467
+ c->input_version_ = current_;
1468
+ c->input_version_->Ref();
1469
+ c->inputs_[0] = inputs;
1470
+ SetupOtherInputs(c);
1471
+ return c;
1472
+ }
1473
+
1474
+ Compaction::Compaction(const Options* options, int level)
1475
+ : level_(level),
1476
+ max_output_file_size_(MaxFileSizeForLevel(options, level)),
1477
+ input_version_(nullptr),
1478
+ grandparent_index_(0),
1479
+ seen_key_(false),
1480
+ overlapped_bytes_(0) {
1481
+ for (int i = 0; i < config::kNumLevels; i++) {
1482
+ level_ptrs_[i] = 0;
1483
+ }
1484
+ }
1485
+
1486
+ Compaction::~Compaction() {
1487
+ if (input_version_ != nullptr) {
1488
+ input_version_->Unref();
1489
+ }
1490
+ }
1491
+
1492
+ bool Compaction::IsTrivialMove() const {
1493
+ const VersionSet* vset = input_version_->vset_;
1494
+ // Avoid a move if there is lots of overlapping grandparent data.
1495
+ // Otherwise, the move could create a parent file that will require
1496
+ // a very expensive merge later on.
1497
+ return (num_input_files(0) == 1 && num_input_files(1) == 0 &&
1498
+ TotalFileSize(grandparents_) <=
1499
+ MaxGrandParentOverlapBytes(vset->options_));
1500
+ }
1501
+
1502
+ void Compaction::AddInputDeletions(VersionEdit* edit) {
1503
+ for (int which = 0; which < 2; which++) {
1504
+ for (size_t i = 0; i < inputs_[which].size(); i++) {
1505
+ edit->RemoveFile(level_ + which, inputs_[which][i]->number);
1506
+ }
1507
+ }
1508
+ }
1509
+
1510
+ bool Compaction::IsBaseLevelForKey(const Slice& user_key) {
1511
+ // Maybe use binary search to find right entry instead of linear search?
1512
+ const Comparator* user_cmp = input_version_->vset_->icmp_.user_comparator();
1513
+ for (int lvl = level_ + 2; lvl < config::kNumLevels; lvl++) {
1514
+ const std::vector<FileMetaData*>& files = input_version_->files_[lvl];
1515
+ while (level_ptrs_[lvl] < files.size()) {
1516
+ FileMetaData* f = files[level_ptrs_[lvl]];
1517
+ if (user_cmp->Compare(user_key, f->largest.user_key()) <= 0) {
1518
+ // We've advanced far enough
1519
+ if (user_cmp->Compare(user_key, f->smallest.user_key()) >= 0) {
1520
+ // Key falls in this file's range, so definitely not base level
1521
+ return false;
1522
+ }
1523
+ break;
1524
+ }
1525
+ level_ptrs_[lvl]++;
1526
+ }
1527
+ }
1528
+ return true;
1529
+ }
1530
+
1531
+ bool Compaction::ShouldStopBefore(const Slice& internal_key) {
1532
+ const VersionSet* vset = input_version_->vset_;
1533
+ // Scan to find earliest grandparent file that contains key.
1534
+ const InternalKeyComparator* icmp = &vset->icmp_;
1535
+ while (grandparent_index_ < grandparents_.size() &&
1536
+ icmp->Compare(internal_key,
1537
+ grandparents_[grandparent_index_]->largest.Encode()) >
1538
+ 0) {
1539
+ if (seen_key_) {
1540
+ overlapped_bytes_ += grandparents_[grandparent_index_]->file_size;
1541
+ }
1542
+ grandparent_index_++;
1543
+ }
1544
+ seen_key_ = true;
1545
+
1546
+ if (overlapped_bytes_ > MaxGrandParentOverlapBytes(vset->options_)) {
1547
+ // Too much overlap for current output; start new output
1548
+ overlapped_bytes_ = 0;
1549
+ return true;
1550
+ } else {
1551
+ return false;
1552
+ }
1553
+ }
1554
+
1555
+ void Compaction::ReleaseInputs() {
1556
+ if (input_version_ != nullptr) {
1557
+ input_version_->Unref();
1558
+ input_version_ = nullptr;
1559
+ }
1560
+ }
1561
+
1562
+ } // namespace leveldb