@nxtedition/rocksdb 7.1.3 → 7.1.6

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 (185) hide show
  1. package/binding.cc +32 -14
  2. package/deps/rocksdb/iostats.patch +19 -0
  3. package/deps/rocksdb/rocksdb/CMakeLists.txt +15 -1
  4. package/deps/rocksdb/rocksdb/cache/cache.cc +4 -0
  5. package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +6 -8
  6. package/deps/rocksdb/rocksdb/cache/cache_key.cc +184 -164
  7. package/deps/rocksdb/rocksdb/cache/cache_key.h +38 -29
  8. package/deps/rocksdb/rocksdb/cache/cache_reservation_manager_test.cc +4 -4
  9. package/deps/rocksdb/rocksdb/cache/cache_test.cc +93 -58
  10. package/deps/rocksdb/rocksdb/cache/clock_cache.cc +92 -42
  11. package/deps/rocksdb/rocksdb/cache/clock_cache.h +57 -32
  12. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +114 -37
  13. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +34 -2
  14. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +187 -38
  15. package/deps/rocksdb/rocksdb/cache/fast_lru_cache.cc +3 -1
  16. package/deps/rocksdb/rocksdb/cache/lru_cache.cc +88 -19
  17. package/deps/rocksdb/rocksdb/cache/lru_cache.h +48 -8
  18. package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +481 -224
  19. package/deps/rocksdb/rocksdb/crash_test.mk +15 -1
  20. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +2 -2
  21. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.cc +3 -7
  22. package/deps/rocksdb/rocksdb/db/blob/blob_index.h +1 -1
  23. package/deps/rocksdb/rocksdb/db/blob/blob_log_format.cc +3 -5
  24. package/deps/rocksdb/rocksdb/db/blob/blob_log_writer.cc +25 -19
  25. package/deps/rocksdb/rocksdb/db/blob/blob_source.cc +4 -5
  26. package/deps/rocksdb/rocksdb/db/blob/blob_source.h +2 -3
  27. package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +12 -4
  28. package/deps/rocksdb/rocksdb/db/blob/db_blob_basic_test.cc +149 -0
  29. package/deps/rocksdb/rocksdb/db/blob/db_blob_compaction_test.cc +105 -0
  30. package/deps/rocksdb/rocksdb/db/column_family.cc +2 -15
  31. package/deps/rocksdb/rocksdb/db/column_family_test.cc +17 -4
  32. package/deps/rocksdb/rocksdb/db/compact_files_test.cc +8 -8
  33. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +0 -7
  34. package/deps/rocksdb/rocksdb/db/compaction/compaction.h +5 -0
  35. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +56 -53
  36. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +33 -11
  37. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +45 -11
  38. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +1 -2
  39. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +143 -2
  40. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +43 -18
  41. package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +48 -65
  42. package/deps/rocksdb/rocksdb/db/corruption_test.cc +1 -0
  43. package/deps/rocksdb/rocksdb/db/db_basic_test.cc +73 -4
  44. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +239 -190
  45. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +71 -2
  46. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +144 -33
  47. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +18 -35
  48. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +11 -5
  49. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_experimental.cc +7 -7
  50. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +15 -8
  51. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +2 -1
  52. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +3 -1
  53. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +11 -0
  54. package/deps/rocksdb/rocksdb/db/db_iter.cc +69 -11
  55. package/deps/rocksdb/rocksdb/db/db_iter.h +16 -0
  56. package/deps/rocksdb/rocksdb/db/db_kv_checksum_test.cc +239 -23
  57. package/deps/rocksdb/rocksdb/db/db_memtable_test.cc +2 -1
  58. package/deps/rocksdb/rocksdb/db/db_merge_operand_test.cc +42 -0
  59. package/deps/rocksdb/rocksdb/db/db_test.cc +61 -28
  60. package/deps/rocksdb/rocksdb/db/db_test2.cc +24 -9
  61. package/deps/rocksdb/rocksdb/db/db_wal_test.cc +17 -0
  62. package/deps/rocksdb/rocksdb/db/db_with_timestamp_compaction_test.cc +61 -0
  63. package/deps/rocksdb/rocksdb/db/db_write_test.cc +130 -0
  64. package/deps/rocksdb/rocksdb/db/event_helpers.cc +2 -1
  65. package/deps/rocksdb/rocksdb/db/experimental.cc +7 -8
  66. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +1 -2
  67. package/deps/rocksdb/rocksdb/db/flush_job.cc +11 -7
  68. package/deps/rocksdb/rocksdb/db/flush_job_test.cc +7 -1
  69. package/deps/rocksdb/rocksdb/db/forward_iterator.cc +4 -2
  70. package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +7 -1
  71. package/deps/rocksdb/rocksdb/db/import_column_family_job.h +6 -0
  72. package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +6 -0
  73. package/deps/rocksdb/rocksdb/db/kv_checksum.h +8 -4
  74. package/deps/rocksdb/rocksdb/db/log_reader.cc +48 -11
  75. package/deps/rocksdb/rocksdb/db/log_reader.h +8 -2
  76. package/deps/rocksdb/rocksdb/db/log_test.cc +10 -1
  77. package/deps/rocksdb/rocksdb/db/log_writer.cc +7 -1
  78. package/deps/rocksdb/rocksdb/db/manual_compaction_test.cc +4 -4
  79. package/deps/rocksdb/rocksdb/db/memtable.cc +222 -47
  80. package/deps/rocksdb/rocksdb/db/memtable.h +70 -14
  81. package/deps/rocksdb/rocksdb/db/memtable_list.cc +14 -8
  82. package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +30 -10
  83. package/deps/rocksdb/rocksdb/db/perf_context_test.cc +5 -5
  84. package/deps/rocksdb/rocksdb/db/pinned_iterators_manager.h +5 -0
  85. package/deps/rocksdb/rocksdb/db/repair.cc +2 -3
  86. package/deps/rocksdb/rocksdb/db/seqno_time_test.cc +3 -7
  87. package/deps/rocksdb/rocksdb/db/table_cache.cc +72 -0
  88. package/deps/rocksdb/rocksdb/db/table_cache.h +19 -1
  89. package/deps/rocksdb/rocksdb/db/table_cache_sync_and_async.h +10 -15
  90. package/deps/rocksdb/rocksdb/db/table_properties_collector_test.cc +2 -2
  91. package/deps/rocksdb/rocksdb/db/version_builder_test.cc +35 -64
  92. package/deps/rocksdb/rocksdb/db/version_edit.cc +3 -32
  93. package/deps/rocksdb/rocksdb/db/version_edit.h +2 -12
  94. package/deps/rocksdb/rocksdb/db/version_edit_test.cc +10 -23
  95. package/deps/rocksdb/rocksdb/db/version_set.cc +71 -28
  96. package/deps/rocksdb/rocksdb/db/version_set.h +3 -3
  97. package/deps/rocksdb/rocksdb/db/version_set_sync_and_async.h +7 -7
  98. package/deps/rocksdb/rocksdb/db/version_set_test.cc +17 -15
  99. package/deps/rocksdb/rocksdb/db/wal_manager.cc +0 -4
  100. package/deps/rocksdb/rocksdb/db/wal_manager_test.cc +2 -1
  101. package/deps/rocksdb/rocksdb/db/wide/db_wide_basic_test.cc +137 -42
  102. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.cc +21 -0
  103. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.h +1 -0
  104. package/deps/rocksdb/rocksdb/db/write_batch_test.cc +2 -1
  105. package/deps/rocksdb/rocksdb/db/write_callback_test.cc +4 -4
  106. package/deps/rocksdb/rocksdb/db/write_thread.cc +51 -46
  107. package/deps/rocksdb/rocksdb/db/write_thread.h +0 -4
  108. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +5 -0
  109. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +12 -0
  110. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +8 -0
  111. package/deps/rocksdb/rocksdb/env/env_posix.cc +1 -1
  112. package/deps/rocksdb/rocksdb/env/env_test.cc +38 -8
  113. package/deps/rocksdb/rocksdb/env/file_system.cc +20 -0
  114. package/deps/rocksdb/rocksdb/env/fs_posix.cc +2 -46
  115. package/deps/rocksdb/rocksdb/env/io_posix.cc +1 -0
  116. package/deps/rocksdb/rocksdb/file/writable_file_writer.cc +110 -5
  117. package/deps/rocksdb/rocksdb/file/writable_file_writer.h +7 -0
  118. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +29 -1
  119. package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +31 -6
  120. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +4 -0
  121. package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +1 -1
  122. package/deps/rocksdb/rocksdb/include/rocksdb/iostats_context.h +7 -0
  123. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +10 -3
  124. package/deps/rocksdb/rocksdb/include/rocksdb/slice.h +3 -1
  125. package/deps/rocksdb/rocksdb/include/rocksdb/status.h +1 -1
  126. package/deps/rocksdb/rocksdb/include/rocksdb/wide_columns.h +2 -0
  127. package/deps/rocksdb/rocksdb/logging/auto_roll_logger.cc +12 -0
  128. package/deps/rocksdb/rocksdb/logging/auto_roll_logger_test.cc +9 -13
  129. package/deps/rocksdb/rocksdb/logging/env_logger.h +39 -13
  130. package/deps/rocksdb/rocksdb/memory/memory_allocator_test.cc +1 -1
  131. package/deps/rocksdb/rocksdb/memtable/inlineskiplist.h +1 -1
  132. package/deps/rocksdb/rocksdb/memtable/write_buffer_manager_test.cc +1 -1
  133. package/deps/rocksdb/rocksdb/microbench/db_basic_bench.cc +6 -0
  134. package/deps/rocksdb/rocksdb/monitoring/iostats_context_imp.h +4 -1
  135. package/deps/rocksdb/rocksdb/options/cf_options.cc +10 -3
  136. package/deps/rocksdb/rocksdb/options/cf_options.h +10 -5
  137. package/deps/rocksdb/rocksdb/options/options_helper.cc +4 -1
  138. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +3 -1
  139. package/deps/rocksdb/rocksdb/options/options_test.cc +4 -2
  140. package/deps/rocksdb/rocksdb/port/util_logger.h +1 -3
  141. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +2 -6
  142. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +1 -0
  143. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +52 -12
  144. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +5 -7
  145. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +9 -1
  146. package/deps/rocksdb/rocksdb/table/block_based/block_like_traits.h +28 -10
  147. package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index_test.cc +1 -1
  148. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +5 -2
  149. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.h +1 -0
  150. package/deps/rocksdb/rocksdb/table/get_context.cc +16 -6
  151. package/deps/rocksdb/rocksdb/table/table_reader.h +9 -0
  152. package/deps/rocksdb/rocksdb/table/table_test.cc +2 -1
  153. package/deps/rocksdb/rocksdb/table/unique_id.cc +22 -24
  154. package/deps/rocksdb/rocksdb/table/unique_id_impl.h +2 -1
  155. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_plot.py +7 -0
  156. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +41 -4
  157. package/deps/rocksdb/rocksdb/tools/db_sanity_test.cc +5 -2
  158. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +7 -8
  159. package/deps/rocksdb/rocksdb/tools/ldb_cmd_test.cc +6 -6
  160. package/deps/rocksdb/rocksdb/tools/reduce_levels_test.cc +1 -1
  161. package/deps/rocksdb/rocksdb/util/async_file_reader.cc +2 -1
  162. package/deps/rocksdb/rocksdb/util/async_file_reader.h +3 -3
  163. package/deps/rocksdb/rocksdb/util/coro_utils.h +2 -1
  164. package/deps/rocksdb/rocksdb/util/file_reader_writer_test.cc +2 -0
  165. package/deps/rocksdb/rocksdb/util/hash_test.cc +67 -0
  166. package/deps/rocksdb/rocksdb/util/math.h +41 -0
  167. package/deps/rocksdb/rocksdb/util/math128.h +6 -0
  168. package/deps/rocksdb/rocksdb/util/single_thread_executor.h +2 -1
  169. package/deps/rocksdb/rocksdb/util/stderr_logger.h +13 -0
  170. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +55 -46
  171. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.cc +3 -6
  172. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_functional_test.cc +2 -1
  173. package/deps/rocksdb/rocksdb/utilities/counted_fs.cc +10 -0
  174. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager_test.h +5 -0
  175. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_lock_manager.h +6 -0
  176. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_locking_test.cc +2 -2
  177. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_test.cc +2 -2
  178. package/deps/rocksdb/rocksdb/utilities/ttl/ttl_test.cc +2 -2
  179. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +2 -2
  180. package/index.js +17 -8
  181. package/package.json +1 -1
  182. package/prebuilds/darwin-arm64/node.napi.node +0 -0
  183. package/prebuilds/darwin-x64/node.napi.node +0 -0
  184. package/prebuilds/linux-x64/node.napi.node +0 -0
  185. package/deps/rocksdb/rocksdb/logging/posix_logger.h +0 -179
