@nxtedition/rocksdb 12.1.3 → 12.1.5

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 (133) hide show
  1. package/binding.cc +12 -13
  2. package/binding.gyp +0 -4
  3. package/deps/rocksdb/rocksdb/Makefile +10 -5
  4. package/deps/rocksdb/rocksdb/TARGETS +9 -7
  5. package/deps/rocksdb/rocksdb/cache/cache.cc +15 -11
  6. package/deps/rocksdb/rocksdb/cache/cache_test.cc +26 -0
  7. package/deps/rocksdb/rocksdb/cache/clock_cache.cc +16 -0
  8. package/deps/rocksdb/rocksdb/cache/clock_cache.h +6 -0
  9. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +38 -8
  10. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +2 -0
  11. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +4 -0
  12. package/deps/rocksdb/rocksdb/cache/lru_cache.cc +11 -0
  13. package/deps/rocksdb/rocksdb/cache/lru_cache.h +6 -0
  14. package/deps/rocksdb/rocksdb/cache/secondary_cache_adapter.cc +2 -1
  15. package/deps/rocksdb/rocksdb/cache/tiered_secondary_cache_test.cc +56 -0
  16. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +12 -9
  17. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.cc +10 -0
  18. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.h +9 -0
  19. package/deps/rocksdb/rocksdb/db/c.cc +9 -0
  20. package/deps/rocksdb/rocksdb/db/c_test.c +12 -1
  21. package/deps/rocksdb/rocksdb/db/column_family.cc +6 -23
  22. package/deps/rocksdb/rocksdb/db/column_family.h +1 -2
  23. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +4 -5
  24. package/deps/rocksdb/rocksdb/db/compaction/compaction.h +4 -4
  25. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +14 -6
  26. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +19 -16
  27. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +34 -30
  28. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +2 -1
  29. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +2 -1
  30. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.h +1 -1
  31. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +16 -31
  32. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.h +2 -1
  33. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +7 -50
  34. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_job.cc +95 -84
  35. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_test.cc +616 -5
  36. package/deps/rocksdb/rocksdb/db/compaction/compaction_state.cc +1 -1
  37. package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.cc +1 -1
  38. package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.h +1 -1
  39. package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +8 -2
  40. package/deps/rocksdb/rocksdb/db/db_basic_test.cc +93 -69
  41. package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +353 -89
  42. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +4 -3
  43. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +116 -14
  44. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +67 -8
  45. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +42 -14
  46. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +50 -0
  47. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_experimental.cc +1 -1
  48. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +79 -32
  49. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +36 -59
  50. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +72 -39
  51. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +14 -12
  52. package/deps/rocksdb/rocksdb/db/db_io_failure_test.cc +75 -0
  53. package/deps/rocksdb/rocksdb/db/db_iter.cc +7 -3
  54. package/deps/rocksdb/rocksdb/db/db_secondary_test.cc +1 -1
  55. package/deps/rocksdb/rocksdb/db/db_sst_test.cc +24 -0
  56. package/deps/rocksdb/rocksdb/db/db_test2.cc +36 -22
  57. package/deps/rocksdb/rocksdb/db/db_wal_test.cc +23 -0
  58. package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +2 -0
  59. package/deps/rocksdb/rocksdb/db/error_handler.cc +28 -3
  60. package/deps/rocksdb/rocksdb/db/error_handler.h +2 -1
  61. package/deps/rocksdb/rocksdb/db/event_helpers.cc +1 -0
  62. package/deps/rocksdb/rocksdb/db/experimental.cc +165 -33
  63. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +13 -5
  64. package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +37 -28
  65. package/deps/rocksdb/rocksdb/db/flush_job.cc +11 -6
  66. package/deps/rocksdb/rocksdb/db/flush_job_test.cc +7 -6
  67. package/deps/rocksdb/rocksdb/db/forward_iterator.cc +14 -6
  68. package/deps/rocksdb/rocksdb/db/job_context.h +4 -0
  69. package/deps/rocksdb/rocksdb/db/memtable.cc +24 -14
  70. package/deps/rocksdb/rocksdb/db/memtable.h +2 -1
  71. package/deps/rocksdb/rocksdb/db/memtable_list.cc +61 -33
  72. package/deps/rocksdb/rocksdb/db/memtable_list.h +8 -0
  73. package/deps/rocksdb/rocksdb/db/repair.cc +4 -2
  74. package/deps/rocksdb/rocksdb/db/table_cache.cc +2 -0
  75. package/deps/rocksdb/rocksdb/db/version_builder.cc +14 -11
  76. package/deps/rocksdb/rocksdb/db/version_edit_handler.h +20 -4
  77. package/deps/rocksdb/rocksdb/db/version_set.cc +40 -30
  78. package/deps/rocksdb/rocksdb/db/version_set.h +13 -3
  79. package/deps/rocksdb/rocksdb/db/version_set_test.cc +8 -76
  80. package/deps/rocksdb/rocksdb/db/write_batch.cc +6 -2
  81. package/deps/rocksdb/rocksdb/db/write_batch_test.cc +1 -1
  82. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +1 -0
  83. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +5 -1
  84. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +2 -1
  85. package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.cc +25 -2
  86. package/deps/rocksdb/rocksdb/env/fs_remap.cc +11 -0
  87. package/deps/rocksdb/rocksdb/env/fs_remap.h +5 -0
  88. package/deps/rocksdb/rocksdb/file/sst_file_manager_impl.cc +11 -1
  89. package/deps/rocksdb/rocksdb/file/sst_file_manager_impl.h +3 -1
  90. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_cache.h +20 -1
  91. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +10 -8
  92. package/deps/rocksdb/rocksdb/include/rocksdb/c.h +4 -0
  93. package/deps/rocksdb/rocksdb/include/rocksdb/compaction_job_stats.h +30 -28
  94. package/deps/rocksdb/rocksdb/include/rocksdb/comparator.h +10 -5
  95. package/deps/rocksdb/rocksdb/include/rocksdb/convenience.h +3 -1
  96. package/deps/rocksdb/rocksdb/include/rocksdb/experimental.h +287 -83
  97. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +68 -36
  98. package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +8 -0
  99. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd.h +1 -0
  100. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +2 -2
  101. package/deps/rocksdb/rocksdb/memtable/inlineskiplist.h +4 -4
  102. package/deps/rocksdb/rocksdb/options/customizable_test.cc +31 -0
  103. package/deps/rocksdb/rocksdb/options/db_options.cc +14 -0
  104. package/deps/rocksdb/rocksdb/options/db_options.h +2 -0
  105. package/deps/rocksdb/rocksdb/options/options_helper.cc +15 -4
  106. package/deps/rocksdb/rocksdb/options/options_helper.h +4 -0
  107. package/deps/rocksdb/rocksdb/options/options_parser.cc +5 -4
  108. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +11 -1
  109. package/deps/rocksdb/rocksdb/options/options_test.cc +38 -45
  110. package/deps/rocksdb/rocksdb/port/port.h +16 -0
  111. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +8 -1
  112. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +10 -20
  113. package/deps/rocksdb/rocksdb/table/block_based/filter_policy.cc +15 -9
  114. package/deps/rocksdb/rocksdb/table/format.cc +32 -4
  115. package/deps/rocksdb/rocksdb/table/format.h +12 -1
  116. package/deps/rocksdb/rocksdb/table/iterator.cc +4 -0
  117. package/deps/rocksdb/rocksdb/table/meta_blocks.cc +214 -161
  118. package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.cc +4 -2
  119. package/deps/rocksdb/rocksdb/table/table_properties.cc +4 -0
  120. package/deps/rocksdb/rocksdb/table/table_reader.h +2 -2
  121. package/deps/rocksdb/rocksdb/table/table_test.cc +5 -4
  122. package/deps/rocksdb/rocksdb/test_util/testutil.cc +2 -0
  123. package/deps/rocksdb/rocksdb/test_util/testutil.h +2 -0
  124. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +11 -2
  125. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +213 -22
  126. package/deps/rocksdb/rocksdb/tools/ldb_cmd_impl.h +3 -0
  127. package/deps/rocksdb/rocksdb/util/async_file_reader.h +1 -1
  128. package/deps/rocksdb/rocksdb/util/compaction_job_stats_impl.cc +3 -0
  129. package/deps/rocksdb/rocksdb/util/coro_utils.h +2 -2
  130. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +3 -3
  131. package/package.json +1 -1
  132. package/prebuilds/darwin-arm64/@nxtedition+rocksdb.node +0 -0
  133. package/prebuilds/linux-x64/@nxtedition+rocksdb.node +0 -0
