@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.
- package/binding.cc +320 -324
- package/chained-batch.js +6 -1
- package/deps/rocksdb/rocksdb/CMakeLists.txt +8 -3
- package/deps/rocksdb/rocksdb/Makefile +10 -4
- package/deps/rocksdb/rocksdb/TARGETS +6 -4
- package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +9 -0
- package/deps/rocksdb/rocksdb/cache/cache_test.cc +14 -0
- package/deps/rocksdb/rocksdb/cache/clock_cache.cc +8 -8
- package/deps/rocksdb/rocksdb/cache/fast_lru_cache.cc +272 -174
- package/deps/rocksdb/rocksdb/cache/fast_lru_cache.h +201 -57
- package/deps/rocksdb/rocksdb/cache/lru_cache.cc +19 -19
- package/deps/rocksdb/rocksdb/cache/lru_cache.h +2 -1
- package/deps/rocksdb/rocksdb/db/blob/blob_source.cc +170 -0
- package/deps/rocksdb/rocksdb/db/blob/blob_source.h +95 -0
- package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +298 -0
- package/deps/rocksdb/rocksdb/db/blob/db_blob_basic_test.cc +172 -0
- package/deps/rocksdb/rocksdb/db/column_family.cc +8 -3
- package/deps/rocksdb/rocksdb/db/column_family.h +6 -3
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +10 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +6 -6
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +22 -2
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +38 -0
- package/deps/rocksdb/rocksdb/db/db_basic_test.cc +17 -5
- package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +4 -7
- package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +74 -71
- package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +70 -1
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +13 -12
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +36 -0
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +11 -4
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +1 -1
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +139 -91
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +48 -14
- package/deps/rocksdb/rocksdb/db/db_kv_checksum_test.cc +90 -55
- package/deps/rocksdb/rocksdb/db/db_rate_limiter_test.cc +9 -4
- package/deps/rocksdb/rocksdb/db/db_test.cc +3 -1
- package/deps/rocksdb/rocksdb/db/db_wal_test.cc +12 -7
- package/deps/rocksdb/rocksdb/db/db_write_test.cc +35 -0
- package/deps/rocksdb/rocksdb/db/dbformat.cc +3 -1
- package/deps/rocksdb/rocksdb/db/dbformat.h +5 -3
- package/deps/rocksdb/rocksdb/db/flush_job_test.cc +1 -1
- package/deps/rocksdb/rocksdb/db/memtable.cc +1 -0
- package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +4 -2
- package/deps/rocksdb/rocksdb/db/repair.cc +1 -1
- package/deps/rocksdb/rocksdb/db/version_builder.cc +43 -1
- package/deps/rocksdb/rocksdb/db/version_edit.cc +13 -5
- package/deps/rocksdb/rocksdb/db/version_edit.h +22 -1
- package/deps/rocksdb/rocksdb/db/version_edit_handler.cc +4 -5
- package/deps/rocksdb/rocksdb/db/version_set.cc +109 -41
- package/deps/rocksdb/rocksdb/db/version_set.h +36 -3
- package/deps/rocksdb/rocksdb/db/version_set_sync_and_async.h +1 -4
- package/deps/rocksdb/rocksdb/db/version_set_test.cc +10 -10
- package/deps/rocksdb/rocksdb/db/version_util.h +1 -1
- package/deps/rocksdb/rocksdb/db/wal_manager_test.cc +1 -1
- package/deps/rocksdb/rocksdb/db/write_batch.cc +34 -10
- package/deps/rocksdb/rocksdb/db/write_batch_internal.h +2 -0
- package/deps/rocksdb/rocksdb/db/write_callback_test.cc +4 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/batched_ops_stress.cc +2 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +4 -1
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +1 -1
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +7 -5
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +5 -10
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +0 -7
- package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +2 -0
- package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +24 -3
- package/deps/rocksdb/rocksdb/file/writable_file_writer.cc +8 -0
- package/deps/rocksdb/rocksdb/file/writable_file_writer.h +10 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +5 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +4 -4
- package/deps/rocksdb/rocksdb/include/rocksdb/options.h +9 -5
- package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +5 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/types.h +1 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/write_batch_with_index.h +1 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/version.h +1 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/write_batch.h +0 -3
- package/deps/rocksdb/rocksdb/microbench/ribbon_bench.cc +8 -6
- package/deps/rocksdb/rocksdb/monitoring/statistics.cc +3 -1
- package/deps/rocksdb/rocksdb/options/options_helper.cc +4 -2
- package/deps/rocksdb/rocksdb/options/options_test.cc +1 -11
- package/deps/rocksdb/rocksdb/port/port_posix.h +7 -0
- package/deps/rocksdb/rocksdb/port/win/port_win.h +11 -3
- package/deps/rocksdb/rocksdb/src.mk +6 -2
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +4 -33
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.h +3 -3
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +38 -118
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +6 -8
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +10 -13
- package/deps/rocksdb/rocksdb/table/block_based/block_like_traits.h +4 -9
- package/deps/rocksdb/rocksdb/table/block_based/block_type.h +0 -1
- package/deps/rocksdb/rocksdb/table/block_based/filter_block.h +10 -28
- package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.cc +2 -3
- package/deps/rocksdb/rocksdb/table/block_based/filter_policy.cc +0 -91
- package/deps/rocksdb/rocksdb/table/block_based/filter_policy_internal.h +2 -30
- package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.cc +6 -27
- package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.h +11 -13
- package/deps/rocksdb/rocksdb/table/block_based/full_filter_block_test.cc +28 -40
- package/deps/rocksdb/rocksdb/table/block_based/mock_block_based_table.h +0 -1
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +22 -43
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.h +11 -22
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +24 -25
- package/deps/rocksdb/rocksdb/table/block_fetcher.cc +0 -1
- package/deps/rocksdb/rocksdb/table/get_context.h +0 -1
- package/deps/rocksdb/rocksdb/table/table_test.cc +3 -18
- package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +3 -16
- package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +3 -3
- package/deps/rocksdb/rocksdb/tools/ldb_cmd_test.cc +1 -1
- package/deps/rocksdb/rocksdb/util/bloom_test.cc +0 -201
- package/deps/rocksdb/rocksdb/util/distributed_mutex.h +48 -0
- package/deps/rocksdb/rocksdb/util/filter_bench.cc +5 -11
- package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +3 -0
- package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.cc +7 -21
- package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.h +1 -1
- package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_test.cc +45 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction_db.h +21 -14
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.cc +10 -1
- package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.cc +3 -1
- package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.cc +9 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.cc +3 -2
- package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn_db.cc +3 -1
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +5 -4
- package/deps/rocksdb/rocksdb.gyp +1 -1
- package/index.js +36 -14
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/prebuilds/darwin-arm64/node.napi.node +0 -0
- package/prebuilds/linux-x64/node.napi.node +0 -0
- package/deps/rocksdb/rocksdb/table/block_based/block_based_filter_block.cc +0 -358
- package/deps/rocksdb/rocksdb/table/block_based/block_based_filter_block.h +0 -127
- 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
|
-
|
|
891
|
-
|
|
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
|
|
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
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
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
|
-
|
|
110
|
-
|
|
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
|
-
|
|
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().
|
|
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.
|
|
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
|
|
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
|
|
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
|
|
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;
|