@@ -1,3 +1,9 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+ //
3
+ // This source code is licensed under both the GPLv2 (found in the
4
+ // COPYING file in the root directory) and Apache 2.0 License
5
+ // (found in the LICENSE.Apache file in the root directory).
6
+
1
7
  #ifndef ROCKSDB_LITE
2
8
 
3
9
  #include "db/import_column_family_job.h"
@@ -160,7 +166,7 @@ Status ImportColumnFamilyJob::Run() {
160
166
  file_metadata.largest_seqno, false, file_metadata.temperature,
161
167
  kInvalidBlobFileNumber, oldest_ancester_time, current_time,
162
168
  kUnknownFileChecksum, kUnknownFileChecksumFuncName,
163
- kDisableUserTimestamp, kDisableUserTimestamp, f.unique_id);
169
+ f.unique_id);
164
170
 
165
171
  // If incoming sequence number is higher, update local sequence number.
166
172
  if (file_metadata.largest_seqno > versions_->LastSequence()) {
@@ -1,3 +1,9 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+ //
3
+ // This source code is licensed under both the GPLv2 (found in the
4
+ // COPYING file in the root directory) and Apache 2.0 License
5
+ // (found in the LICENSE.Apache file in the root directory).
6
+
1
7
  #pragma once
2
8
  #include <string>
3
9
  #include <unordered_set>
@@ -1,3 +1,9 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+ //
3
+ // This source code is licensed under both the GPLv2 (found in the
4
+ // COPYING file in the root directory) and Apache 2.0 License
5
+ // (found in the LICENSE.Apache file in the root directory).
6
+
1
7
  #ifndef ROCKSDB_LITE
2
8
 
3
9
  #include <functional>
@@ -65,6 +65,8 @@ class ProtectionInfo {
65
65
  const SliceParts& value,
66
66
  ValueType op_type) const;
67
67
 
68
+ T GetVal() const { return val_; }
69
+
68
70
  private:
69
71
  friend class ProtectionInfoKVO<T>;
70
72
  friend class ProtectionInfoKVOS<T>;
@@ -87,7 +89,6 @@ class ProtectionInfo {
87
89
  static_assert(sizeof(ProtectionInfo<T>) == sizeof(T), "");
88
90
  }
89
91
 
90
- T GetVal() const { return val_; }
91
92
  void SetVal(T val) { val_ = val; }
92
93
 
93
94
  T val_ = 0;
@@ -112,6 +113,8 @@ class ProtectionInfoKVO {
112
113
  void UpdateV(const SliceParts& old_value, const SliceParts& new_value);
113
114
  void UpdateO(ValueType old_op_type, ValueType new_op_type);
114
115
 
116
+ T GetVal() const { return info_.GetVal(); }
117
+
115
118
  private:
116
119
  friend class ProtectionInfo<T>;
117
120
  friend class ProtectionInfoKVOS<T>;
@@ -121,7 +124,6 @@ class ProtectionInfoKVO {
121
124
  static_assert(sizeof(ProtectionInfoKVO<T>) == sizeof(T), "");
122
125
  }
123
126
 
124
- T GetVal() const { return info_.GetVal(); }
125
127
  void SetVal(T val) { info_.SetVal(val); }
126
128
 
127
129
  ProtectionInfo<T> info_;
@@ -152,6 +154,8 @@ class ProtectionInfoKVOC {
152
154
  void UpdateC(ColumnFamilyId old_column_family_id,
153
155
  ColumnFamilyId new_column_family_id);
154
156
 
157
+ T GetVal() const { return kvo_.GetVal(); }
158
+
155
159
  private:
156
160
  friend class ProtectionInfoKVO<T>;
157
161
 
@@ -159,7 +163,6 @@ class ProtectionInfoKVOC {
159
163
  static_assert(sizeof(ProtectionInfoKVOC<T>) == sizeof(T), "");
160
164
  }
161
165
 
162
- T GetVal() const { return kvo_.GetVal(); }
163
166
  void SetVal(T val) { kvo_.SetVal(val); }
164
167
 
165
168
  ProtectionInfoKVO<T> kvo_;
@@ -190,6 +193,8 @@ class ProtectionInfoKVOS {
190
193
  void UpdateS(SequenceNumber old_sequence_number,
191
194
  SequenceNumber new_sequence_number);
192
195
 
196
+ T GetVal() const { return kvo_.GetVal(); }
197
+
193
198
  private:
194
199
  friend class ProtectionInfoKVO<T>;
195
200
 
@@ -197,7 +202,6 @@ class ProtectionInfoKVOS {
197
202
  static_assert(sizeof(ProtectionInfoKVOS<T>) == sizeof(T), "");
198
203
  }
199
204
 
200
- T GetVal() const { return kvo_.GetVal(); }
201
205
  void SetVal(T val) { kvo_.SetVal(val); }
202
206
 
203
207
  ProtectionInfoKVO<T> kvo_;
@@ -44,7 +44,8 @@ Reader::Reader(std::shared_ptr<Logger> info_log,
44
44
  compression_type_(kNoCompression),
45
45
  compression_type_record_read_(false),
46
46
  uncompress_(nullptr),
47
- hash_state_(nullptr) {}
47
+ hash_state_(nullptr),
48
+ uncompress_hash_state_(nullptr){};
48
49
 
49
50
  Reader::~Reader() {
50
51
  delete[] backing_store_;
@@ -54,6 +55,9 @@ Reader::~Reader() {
54
55
  if (hash_state_) {
55
56
  XXH3_freeState(hash_state_);
56
57
  }
58
+ if (uncompress_hash_state_) {
59
+ XXH3_freeState(uncompress_hash_state_);
60
+ }
57
61
  }
58
62
 
59
63
  // For kAbsoluteConsistency, on clean shutdown we don't expect any error
@@ -64,10 +68,11 @@ Reader::~Reader() {
64
68
  // TODO krad: Evaluate if we need to move to a more strict mode where we
65
69
  // restrict the inconsistency to only the last log
66
70
  bool Reader::ReadRecord(Slice* record, std::string* scratch,
67
- WALRecoveryMode wal_recovery_mode, uint64_t* checksum) {
71
+ WALRecoveryMode wal_recovery_mode,
72
+ uint64_t* record_checksum) {
68
73
  scratch->clear();
69
74
  record->clear();
70
- if (checksum != nullptr) {
75
+ if (record_checksum != nullptr) {
71
76
  if (hash_state_ == nullptr) {
72
77
  hash_state_ = XXH3_createState();
73
78
  }
@@ -85,7 +90,8 @@ bool Reader::ReadRecord(Slice* record, std::string* scratch,
85
90
  while (true) {
86
91
  uint64_t physical_record_offset = end_of_buffer_offset_ - buffer_.size();
87
92
  size_t drop_size = 0;
88
- const unsigned int record_type = ReadPhysicalRecord(&fragment, &drop_size);
93
+ const unsigned int record_type =
94
+ ReadPhysicalRecord(&fragment, &drop_size, record_checksum);
89
95
  switch (record_type) {
90
96
  case kFullType:
91
97
  case kRecyclableFullType:
@@ -96,9 +102,12 @@ bool Reader::ReadRecord(Slice* record, std::string* scratch,
96
102
  // at the beginning of the next block.
97
103
  ReportCorruption(scratch->size(), "partial record without end(1)");
98
104
  }
99
- if (checksum != nullptr) {
105
+ // No need to compute record_checksum since the record
106
+ // consists of a single fragment and the checksum is computed
107
+ // in ReadPhysicalRecord() if WAL compression is enabled
108
+ if (record_checksum != nullptr && uncompress_ == nullptr) {
100
109
  // No need to stream since the record is a single fragment
101
- *checksum = XXH3_64bits(fragment.data(), fragment.size());
110
+ *record_checksum = XXH3_64bits(fragment.data(), fragment.size());
102
111
  }
103
112
  prospective_record_offset = physical_record_offset;
104
113
  scratch->clear();
@@ -117,7 +126,7 @@ bool Reader::ReadRecord(Slice* record, std::string* scratch,
117
126
  ReportCorruption(scratch->size(), "partial record without end(2)");
118
127
  XXH3_64bits_reset(hash_state_);
119
128
  }
120
- if (checksum != nullptr) {
129
+ if (record_checksum != nullptr) {
121
130
  XXH3_64bits_update(hash_state_, fragment.data(), fragment.size());
122
131
  }
123
132
  prospective_record_offset = physical_record_offset;
@@ -131,7 +140,7 @@ bool Reader::ReadRecord(Slice* record, std::string* scratch,
131
140
  ReportCorruption(fragment.size(),
132
141
  "missing start of fragmented record(1)");
133
142
  } else {
134
- if (checksum != nullptr) {
143
+ if (record_checksum != nullptr) {
135
144
  XXH3_64bits_update(hash_state_, fragment.data(), fragment.size());
136
145
  }
137
146
  scratch->append(fragment.data(), fragment.size());
@@ -144,9 +153,9 @@ bool Reader::ReadRecord(Slice* record, std::string* scratch,
144
153
  ReportCorruption(fragment.size(),
145
154
  "missing start of fragmented record(2)");
146
155
  } else {
147
- if (checksum != nullptr) {
156
+ if (record_checksum != nullptr) {
148
157
  XXH3_64bits_update(hash_state_, fragment.data(), fragment.size());
149
- *checksum = XXH3_64bits_digest(hash_state_);
158
+ *record_checksum = XXH3_64bits_digest(hash_state_);
150
159
  }
151
160
  scratch->append(fragment.data(), fragment.size());
152
161
  *record = Slice(*scratch);
@@ -417,7 +426,8 @@ bool Reader::ReadMore(size_t* drop_size, int *error) {
417
426
  }
418
427
  }
419
428
 
420
- unsigned int Reader::ReadPhysicalRecord(Slice* result, size_t* drop_size) {
429
+ unsigned int Reader::ReadPhysicalRecord(Slice* result, size_t* drop_size,
430
+ uint64_t* fragment_checksum) {
421
431
  while (true) {
422
432
  // We need at least the minimum header size
423
433
  if (buffer_.size() < static_cast<size_t>(kHeaderSize)) {
@@ -500,6 +510,13 @@ unsigned int Reader::ReadPhysicalRecord(Slice* result, size_t* drop_size) {
500
510
  } else {
501
511
  // Uncompress compressed records
502
512
  uncompressed_record_.clear();
513
+ if (fragment_checksum != nullptr) {
514
+ if (uncompress_hash_state_ == nullptr) {
515
+ uncompress_hash_state_ = XXH3_createState();
516
+ }
517
+ XXH3_64bits_reset(uncompress_hash_state_);
518
+ }
519
+
503
520
  size_t uncompressed_size = 0;
504
521
  int remaining = 0;
505
522
  do {
@@ -511,10 +528,30 @@ unsigned int Reader::ReadPhysicalRecord(Slice* result, size_t* drop_size) {
511
528
  return kBadRecord;
512
529
  }
513
530
  if (uncompressed_size > 0) {
531
+ if (fragment_checksum != nullptr) {
532
+ XXH3_64bits_update(uncompress_hash_state_,
533
+ uncompressed_buffer_.get(), uncompressed_size);
534
+ }
514
535
  uncompressed_record_.append(uncompressed_buffer_.get(),
515
536
  uncompressed_size);
516
537
  }
517
538
  } while (remaining > 0 || uncompressed_size == kBlockSize);
539
+
540
+ if (fragment_checksum != nullptr) {
541
+ // We can remove this check by updating hash_state_ directly,
542
+ // but that requires resetting hash_state_ for full and first types
543
+ // for edge cases like consecutive fist type records.
544
+ // Leaving the check as is since it is cleaner and can revert to the
545
+ // above approach if it causes performance impact.
546
+ *fragment_checksum = XXH3_64bits_digest(uncompress_hash_state_);
547
+ uint64_t actual_checksum = XXH3_64bits(uncompressed_record_.data(),
548
+ uncompressed_record_.size());
549
+ if (*fragment_checksum != actual_checksum) {
550
+ // uncompressed_record_ contains bad content that does not match
551
+ // actual decompressed content
552
+ return kBadRecord;
553
+ }
554
+ }
518
555
  *result = Slice(uncompressed_record_);
519
556
  return type;
520
557
  }
@@ -151,8 +151,10 @@ class Reader {
151
151
  std::unique_ptr<char[]> uncompressed_buffer_;
152
152
  // Reusable uncompressed record
153
153
  std::string uncompressed_record_;
154
- // Used for stream hashing log record
154
+ // Used for stream hashing fragment content in ReadRecord()
155
155
  XXH3_state_t* hash_state_;
156
+ // Used for stream hashing uncompressed buffer in ReadPhysicalRecord()
157
+ XXH3_state_t* uncompress_hash_state_;
156
158
 
157
159
  // Extend record types with the following special values
158
160
  enum {
@@ -173,7 +175,11 @@ class Reader {
173
175
  };
174
176
 
175
177
  // Return type, or one of the preceding special values
176
- unsigned int ReadPhysicalRecord(Slice* result, size_t* drop_size);
178
+ // If WAL compressioned is enabled, fragment_checksum is the checksum of the
179
+ // fragment computed from the orginal buffer containinng uncompressed
180
+ // fragment.
181
+ unsigned int ReadPhysicalRecord(Slice* result, size_t* drop_size,
182
+ uint64_t* fragment_checksum = nullptr);
177
183
 
178
184
  // Read some more
179
185
  bool ReadMore(size_t* drop_size, int *error);
@@ -194,8 +194,17 @@ class LogTest
194
194
  std::string scratch;
195
195
  Slice record;
196
196
  bool ret = false;
197
- ret = reader_->ReadRecord(&record, &scratch, wal_recovery_mode);
197
+ uint64_t record_checksum;
198
+ ret = reader_->ReadRecord(&record, &scratch, wal_recovery_mode,
199
+ &record_checksum);
198
200
  if (ret) {
201
+ if (!allow_retry_read_) {
202
+ // allow_retry_read_ means using FragmentBufferedReader which does not
203
+ // support record checksum yet.
204
+ uint64_t actual_record_checksum =
205
+ XXH3_64bits(record.data(), record.size());
206
+ assert(actual_record_checksum == record_checksum);
207
+ }
199
208
  return record.ToString();
200
209
  } else {
201
210
  return "EOF";
@@ -13,6 +13,7 @@
13
13
 
14
14
  #include "file/writable_file_writer.h"
15
15
  #include "rocksdb/env.h"
16
+ #include "rocksdb/io_status.h"
16
17
  #include "util/coding.h"
17
18
  #include "util/crc32c.h"
18
19
 
@@ -44,7 +45,12 @@ Writer::~Writer() {
44
45
  }
45
46
  }
46
47
 
47
- IOStatus Writer::WriteBuffer() { return dest_->Flush(); }
48
+ IOStatus Writer::WriteBuffer() {
49
+ if (dest_->seen_error()) {
50
+ return IOStatus::IOError("Seen error. Skip writing buffer.");
51
+ }
52
+ return dest_->Flush();
53
+ }
48
54
 
49
55
  IOStatus Writer::Close() {
50
56
  IOStatus s;
@@ -52,7 +52,7 @@ class ManualCompactionTest : public testing::Test {
52
52
  // Get rid of any state from an old run.
53
53
  dbname_ = ROCKSDB_NAMESPACE::test::PerThreadDBPath(
54
54
  "rocksdb_manual_compaction_test");
55
- DestroyDB(dbname_, Options());
55
+ EXPECT_OK(DestroyDB(dbname_, Options()));
56
56
  }
57
57
 
58
58
  std::string dbname_;
@@ -130,7 +130,7 @@ TEST_F(ManualCompactionTest, CompactTouchesAllKeys) {
130
130
 
131
131
  delete options.compaction_filter;
132
132
  delete db;
133
- DestroyDB(dbname_, options);
133
+ ASSERT_OK(DestroyDB(dbname_, options));
134
134
  }
135
135
  }
136
136
 
@@ -186,7 +186,7 @@ TEST_F(ManualCompactionTest, Test) {
186
186
 
187
187
  // close database
188
188
  delete db;
189
- DestroyDB(dbname_, Options());
189
+ ASSERT_OK(DestroyDB(dbname_, Options()));
190
190
  }
191
191
 
192
192
  TEST_F(ManualCompactionTest, SkipLevel) {
@@ -298,7 +298,7 @@ TEST_F(ManualCompactionTest, SkipLevel) {
298
298
 
299
299
  delete filter;
300
300
  delete db;
301
- DestroyDB(dbname_, options);
301
+ ASSERT_OK(DestroyDB(dbname_, options));
302
302
  }
303
303
 
304
304
  } // anonymous namespace