@nxtedition/rocksdb 7.0.4 → 7.0.7

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 (128) hide show
  1. package/binding.cc +320 -324
  2. package/chained-batch.js +6 -1
  3. package/deps/rocksdb/rocksdb/CMakeLists.txt +8 -3
  4. package/deps/rocksdb/rocksdb/Makefile +10 -4
  5. package/deps/rocksdb/rocksdb/TARGETS +6 -4
  6. package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +9 -0
  7. package/deps/rocksdb/rocksdb/cache/cache_test.cc +14 -0
  8. package/deps/rocksdb/rocksdb/cache/clock_cache.cc +8 -8
  9. package/deps/rocksdb/rocksdb/cache/fast_lru_cache.cc +272 -174
  10. package/deps/rocksdb/rocksdb/cache/fast_lru_cache.h +201 -57
  11. package/deps/rocksdb/rocksdb/cache/lru_cache.cc +19 -19
  12. package/deps/rocksdb/rocksdb/cache/lru_cache.h +2 -1
  13. package/deps/rocksdb/rocksdb/db/blob/blob_source.cc +170 -0
  14. package/deps/rocksdb/rocksdb/db/blob/blob_source.h +95 -0
  15. package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +298 -0
  16. package/deps/rocksdb/rocksdb/db/blob/db_blob_basic_test.cc +172 -0
  17. package/deps/rocksdb/rocksdb/db/column_family.cc +8 -3
  18. package/deps/rocksdb/rocksdb/db/column_family.h +6 -3
  19. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +10 -0
  20. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +6 -6
  21. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +22 -2
  22. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +38 -0
  23. package/deps/rocksdb/rocksdb/db/db_basic_test.cc +17 -5
  24. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +4 -7
  25. package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +74 -71
  26. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +70 -1
  27. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +13 -12
  28. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +36 -0
  29. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +11 -4
  30. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +1 -1
  31. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +139 -91
  32. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +48 -14
  33. package/deps/rocksdb/rocksdb/db/db_kv_checksum_test.cc +90 -55
  34. package/deps/rocksdb/rocksdb/db/db_rate_limiter_test.cc +9 -4
  35. package/deps/rocksdb/rocksdb/db/db_test.cc +3 -1
  36. package/deps/rocksdb/rocksdb/db/db_wal_test.cc +12 -7
  37. package/deps/rocksdb/rocksdb/db/db_write_test.cc +35 -0
  38. package/deps/rocksdb/rocksdb/db/dbformat.cc +3 -1
  39. package/deps/rocksdb/rocksdb/db/dbformat.h +5 -3
  40. package/deps/rocksdb/rocksdb/db/flush_job_test.cc +1 -1
  41. package/deps/rocksdb/rocksdb/db/memtable.cc +1 -0
  42. package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +4 -2
  43. package/deps/rocksdb/rocksdb/db/repair.cc +1 -1
  44. package/deps/rocksdb/rocksdb/db/version_builder.cc +43 -1
  45. package/deps/rocksdb/rocksdb/db/version_edit.cc +13 -5
  46. package/deps/rocksdb/rocksdb/db/version_edit.h +22 -1
  47. package/deps/rocksdb/rocksdb/db/version_edit_handler.cc +4 -5
  48. package/deps/rocksdb/rocksdb/db/version_set.cc +109 -41
  49. package/deps/rocksdb/rocksdb/db/version_set.h +36 -3
  50. package/deps/rocksdb/rocksdb/db/version_set_sync_and_async.h +1 -4
  51. package/deps/rocksdb/rocksdb/db/version_set_test.cc +10 -10
  52. package/deps/rocksdb/rocksdb/db/version_util.h +1 -1
  53. package/deps/rocksdb/rocksdb/db/wal_manager_test.cc +1 -1
  54. package/deps/rocksdb/rocksdb/db/write_batch.cc +34 -10
  55. package/deps/rocksdb/rocksdb/db/write_batch_internal.h +2 -0
  56. package/deps/rocksdb/rocksdb/db/write_callback_test.cc +4 -0
  57. package/deps/rocksdb/rocksdb/db_stress_tool/batched_ops_stress.cc +2 -0
  58. package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +4 -1
  59. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +1 -1
  60. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +7 -5
  61. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +5 -10
  62. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +0 -7
  63. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +2 -0
  64. package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +24 -3
  65. package/deps/rocksdb/rocksdb/file/writable_file_writer.cc +8 -0
  66. package/deps/rocksdb/rocksdb/file/writable_file_writer.h +10 -0
  67. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +5 -0
  68. package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +4 -4
  69. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +9 -5
  70. package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +5 -0
  71. package/deps/rocksdb/rocksdb/include/rocksdb/types.h +1 -0
  72. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/write_batch_with_index.h +1 -1
  73. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +1 -1
  74. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch.h +0 -3
  75. package/deps/rocksdb/rocksdb/microbench/ribbon_bench.cc +8 -6
  76. package/deps/rocksdb/rocksdb/monitoring/statistics.cc +3 -1
  77. package/deps/rocksdb/rocksdb/options/options_helper.cc +4 -2
  78. package/deps/rocksdb/rocksdb/options/options_test.cc +1 -11
  79. package/deps/rocksdb/rocksdb/port/port_posix.h +7 -0
  80. package/deps/rocksdb/rocksdb/port/win/port_win.h +11 -3
  81. package/deps/rocksdb/rocksdb/src.mk +6 -2
  82. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +4 -33
  83. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.h +3 -3
  84. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +38 -118
  85. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +6 -8
  86. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +10 -13
  87. package/deps/rocksdb/rocksdb/table/block_based/block_like_traits.h +4 -9
  88. package/deps/rocksdb/rocksdb/table/block_based/block_type.h +0 -1
  89. package/deps/rocksdb/rocksdb/table/block_based/filter_block.h +10 -28
  90. package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.cc +2 -3
  91. package/deps/rocksdb/rocksdb/table/block_based/filter_policy.cc +0 -91
  92. package/deps/rocksdb/rocksdb/table/block_based/filter_policy_internal.h +2 -30
  93. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.cc +6 -27
  94. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.h +11 -13
  95. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block_test.cc +28 -40
  96. package/deps/rocksdb/rocksdb/table/block_based/mock_block_based_table.h +0 -1
  97. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +22 -43
  98. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.h +11 -22
  99. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +24 -25
  100. package/deps/rocksdb/rocksdb/table/block_fetcher.cc +0 -1
  101. package/deps/rocksdb/rocksdb/table/get_context.h +0 -1
  102. package/deps/rocksdb/rocksdb/table/table_test.cc +3 -18
  103. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +3 -16
  104. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +3 -3
  105. package/deps/rocksdb/rocksdb/tools/ldb_cmd_test.cc +1 -1
  106. package/deps/rocksdb/rocksdb/util/bloom_test.cc +0 -201
  107. package/deps/rocksdb/rocksdb/util/distributed_mutex.h +48 -0
  108. package/deps/rocksdb/rocksdb/util/filter_bench.cc +5 -11
  109. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +3 -0
  110. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.cc +7 -21
  111. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.h +1 -1
  112. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_test.cc +45 -0
  113. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction_db.h +21 -14
  114. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.cc +10 -1
  115. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.cc +3 -1
  116. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.cc +9 -0
  117. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.cc +3 -2
  118. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn_db.cc +3 -1
  119. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +5 -4
  120. package/deps/rocksdb/rocksdb.gyp +1 -1
  121. package/index.js +36 -14
  122. package/package-lock.json +2 -2
  123. package/package.json +1 -1
  124. package/prebuilds/darwin-arm64/node.napi.node +0 -0
  125. package/prebuilds/linux-x64/node.napi.node +0 -0
  126. package/deps/rocksdb/rocksdb/table/block_based/block_based_filter_block.cc +0 -358
  127. package/deps/rocksdb/rocksdb/table/block_based/block_based_filter_block.h +0 -127
  128. package/deps/rocksdb/rocksdb/table/block_based/block_based_filter_block_test.cc +0 -219