@@ -1119,48 +1119,6 @@ TEST_F(CompactionPickerTest, FIFOToCold1) {
1119
1119
  ASSERT_EQ(3U, compaction->input(0, 0)->fd.GetNumber());
1120
1120
  }
1121
1121
 
1122
- TEST_F(CompactionPickerTest, FIFOToCold2) {
1123
- NewVersionStorage(1, kCompactionStyleFIFO);
1124
- const uint64_t kFileSize = 100000;
1125
- const uint64_t kMaxSize = kFileSize * 100000;
1126
- uint64_t kColdThreshold = 2000;
1127
-
1128
- fifo_options_.max_table_files_size = kMaxSize;
1129
- fifo_options_.file_temperature_age_thresholds = {
1130
- {Temperature::kCold, kColdThreshold}};
1131
- mutable_cf_options_.compaction_options_fifo = fifo_options_;
1132
- mutable_cf_options_.level0_file_num_compaction_trigger = 100;
1133
- mutable_cf_options_.max_compaction_bytes = kFileSize * 100;
1134
- FIFOCompactionPicker fifo_compaction_picker(ioptions_, &icmp_);
1135
-
1136
- int64_t current_time = 0;
1137
- ASSERT_OK(Env::Default()->GetCurrentTime(&current_time));
1138
- uint64_t threshold_time =
1139
- static_cast<uint64_t>(current_time) - kColdThreshold;
1140
- Add(0, 6U, "240", "290", 2 * kFileSize, 0, 2900, 3000, 0, true,
1141
- Temperature::kUnknown, static_cast<uint64_t>(current_time) - 100);
1142
- Add(0, 4U, "260", "300", 1 * kFileSize, 0, 2500, 2600, 0, true,
1143
- Temperature::kUnknown, threshold_time);
1144
- // The following two files qualify for compaction to kCold.
1145
- Add(0, 3U, "200", "300", 4 * kFileSize, 0, 2300, 2400, 0, true,
1146
- Temperature::kUnknown, threshold_time - 3000);
1147
- Add(0, 2U, "200", "300", 4 * kFileSize, 0, 2100, 2200, 0, true,
1148
- Temperature::kUnknown, threshold_time - 4000);
1149
- UpdateVersionStorageInfo();
1150
-
1151
- ASSERT_EQ(fifo_compaction_picker.NeedsCompaction(vstorage_.get()), true);
1152
- std::unique_ptr<Compaction> compaction(fifo_compaction_picker.PickCompaction(
1153
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
1154
- &log_buffer_));
1155
- ASSERT_TRUE(compaction.get() != nullptr);
1156
- ASSERT_EQ(compaction->compaction_reason(),
1157
- CompactionReason::kChangeTemperature);
1158
- ASSERT_EQ(compaction->output_temperature(), Temperature::kCold);
1159
- ASSERT_EQ(2U, compaction->num_input_files(0));
1160
- ASSERT_EQ(2U, compaction->input(0, 0)->fd.GetNumber());
1161
- ASSERT_EQ(3U, compaction->input(0, 1)->fd.GetNumber());
1162
- }
1163
-
1164
1122
  TEST_F(CompactionPickerTest, FIFOToColdMaxCompactionSize) {
1165
1123
  NewVersionStorage(1, kCompactionStyleFIFO);
1166
1124
  const uint64_t kFileSize = 100000;
@@ -1202,10 +1160,10 @@ TEST_F(CompactionPickerTest, FIFOToColdMaxCompactionSize) {
1202
1160
  ASSERT_TRUE(compaction.get() != nullptr);
1203
1161
  ASSERT_EQ(compaction->compaction_reason(),
1204
1162
  CompactionReason::kChangeTemperature);
1163
+ // Compaction picker picks older files first and picks one file at a time.
1205
1164
  ASSERT_EQ(compaction->output_temperature(), Temperature::kCold);
1206
- ASSERT_EQ(2U, compaction->num_input_files(0));
1165
+ ASSERT_EQ(1U, compaction->num_input_files(0));
1207
1166
  ASSERT_EQ(1U, compaction->input(0, 0)->fd.GetNumber());
1208
- ASSERT_EQ(2U, compaction->input(0, 1)->fd.GetNumber());
1209
1167
  }
1210
1168
 
1211
1169
  TEST_F(CompactionPickerTest, FIFOToColdWithExistingCold) {
@@ -1248,10 +1206,10 @@ TEST_F(CompactionPickerTest, FIFOToColdWithExistingCold) {
1248
1206
  ASSERT_TRUE(compaction.get() != nullptr);
1249
1207
  ASSERT_EQ(compaction->compaction_reason(),
1250
1208
  CompactionReason::kChangeTemperature);
1209
+ // Compaction picker picks older files first and picks one file at a time.
1251
1210
  ASSERT_EQ(compaction->output_temperature(), Temperature::kCold);
1211
+ ASSERT_EQ(1U, compaction->num_input_files(0));
1252
1212
  ASSERT_EQ(2U, compaction->input(0, 0)->fd.GetNumber());
1253
- ASSERT_EQ(2U, compaction->num_input_files(0));
1254
- ASSERT_EQ(3U, compaction->input(0, 1)->fd.GetNumber());
1255
1213
  }
1256
1214
 
1257
1215
  TEST_F(CompactionPickerTest, FIFOToColdWithHotBetweenCold) {
@@ -1299,7 +1257,7 @@ TEST_F(CompactionPickerTest, FIFOToColdWithHotBetweenCold) {
1299
1257
  ASSERT_EQ(2U, compaction->input(0, 0)->fd.GetNumber());
1300
1258
  }
1301
1259
 
1302
- TEST_F(CompactionPickerTest, FIFOToColdAndWarm) {
1260
+ TEST_F(CompactionPickerTest, FIFOToHotAndWarm) {
1303
1261
  NewVersionStorage(1, kCompactionStyleFIFO);
1304
1262
  const uint64_t kFileSize = 100000;
1305
1263
  const uint64_t kMaxSize = kFileSize * 100000;
@@ -1344,11 +1302,10 @@ TEST_F(CompactionPickerTest, FIFOToColdAndWarm) {
1344
1302
  ASSERT_TRUE(compaction.get() != nullptr);
1345
1303
  ASSERT_EQ(compaction->compaction_reason(),
1346
1304
  CompactionReason::kChangeTemperature);
1347
- // Assumes compaction picker picks older files first.
1305
+ // Compaction picker picks older files first and picks one file at a time.
1348
1306
  ASSERT_EQ(compaction->output_temperature(), Temperature::kWarm);
1349
- ASSERT_EQ(2U, compaction->num_input_files(0));
1307
+ ASSERT_EQ(1U, compaction->num_input_files(0));
1350
1308
  ASSERT_EQ(1U, compaction->input(0, 0)->fd.GetNumber());
1351
- ASSERT_EQ(2U, compaction->input(0, 1)->fd.GetNumber());
1352
1309
  }
1353
1310
 
1354
1311
  TEST_F(CompactionPickerTest, CompactionPriMinOverlapping1) {
@@ -39,12 +39,8 @@ CompactionJob::ProcessKeyValueCompactionWithCompactionService(
39
39
  MakeTableFileName(file->fd.GetNumber()));
40
40
  }
41
41
  }
42
- compaction_input.column_family.name =
43
- compaction->column_family_data()->GetName();
44
- compaction_input.column_family.options =
45
- compaction->column_family_data()->GetLatestCFOptions();
46
- compaction_input.db_options =
47
- BuildDBOptions(db_options_, mutable_db_options_copy_);
42
+
43
+ compaction_input.cf_name = compaction->column_family_data()->GetName();
48
44
  compaction_input.snapshots = existing_snapshots_;
49
45
  compaction_input.has_begin = sub_compact->start.has_value();
50
46
  compaction_input.begin =
@@ -52,6 +48,14 @@ CompactionJob::ProcessKeyValueCompactionWithCompactionService(
52
48
  compaction_input.has_end = sub_compact->end.has_value();
53
49
  compaction_input.end =
54
50
  compaction_input.has_end ? sub_compact->end->ToString() : "";
51
+ compaction_input.options_file_number =
52
+ sub_compact->compaction->input_version()
53
+ ->version_set()
54
+ ->options_file_number();
55
+
56
+ TEST_SYNC_POINT_CALLBACK(
57
+ "CompactionServiceJob::ProcessKeyValueCompactionWithCompactionService",
58
+ &compaction_input);
55
59
 
56
60
  std::string compaction_input_binary;
57
61
  Status s = compaction_input.Write(&compaction_input_binary);
@@ -70,10 +74,13 @@ CompactionJob::ProcessKeyValueCompactionWithCompactionService(
70
74
  ROCKS_LOG_INFO(
71
75
  db_options_.info_log,
72
76
  "[%s] [JOB %d] Starting remote compaction (output level: %d): %s",
73
- compaction_input.column_family.name.c_str(), job_id_,
77
+ compaction->column_family_data()->GetName().c_str(), job_id_,
74
78
  compaction_input.output_level, input_files_oss.str().c_str());
75
- CompactionServiceJobInfo info(dbname_, db_id_, db_session_id_,
76
- GetCompactionId(sub_compact), thread_pri_);
79
+ CompactionServiceJobInfo info(
80
+ dbname_, db_id_, db_session_id_, GetCompactionId(sub_compact),
81
+ thread_pri_, compaction->compaction_reason(),
82
+ compaction->is_full_compaction(), compaction->is_manual_compaction(),
83
+ compaction->bottommost_level());
77
84
  CompactionServiceScheduleResponse response =
78
85
  db_options_.compaction_service->Schedule(info, compaction_input_binary);
79
86
  switch (response.status) {
@@ -84,13 +91,14 @@ CompactionJob::ProcessKeyValueCompactionWithCompactionService(
84
91
  "CompactionService failed to schedule a remote compaction job.");
85
92
  ROCKS_LOG_WARN(db_options_.info_log,
86
93
  "[%s] [JOB %d] Remote compaction failed to start.",
87
- compaction_input.column_family.name.c_str(), job_id_);
94
+ compaction->column_family_data()->GetName().c_str(),
95
+ job_id_);
88
96
  return response.status;
89
97
  case CompactionServiceJobStatus::kUseLocal:
90
98
  ROCKS_LOG_INFO(
91
99
  db_options_.info_log,
92
100
  "[%s] [JOB %d] Remote compaction fallback to local by API (Schedule)",
93
- compaction_input.column_family.name.c_str(), job_id_);
101
+ compaction->column_family_data()->GetName().c_str(), job_id_);
94
102
  return response.status;
95
103
  default:
96
104
  assert(false); // unknown status
@@ -99,7 +107,7 @@ CompactionJob::ProcessKeyValueCompactionWithCompactionService(
99
107
 
100
108
  ROCKS_LOG_INFO(db_options_.info_log,
101
109
  "[%s] [JOB %d] Waiting for remote compaction...",
102
- compaction_input.column_family.name.c_str(), job_id_);
110
+ compaction->column_family_data()->GetName().c_str(), job_id_);
103
111
  std::string compaction_result_binary;
104
112
  CompactionServiceJobStatus compaction_status =
105
113
  db_options_.compaction_service->Wait(response.scheduled_job_id,
@@ -109,7 +117,7 @@ CompactionJob::ProcessKeyValueCompactionWithCompactionService(
109
117
  ROCKS_LOG_INFO(
110
118
  db_options_.info_log,
111
119
  "[%s] [JOB %d] Remote compaction fallback to local by API (Wait)",
112
- compaction_input.column_family.name.c_str(), job_id_);
120
+ compaction->column_family_data()->GetName().c_str(), job_id_);
113
121
  return compaction_status;
114
122
  }
115
123
 
@@ -134,9 +142,9 @@ CompactionJob::ProcessKeyValueCompactionWithCompactionService(
134
142
  "result is returned).");
135
143
  compaction_result.status.PermitUncheckedError();
136
144
  }
137
- ROCKS_LOG_WARN(db_options_.info_log,
138
- "[%s] [JOB %d] Remote compaction failed.",
139
- compaction_input.column_family.name.c_str(), job_id_);
145
+ ROCKS_LOG_WARN(
146
+ db_options_.info_log, "[%s] [JOB %d] Remote compaction failed.",
147
+ compaction->column_family_data()->GetName().c_str(), job_id_);
140
148
  return compaction_status;
141
149
  }
142
150
 
@@ -162,7 +170,7 @@ CompactionJob::ProcessKeyValueCompactionWithCompactionService(
162
170
  db_options_.info_log,
163
171
  "[%s] [JOB %d] Received remote compaction result, output path: "
164
172
  "%s, files: %s",
165
- compaction_input.column_family.name.c_str(), job_id_,
173
+ compaction->column_family_data()->GetName().c_str(), job_id_,
166
174
  compaction_result.output_path.c_str(), output_files_oss.str().c_str());
167
175
 
168
176
  // Installation Starts
@@ -195,6 +203,8 @@ CompactionJob::ProcessKeyValueCompactionWithCompactionService(
195
203
  meta.oldest_ancester_time = file.oldest_ancester_time;
196
204
  meta.file_creation_time = file.file_creation_time;
197
205
  meta.epoch_number = file.epoch_number;
206
+ meta.file_checksum = file.file_checksum;
207
+ meta.file_checksum_func_name = file.file_checksum_func_name;
198
208
  meta.marked_for_compaction = file.marked_for_compaction;
199
209
  meta.unique_id = file.unique_id;
200
210
 
@@ -205,8 +215,10 @@ CompactionJob::ProcessKeyValueCompactionWithCompactionService(
205
215
  }
206
216
  sub_compact->compaction_job_stats = compaction_result.stats;
207
217
  sub_compact->Current().SetNumOutputRecords(
208
- compaction_result.num_output_records);
209
- sub_compact->Current().SetTotalBytes(compaction_result.total_bytes);
218
+ compaction_result.stats.num_output_records);
219
+ sub_compact->Current().SetNumOutputFiles(
220
+ compaction_result.stats.num_output_files);
221
+ sub_compact->Current().AddBytesWritten(compaction_result.bytes_written);
210
222
  RecordTick(stats_, REMOTE_COMPACT_READ_BYTES, compaction_result.bytes_read);
211
223
  RecordTick(stats_, REMOTE_COMPACT_WRITE_BYTES,
212
224
  compaction_result.bytes_written);
@@ -226,6 +238,18 @@ void CompactionServiceCompactionJob::RecordCompactionIOStats() {
226
238
  CompactionJob::RecordCompactionIOStats();
227
239
  }
228
240
 
241
+ void CompactionServiceCompactionJob::UpdateCompactionJobStats(
242
+ const InternalStats::CompactionStats& stats) const {
243
+ compaction_job_stats_->elapsed_micros = stats.micros;
244
+
245
+ // output information only in remote compaction
246
+ compaction_job_stats_->total_output_bytes = stats.bytes_written;
247
+ compaction_job_stats_->total_output_bytes_blob = stats.bytes_written_blob;
248
+ compaction_job_stats_->num_output_records = stats.num_output_records;
249
+ compaction_job_stats_->num_output_files = stats.num_output_files;
250
+ compaction_job_stats_->num_output_files_blob = stats.num_output_files_blob;
251
+ }
252
+
229
253
  CompactionServiceCompactionJob::CompactionServiceCompactionJob(
230
254
  int job_id, Compaction* compaction, const ImmutableDBOptions& db_options,
231
255
  const MutableDBOptions& mutable_db_options, const FileOptions& file_options,
@@ -261,11 +285,11 @@ Status CompactionServiceCompactionJob::Run() {
261
285
 
262
286
  auto* c = compact_->compaction;
263
287
  assert(c->column_family_data() != nullptr);
264
- assert(c->column_family_data()->current()->storage_info()->NumLevelFiles(
265
- compact_->compaction->level()) > 0);
288
+ const VersionStorageInfo* storage_info = c->input_version()->storage_info();
289
+ assert(storage_info);
290
+ assert(storage_info->NumLevelFiles(compact_->compaction->level()) > 0);
291
+ write_hint_ = storage_info->CalculateSSTWriteHint(c->output_level());
266
292
 
267
- write_hint_ =
268
- c->column_family_data()->CalculateSSTWriteHint(c->output_level());
269
293
  bottommost_level_ = c->bottommost_level();
270
294
 
271
295
  Slice begin = compaction_input_.begin;
@@ -280,6 +304,9 @@ Status CompactionServiceCompactionJob::Run() {
280
304
 
281
305
  log_buffer_->FlushBufferToLog();
282
306
  LogCompaction();
307
+
308
+ compaction_result_->stats.Reset();
309
+
283
310
  const uint64_t start_micros = db_options_.clock->NowMicros();
284
311
  c->GetOrInitInputTableProperties();
285
312
 
@@ -320,20 +347,32 @@ Status CompactionServiceCompactionJob::Run() {
320
347
  if (status.ok()) {
321
348
  status = io_s;
322
349
  }
323
- if (status.ok()) {
324
- // TODO: Add verify_table()
325
- }
326
-
327
- // Finish up all book-keeping to unify the subcompaction results
328
- compact_->AggregateCompactionStats(compaction_stats_, *compaction_job_stats_);
329
- UpdateCompactionStats();
330
- RecordCompactionIOStats();
331
350
 
332
351
  LogFlush(db_options_.info_log);
333
352
  compact_->status = status;
334
353
  compact_->status.PermitUncheckedError();
335
354
 
336
- // Build compaction result
355
+ // Build Compaction Job Stats
356
+
357
+ // 1. Aggregate CompactionOutputStats into Internal Compaction Stats
358
+ // (compaction_stats_) and aggregate Compaction Job Stats
359
+ // (compaction_job_stats_) from the sub compactions
360
+ compact_->AggregateCompactionStats(compaction_stats_, *compaction_job_stats_);
361
+
362
+ // 2. Update the Output information in the Compaction Job Stats with
363
+ // aggregated Internal Compaction Stats.
364
+ UpdateCompactionJobStats(compaction_stats_.stats);
365
+
366
+ // 3. Set fields that are not propagated as part of aggregations above
367
+ compaction_result_->stats.is_manual_compaction = c->is_manual_compaction();
368
+ compaction_result_->stats.is_full_compaction = c->is_full_compaction();
369
+ compaction_result_->stats.is_remote_compaction = true;
370
+
371
+ // 4. Update IO Stats that are not part of the aggregations above (bytes_read,
372
+ // bytes_written)
373
+ RecordCompactionIOStats();
374
+
375
+ // Build Output
337
376
  compaction_result_->output_level = compact_->compaction->output_level();
338
377
  compaction_result_->output_path = output_path_;
339
378
  for (const auto& output_file : sub_compact->GetOutputs()) {
@@ -342,16 +381,13 @@ Status CompactionServiceCompactionJob::Run() {
342
381
  MakeTableFileName(meta.fd.GetNumber()), meta.fd.smallest_seqno,
343
382
  meta.fd.largest_seqno, meta.smallest.Encode().ToString(),
344
383
  meta.largest.Encode().ToString(), meta.oldest_ancester_time,
345
- meta.file_creation_time, meta.epoch_number,
346
- output_file.validator.GetHash(), meta.marked_for_compaction,
347
- meta.unique_id);
384
+ meta.file_creation_time, meta.epoch_number, meta.file_checksum,
385
+ meta.file_checksum_func_name, output_file.validator.GetHash(),
386
+ meta.marked_for_compaction, meta.unique_id);
348
387
  }
349
- InternalStats::CompactionStatsFull compaction_stats;
350
- sub_compact->AggregateCompactionStats(compaction_stats);
351
- compaction_result_->num_output_records =
352
- compaction_stats.stats.num_output_records;
353
- compaction_result_->total_bytes = compaction_stats.TotalBytesWritten();
354
388
 
389
+ TEST_SYNC_POINT_CALLBACK("CompactionServiceCompactionJob::Run:0",
390
+ &compaction_result_);
355
391
  return status;
356
392
  }
357
393
 
@@ -404,42 +440,9 @@ static std::unordered_map<std::string, OptionTypeInfo> cfd_type_info = {
404
440
  };
405
441
 
406
442
  static std::unordered_map<std::string, OptionTypeInfo> cs_input_type_info = {
407
- {"column_family",
408
- OptionTypeInfo::Struct(
409
- "column_family", &cfd_type_info,
410
- offsetof(struct CompactionServiceInput, column_family),
411
- OptionVerificationType::kNormal, OptionTypeFlags::kNone)},
412
- {"db_options",
413
- {offsetof(struct CompactionServiceInput, db_options),
414
- OptionType::kConfigurable, OptionVerificationType::kNormal,
415
- OptionTypeFlags::kNone,
416
- [](const ConfigOptions& opts, const std::string& /*name*/,
417
- const std::string& value, void* addr) {
418
- auto options = static_cast<DBOptions*>(addr);
419
- return GetDBOptionsFromString(opts, DBOptions(), value, options);
420
- },
421
- [](const ConfigOptions& opts, const std::string& /*name*/,
422
- const void* addr, std::string* value) {
423
- const auto options = static_cast<const DBOptions*>(addr);
424
- std::string result;
425
- auto status = GetStringFromDBOptions(opts, *options, &result);
426
- *value = "{" + result + "}";
427
- return status;
428
- },
429
- [](const ConfigOptions& opts, const std::string& name, const void* addr1,
430
- const void* addr2, std::string* mismatch) {
431
- const auto this_one = static_cast<const DBOptions*>(addr1);
432
- const auto that_one = static_cast<const DBOptions*>(addr2);
433
- auto this_conf = DBOptionsAsConfigurable(*this_one);
434
- auto that_conf = DBOptionsAsConfigurable(*that_one);
435
- std::string mismatch_opt;
436
- bool result =
437
- this_conf->AreEquivalent(opts, that_conf.get(), &mismatch_opt);
438
- if (!result) {
439
- *mismatch = name + "." + mismatch_opt;
440
- }
441
- return result;
442
- }}},
443
+ {"cf_name",
444
+ {offsetof(struct CompactionServiceInput, cf_name),
445
+ OptionType::kEncodedString}},
443
446
  {"snapshots", OptionTypeInfo::Vector<uint64_t>(
444
447
  offsetof(struct CompactionServiceInput, snapshots),
445
448
  OptionVerificationType::kNormal, OptionTypeFlags::kNone,
@@ -467,6 +470,10 @@ static std::unordered_map<std::string, OptionTypeInfo> cs_input_type_info = {
467
470
  {"end",
468
471
  {offsetof(struct CompactionServiceInput, end), OptionType::kEncodedString,
469
472
  OptionVerificationType::kNormal, OptionTypeFlags::kNone}},
473
+ {"options_file_number",
474
+ {offsetof(struct CompactionServiceInput, options_file_number),
475
+ OptionType::kUInt64T, OptionVerificationType::kNormal,
476
+ OptionTypeFlags::kNone}},
470
477
  };
471
478
 
472
479
  static std::unordered_map<std::string, OptionTypeInfo>
@@ -503,6 +510,14 @@ static std::unordered_map<std::string, OptionTypeInfo>
503
510
  {offsetof(struct CompactionServiceOutputFile, epoch_number),
504
511
  OptionType::kUInt64T, OptionVerificationType::kNormal,
505
512
  OptionTypeFlags::kNone}},
513
+ {"file_checksum",
514
+ {offsetof(struct CompactionServiceOutputFile, file_checksum),
515
+ OptionType::kEncodedString, OptionVerificationType::kNormal,
516
+ OptionTypeFlags::kNone}},
517
+ {"file_checksum_func_name",
518
+ {offsetof(struct CompactionServiceOutputFile, file_checksum_func_name),
519
+ OptionType::kEncodedString, OptionVerificationType::kNormal,
520
+ OptionTypeFlags::kNone}},
506
521
  {"paranoid_hash",
507
522
  {offsetof(struct CompactionServiceOutputFile, paranoid_hash),
508
523
  OptionType::kUInt64T, OptionVerificationType::kNormal,
@@ -563,6 +578,10 @@ static std::unordered_map<std::string, OptionTypeInfo>
563
578
  {offsetof(struct CompactionJobStats, is_manual_compaction),
564
579
  OptionType::kBoolean, OptionVerificationType::kNormal,
565
580
  OptionTypeFlags::kNone}},
581
+ {"is_remote_compaction",
582
+ {offsetof(struct CompactionJobStats, is_remote_compaction),
583
+ OptionType::kBoolean, OptionVerificationType::kNormal,
584
+ OptionTypeFlags::kNone}},
566
585
  {"total_input_bytes",
567
586
  {offsetof(struct CompactionJobStats, total_input_bytes),
568
587
  OptionType::kUInt64T, OptionVerificationType::kNormal,
@@ -731,14 +750,6 @@ static std::unordered_map<std::string, OptionTypeInfo> cs_result_type_info = {
731
750
  {offsetof(struct CompactionServiceResult, output_path),
732
751
  OptionType::kEncodedString, OptionVerificationType::kNormal,
733
752
  OptionTypeFlags::kNone}},
734
- {"num_output_records",
735
- {offsetof(struct CompactionServiceResult, num_output_records),
736
- OptionType::kUInt64T, OptionVerificationType::kNormal,
737
- OptionTypeFlags::kNone}},
738
- {"total_bytes",
739
- {offsetof(struct CompactionServiceResult, total_bytes),
740
- OptionType::kUInt64T, OptionVerificationType::kNormal,
741
- OptionTypeFlags::kNone}},
742
753
  {"bytes_read",
743
754
  {offsetof(struct CompactionServiceResult, bytes_read),
744
755
  OptionType::kUInt64T, OptionVerificationType::kNormal,