@@ -845,6 +845,131 @@ Status DBImpl::LogAndApplyForRecovery(const RecoveryContext& recovery_ctx) {
845
845
  return s;
846
846
  }
847
847
 
848
+ void DBImpl::InvokeWalFilterIfNeededOnColumnFamilyToWalNumberMap() {
849
+ #ifndef ROCKSDB_LITE
850
+ if (immutable_db_options_.wal_filter == nullptr) {
851
+ return;
852
+ }
853
+ assert(immutable_db_options_.wal_filter != nullptr);
854
+ WalFilter& wal_filter = *(immutable_db_options_.wal_filter);
855
+
856
+ std::map<std::string, uint32_t> cf_name_id_map;
857
+ std::map<uint32_t, uint64_t> cf_lognumber_map;
858
+ assert(versions_);
859
+ assert(versions_->GetColumnFamilySet());
860
+ for (auto cfd : *versions_->GetColumnFamilySet()) {
861
+ assert(cfd);
862
+ cf_name_id_map.insert(std::make_pair(cfd->GetName(), cfd->GetID()));
863
+ cf_lognumber_map.insert(std::make_pair(cfd->GetID(), cfd->GetLogNumber()));
864
+ }
865
+
866
+ wal_filter.ColumnFamilyLogNumberMap(cf_lognumber_map, cf_name_id_map);
867
+ #endif // !ROCKSDB_LITE
868
+ }
869
+
870
+ bool DBImpl::InvokeWalFilterIfNeededOnWalRecord(uint64_t wal_number,
871
+ const std::string& wal_fname,
872
+ log::Reader::Reporter& reporter,
873
+ Status& status,
874
+ bool& stop_replay,
875
+ WriteBatch& batch) {
876
+ #ifndef ROCKSDB_LITE
877
+ if (immutable_db_options_.wal_filter == nullptr) {
878
+ return true;
879
+ }
880
+ assert(immutable_db_options_.wal_filter != nullptr);
881
+ WalFilter& wal_filter = *(immutable_db_options_.wal_filter);
882
+
883
+ WriteBatch new_batch;
884
+ bool batch_changed = false;
885
+
886
+ bool process_current_record = true;
887
+
888
+ WalFilter::WalProcessingOption wal_processing_option =
889
+ wal_filter.LogRecordFound(wal_number, wal_fname, batch, &new_batch,
890
+ &batch_changed);
891
+
892
+ switch (wal_processing_option) {
893
+ case WalFilter::WalProcessingOption::kContinueProcessing:
894
+ // do nothing, proceeed normally
895
+ break;
896
+ case WalFilter::WalProcessingOption::kIgnoreCurrentRecord:
897
+ // skip current record
898
+ process_current_record = false;
899
+ break;
900
+ case WalFilter::WalProcessingOption::kStopReplay:
901
+ // skip current record and stop replay
902
+ process_current_record = false;
903
+ stop_replay = true;
904
+ break;
905
+ case WalFilter::WalProcessingOption::kCorruptedRecord: {
906
+ status = Status::Corruption("Corruption reported by Wal Filter ",
907
+ wal_filter.Name());
908
+ MaybeIgnoreError(&status);
909
+ if (!status.ok()) {
910
+ process_current_record = false;
911
+ reporter.Corruption(batch.GetDataSize(), status);
912
+ }
913
+ break;
914
+ }
915
+ default: {
916
+ // logical error which should not happen. If RocksDB throws, we would
917
+ // just do `throw std::logic_error`.
918
+ assert(false);
919
+ status = Status::NotSupported(
920
+ "Unknown WalProcessingOption returned by Wal Filter ",
921
+ wal_filter.Name());
922
+ MaybeIgnoreError(&status);
923
+ if (!status.ok()) {
924
+ // Ignore the error with current record processing.
925
+ stop_replay = true;
926
+ }
927
+ break;
928
+ }
929
+ }
930
+
931
+ if (!process_current_record) {
932
+ return false;
933
+ }
934
+
935
+ if (batch_changed) {
936
+ // Make sure that the count in the new batch is
937
+ // within the orignal count.
938
+ int new_count = WriteBatchInternal::Count(&new_batch);
939
+ int original_count = WriteBatchInternal::Count(&batch);
940
+ if (new_count > original_count) {
941
+ ROCKS_LOG_FATAL(
942
+ immutable_db_options_.info_log,
943
+ "Recovering log #%" PRIu64
944
+ " mode %d log filter %s returned "
945
+ "more records (%d) than original (%d) which is not allowed. "
946
+ "Aborting recovery.",
947
+ wal_number, static_cast<int>(immutable_db_options_.wal_recovery_mode),
948
+ wal_filter.Name(), new_count, original_count);
949
+ status = Status::NotSupported(
950
+ "More than original # of records "
951
+ "returned by Wal Filter ",
952
+ wal_filter.Name());
953
+ return false;
954
+ }
955
+ // Set the same sequence number in the new_batch
956
+ // as the original batch.
957
+ WriteBatchInternal::SetSequence(&new_batch,
958
+ WriteBatchInternal::Sequence(&batch));
959
+ batch = new_batch;
960
+ }
961
+ return true;
962
+ #else // !ROCKSDB_LITE
963
+ (void)wal_number;
964
+ (void)wal_fname;
965
+ (void)reporter;
966
+ (void)status;
967
+ (void)stop_replay;
968
+ (void)batch;
969
+ return true;
970
+ #endif // ROCKSDB_LITE
971
+ }
972
+
848
973
  // REQUIRES: wal_numbers are sorted in ascending order
849
974
  Status DBImpl::RecoverLogFiles(const std::vector<uint64_t>& wal_numbers,
850
975
  SequenceNumber* next_sequence, bool read_only,
@@ -887,20 +1012,8 @@ Status DBImpl::RecoverLogFiles(const std::vector<uint64_t>& wal_numbers,
887
1012
  stream.EndArray();
888
1013
  }
889
1014
 
890
- #ifndef ROCKSDB_LITE
891
- if (immutable_db_options_.wal_filter != nullptr) {
892
- std::map<std::string, uint32_t> cf_name_id_map;
893
- std::map<uint32_t, uint64_t> cf_lognumber_map;
894
- for (auto cfd : *versions_->GetColumnFamilySet()) {
895
- cf_name_id_map.insert(std::make_pair(cfd->GetName(), cfd->GetID()));
896
- cf_lognumber_map.insert(
897
- std::make_pair(cfd->GetID(), cfd->GetLogNumber()));
898
- }
899
-
900
- immutable_db_options_.wal_filter->ColumnFamilyLogNumberMap(cf_lognumber_map,
901
- cf_name_id_map);
902
- }
903
- #endif
1015
+ // No-op for immutable_db_options_.wal_filter == nullptr.
1016
+ InvokeWalFilterIfNeededOnColumnFamilyToWalNumberMap();
904
1017
 
905
1018
  bool stop_replay_by_wal_filter = false;
906
1019
  bool stop_replay_for_corruption = false;
@@ -1003,12 +1116,17 @@ Status DBImpl::RecoverLogFiles(const std::vector<uint64_t>& wal_numbers,
1003
1116
 
1004
1117
  // We create a new batch and initialize with a valid prot_info_ to store
1005
1118
  // the data checksums
1006
- WriteBatch batch(0, 0, 8, 0);
1119
+ WriteBatch batch;
1007
1120
 
1008
1121
  status = WriteBatchInternal::SetContents(&batch, record);
1009
1122
  if (!status.ok()) {
1010
1123
  return status;
1011
1124
  }
1125
+ status = WriteBatchInternal::UpdateProtectionInfo(&batch,
1126
+ 8 /* bytes_per_key */);
1127
+ if (!status.ok()) {
1128
+ return status;
1129
+ }
1012
1130
 
1013
1131
  SequenceNumber sequence = WriteBatchInternal::Sequence(&batch);
1014
1132
 
@@ -1027,83 +1145,13 @@ Status DBImpl::RecoverLogFiles(const std::vector<uint64_t>& wal_numbers,
1027
1145
  }
1028
1146
  }
1029
1147
 
1030
- #ifndef ROCKSDB_LITE
1031
- if (immutable_db_options_.wal_filter != nullptr) {
1032
- WriteBatch new_batch;
1033
- bool batch_changed = false;
1034
-
1035
- WalFilter::WalProcessingOption wal_processing_option =
1036
- immutable_db_options_.wal_filter->LogRecordFound(
1037
- wal_number, fname, batch, &new_batch, &batch_changed);
1038
-
1039
- switch (wal_processing_option) {
1040
- case WalFilter::WalProcessingOption::kContinueProcessing:
1041
- // do nothing, proceeed normally
1042
- break;
1043
- case WalFilter::WalProcessingOption::kIgnoreCurrentRecord:
1044
- // skip current record
1045
- continue;
1046
- case WalFilter::WalProcessingOption::kStopReplay:
1047
- // skip current record and stop replay
1048
- stop_replay_by_wal_filter = true;
1049
- continue;
1050
- case WalFilter::WalProcessingOption::kCorruptedRecord: {
1051
- status =
1052
- Status::Corruption("Corruption reported by Wal Filter ",
1053
- immutable_db_options_.wal_filter->Name());
1054
- MaybeIgnoreError(&status);
1055
- if (!status.ok()) {
1056
- reporter.Corruption(record.size(), status);
1057
- continue;
1058
- }
1059
- break;
1060
- }
1061
- default: {
1062
- assert(false); // unhandled case
1063
- status = Status::NotSupported(
1064
- "Unknown WalProcessingOption returned"
1065
- " by Wal Filter ",
1066
- immutable_db_options_.wal_filter->Name());
1067
- MaybeIgnoreError(&status);
1068
- if (!status.ok()) {
1069
- return status;
1070
- } else {
1071
- // Ignore the error with current record processing.
1072
- continue;
1073
- }
1074
- }
1075
- }
1076
-
1077
- if (batch_changed) {
1078
- // Make sure that the count in the new batch is
1079
- // within the orignal count.
1080
- int new_count = WriteBatchInternal::Count(&new_batch);
1081
- int original_count = WriteBatchInternal::Count(&batch);
1082
- if (new_count > original_count) {
1083
- ROCKS_LOG_FATAL(
1084
- immutable_db_options_.info_log,
1085
- "Recovering log #%" PRIu64
1086
- " mode %d log filter %s returned "
1087
- "more records (%d) than original (%d) which is not allowed. "
1088
- "Aborting recovery.",
1089
- wal_number,
1090
- static_cast<int>(immutable_db_options_.wal_recovery_mode),
1091
- immutable_db_options_.wal_filter->Name(), new_count,
1092
- original_count);
1093
- status = Status::NotSupported(
1094
- "More than original # of records "
1095
- "returned by Wal Filter ",
1096
- immutable_db_options_.wal_filter->Name());
1097
- return status;
1098
- }
1099
- // Set the same sequence number in the new_batch
1100
- // as the original batch.
1101
- WriteBatchInternal::SetSequence(&new_batch,
1102
- WriteBatchInternal::Sequence(&batch));
1103
- batch = new_batch;
1104
- }
1148
+ // For the default case of wal_filter == nullptr, always performs no-op
1149
+ // and returns true.
1150
+ if (!InvokeWalFilterIfNeededOnWalRecord(wal_number, fname, reporter,
1151
+ status, stop_replay_by_wal_filter,
1152
+ batch)) {
1153
+ continue;
1105
1154
  }
1106
- #endif // ROCKSDB_LITE
1107
1155
 
1108
1156
  // If column family was not found, it might mean that the WAL write
1109
1157
  // batch references to the column family that was dropped after the
@@ -106,15 +106,31 @@ void DBImpl::SetRecoverableStatePreReleaseCallback(
106
106
  }
107
107
 
108
108
  Status DBImpl::Write(const WriteOptions& write_options, WriteBatch* my_batch) {
109
- return WriteImpl(write_options, my_batch, /*callback=*/nullptr,
110
- /*log_used=*/nullptr);
109
+ Status s;
110
+ if (write_options.protection_bytes_per_key > 0) {
111
+ s = WriteBatchInternal::UpdateProtectionInfo(
112
+ my_batch, write_options.protection_bytes_per_key);
113
+ }
114
+ if (s.ok()) {
115
+ s = WriteImpl(write_options, my_batch, /*callback=*/nullptr,
116
+ /*log_used=*/nullptr);
117
+ }
118
+ return s;
111
119
  }
112
120
 
113
121
  #ifndef ROCKSDB_LITE
114
122
  Status DBImpl::WriteWithCallback(const WriteOptions& write_options,
115
123
  WriteBatch* my_batch,
116
124
  WriteCallback* callback) {
117
- return WriteImpl(write_options, my_batch, callback, nullptr);
125
+ Status s;
126
+ if (write_options.protection_bytes_per_key > 0) {
127
+ s = WriteBatchInternal::UpdateProtectionInfo(
128
+ my_batch, write_options.protection_bytes_per_key);
129
+ }
130
+ if (s.ok()) {
131
+ s = WriteImpl(write_options, my_batch, callback, nullptr);
132
+ }
133
+ return s;
118
134
  }
119
135
  #endif // ROCKSDB_LITE
120
136
 
@@ -129,6 +145,10 @@ Status DBImpl::WriteImpl(const WriteOptions& write_options,
129
145
  PreReleaseCallback* pre_release_callback,
130
146
  PostMemTableCallback* post_memtable_callback) {
131
147
  assert(!seq_per_batch_ || batch_cnt != 0);
148
+ assert(my_batch == nullptr || my_batch->Count() == 0 ||
149
+ write_options.protection_bytes_per_key == 0 ||
150
+ write_options.protection_bytes_per_key ==
151
+ my_batch->GetProtectionBytesPerKey());
132
152
  if (my_batch == nullptr) {
133
153
  return Status::InvalidArgument("Batch is nullptr!");
134
154
  } else if (!disable_memtable &&
@@ -156,6 +176,10 @@ Status DBImpl::WriteImpl(const WriteOptions& write_options,
156
176
  "rate-limiting automatic WAL flush, which requires "
157
177
  "`WriteOptions::disableWAL` and "
158
178
  "`DBOptions::manual_wal_flush` both set to false");
179
+ } else if (write_options.protection_bytes_per_key != 0 &&
180
+ write_options.protection_bytes_per_key != 8) {
181
+ return Status::InvalidArgument(
182
+ "`WriteOptions::protection_bytes_per_key` must be zero or eight");
159
183
  }
160
184
  // TODO: this use of operator bool on `tracer_` can avoid unnecessary lock
161
185
  // grabs but does not seem thread-safe.
@@ -1157,17 +1181,16 @@ Status DBImpl::PreprocessWrite(const WriteOptions& write_options,
1157
1181
  // Note: there does not seem to be a reason to wait for parallel sync at
1158
1182
  // this early step but it is not important since parallel sync (SyncWAL) and
1159
1183
  // need_log_sync are usually not used together.
1160
- while (logs_.front().getting_synced) {
1184
+ while (logs_.front().IsSyncing()) {
1161
1185
  log_sync_cv_.Wait();
1162
1186
  }
1163
1187
  for (auto& log : logs_) {
1164
- assert(!log.getting_synced);
1165
1188
  // This is just to prevent the logs to be synced by a parallel SyncWAL
1166
1189
  // call. We will do the actual syncing later after we will write to the
1167
1190
  // WAL.
1168
1191
  // Note: there does not seem to be a reason to set this early before we
1169
1192
  // actually write to the WAL
1170
- log.getting_synced = true;
1193
+ log.PrepareForSync();
1171
1194
  }
1172
1195
  } else {
1173
1196
  *need_log_sync = false;
@@ -2188,7 +2211,8 @@ Status DB::Put(const WriteOptions& opt, ColumnFamilyHandle* column_family,
2188
2211
  // Pre-allocate size of write batch conservatively.
2189
2212
  // 8 bytes are taken by header, 4 bytes for count, 1 byte for type,
2190
2213
  // and we allocate 11 extra bytes for key length, as well as value length.
2191
- WriteBatch batch(key.size() + value.size() + 24);
2214
+ WriteBatch batch(key.size() + value.size() + 24, 0 /* max_bytes */,
2215
+ opt.protection_bytes_per_key, 0 /* default_cf_ts_sz */);
2192
2216
  Status s = batch.Put(column_family, key, value);
2193
2217
  if (!s.ok()) {
2194
2218
  return s;
@@ -2202,7 +2226,9 @@ Status DB::Put(const WriteOptions& opt, ColumnFamilyHandle* column_family,
2202
2226
  assert(default_cf);
2203
2227
  const Comparator* const default_cf_ucmp = default_cf->GetComparator();
2204
2228
  assert(default_cf_ucmp);
2205
- WriteBatch batch(0, 0, 0, default_cf_ucmp->timestamp_size());
2229
+ WriteBatch batch(0 /* reserved_bytes */, 0 /* max_bytes */,
2230
+ opt.protection_bytes_per_key,
2231
+ default_cf_ucmp->timestamp_size());
2206
2232
  Status s = batch.Put(column_family, key, ts, value);
2207
2233
  if (!s.ok()) {
2208
2234
  return s;
@@ -2212,7 +2238,8 @@ Status DB::Put(const WriteOptions& opt, ColumnFamilyHandle* column_family,
2212
2238
 
2213
2239
  Status DB::Delete(const WriteOptions& opt, ColumnFamilyHandle* column_family,
2214
2240
  const Slice& key) {
2215
- WriteBatch batch;
2241
+ WriteBatch batch(0 /* reserved_bytes */, 0 /* max_bytes */,
2242
+ opt.protection_bytes_per_key, 0 /* default_cf_ts_sz */);
2216
2243
  Status s = batch.Delete(column_family, key);
2217
2244
  if (!s.ok()) {
2218
2245
  return s;
@@ -2226,7 +2253,9 @@ Status DB::Delete(const WriteOptions& opt, ColumnFamilyHandle* column_family,
2226
2253
  assert(default_cf);
2227
2254
  const Comparator* const default_cf_ucmp = default_cf->GetComparator();
2228
2255
  assert(default_cf_ucmp);
2229
- WriteBatch batch(0, 0, 0, default_cf_ucmp->timestamp_size());
2256
+ WriteBatch batch(0 /* reserved_bytes */, 0 /* max_bytes */,
2257
+ opt.protection_bytes_per_key,
2258
+ default_cf_ucmp->timestamp_size());
2230
2259
  Status s = batch.Delete(column_family, key, ts);
2231
2260
  if (!s.ok()) {
2232
2261
  return s;
@@ -2236,7 +2265,8 @@ Status DB::Delete(const WriteOptions& opt, ColumnFamilyHandle* column_family,
2236
2265
 
2237
2266
  Status DB::SingleDelete(const WriteOptions& opt,
2238
2267
  ColumnFamilyHandle* column_family, const Slice& key) {
2239
- WriteBatch batch;
2268
+ WriteBatch batch(0 /* reserved_bytes */, 0 /* max_bytes */,
2269
+ opt.protection_bytes_per_key, 0 /* default_cf_ts_sz */);
2240
2270
  Status s = batch.SingleDelete(column_family, key);
2241
2271
  if (!s.ok()) {
2242
2272
  return s;
@@ -2251,7 +2281,9 @@ Status DB::SingleDelete(const WriteOptions& opt,
2251
2281
  assert(default_cf);
2252
2282
  const Comparator* const default_cf_ucmp = default_cf->GetComparator();
2253
2283
  assert(default_cf_ucmp);
2254
- WriteBatch batch(0, 0, 0, default_cf_ucmp->timestamp_size());
2284
+ WriteBatch batch(0 /* reserved_bytes */, 0 /* max_bytes */,
2285
+ opt.protection_bytes_per_key,
2286
+ default_cf_ucmp->timestamp_size());
2255
2287
  Status s = batch.SingleDelete(column_family, key, ts);
2256
2288
  if (!s.ok()) {
2257
2289
  return s;
@@ -2262,7 +2294,8 @@ Status DB::SingleDelete(const WriteOptions& opt,
2262
2294
  Status DB::DeleteRange(const WriteOptions& opt,
2263
2295
  ColumnFamilyHandle* column_family,
2264
2296
  const Slice& begin_key, const Slice& end_key) {
2265
- WriteBatch batch;
2297
+ WriteBatch batch(0 /* reserved_bytes */, 0 /* max_bytes */,
2298
+ opt.protection_bytes_per_key, 0 /* default_cf_ts_sz */);
2266
2299
  Status s = batch.DeleteRange(column_family, begin_key, end_key);
2267
2300
  if (!s.ok()) {
2268
2301
  return s;
@@ -2272,7 +2305,8 @@ Status DB::DeleteRange(const WriteOptions& opt,
2272
2305
 
2273
2306
  Status DB::Merge(const WriteOptions& opt, ColumnFamilyHandle* column_family,
2274
2307
  const Slice& key, const Slice& value) {
2275
- WriteBatch batch;
2308
+ WriteBatch batch(0 /* reserved_bytes */, 0 /* max_bytes */,
2309
+ opt.protection_bytes_per_key, 0 /* default_cf_ts_sz */);
2276
2310
  Status s = batch.Merge(column_family, key, value);
2277
2311
  if (!s.ok()) {
2278
2312
  return s;