@nxtedition/rocksdb 7.1.4 → 7.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.
- package/deps/rocksdb/iostats.patch +19 -0
- package/deps/rocksdb/rocksdb/CMakeLists.txt +15 -1
- package/deps/rocksdb/rocksdb/cache/cache_test.cc +93 -58
- package/deps/rocksdb/rocksdb/cache/clock_cache.cc +88 -40
- package/deps/rocksdb/rocksdb/cache/clock_cache.h +57 -32
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +103 -28
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +33 -1
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +177 -38
- package/deps/rocksdb/rocksdb/cache/fast_lru_cache.cc +3 -1
- package/deps/rocksdb/rocksdb/cache/lru_cache.cc +2 -2
- package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +125 -71
- package/deps/rocksdb/rocksdb/crash_test.mk +15 -1
- package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +2 -2
- package/deps/rocksdb/rocksdb/db/blob/blob_index.h +1 -1
- package/deps/rocksdb/rocksdb/db/blob/blob_log_format.cc +3 -5
- package/deps/rocksdb/rocksdb/db/blob/blob_log_writer.cc +25 -19
- package/deps/rocksdb/rocksdb/db/blob/db_blob_basic_test.cc +149 -0
- package/deps/rocksdb/rocksdb/db/blob/db_blob_compaction_test.cc +36 -0
- package/deps/rocksdb/rocksdb/db/column_family.cc +2 -15
- package/deps/rocksdb/rocksdb/db/column_family_test.cc +17 -4
- package/deps/rocksdb/rocksdb/db/compact_files_test.cc +8 -8
- package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +0 -7
- package/deps/rocksdb/rocksdb/db/compaction/compaction.h +5 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +50 -52
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +33 -11
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +41 -10
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +1 -2
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +143 -2
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +43 -18
- package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +48 -65
- package/deps/rocksdb/rocksdb/db/corruption_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/db_basic_test.cc +73 -4
- package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +17 -8
- package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +71 -2
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +144 -33
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +18 -35
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +11 -5
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_experimental.cc +7 -7
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +15 -8
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +2 -1
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +3 -1
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +11 -0
- package/deps/rocksdb/rocksdb/db/db_iter.cc +69 -11
- package/deps/rocksdb/rocksdb/db/db_iter.h +16 -0
- package/deps/rocksdb/rocksdb/db/db_memtable_test.cc +2 -1
- package/deps/rocksdb/rocksdb/db/db_merge_operand_test.cc +42 -0
- package/deps/rocksdb/rocksdb/db/db_test.cc +61 -28
- package/deps/rocksdb/rocksdb/db/db_test2.cc +18 -7
- package/deps/rocksdb/rocksdb/db/db_wal_test.cc +17 -0
- package/deps/rocksdb/rocksdb/db/db_with_timestamp_compaction_test.cc +61 -0
- package/deps/rocksdb/rocksdb/db/db_write_test.cc +130 -0
- package/deps/rocksdb/rocksdb/db/experimental.cc +7 -8
- package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +1 -2
- package/deps/rocksdb/rocksdb/db/flush_job.cc +11 -7
- package/deps/rocksdb/rocksdb/db/flush_job_test.cc +7 -1
- package/deps/rocksdb/rocksdb/db/forward_iterator.cc +4 -2
- package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +1 -1
- package/deps/rocksdb/rocksdb/db/log_reader.cc +48 -11
- package/deps/rocksdb/rocksdb/db/log_reader.h +8 -2
- package/deps/rocksdb/rocksdb/db/log_test.cc +10 -1
- package/deps/rocksdb/rocksdb/db/log_writer.cc +7 -1
- package/deps/rocksdb/rocksdb/db/manual_compaction_test.cc +4 -4
- package/deps/rocksdb/rocksdb/db/memtable.cc +49 -14
- package/deps/rocksdb/rocksdb/db/memtable.h +60 -14
- package/deps/rocksdb/rocksdb/db/memtable_list.cc +14 -8
- package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +30 -10
- package/deps/rocksdb/rocksdb/db/perf_context_test.cc +5 -5
- package/deps/rocksdb/rocksdb/db/pinned_iterators_manager.h +5 -0
- package/deps/rocksdb/rocksdb/db/repair.cc +2 -3
- package/deps/rocksdb/rocksdb/db/seqno_time_test.cc +3 -7
- package/deps/rocksdb/rocksdb/db/table_cache.cc +72 -0
- package/deps/rocksdb/rocksdb/db/table_cache.h +19 -1
- package/deps/rocksdb/rocksdb/db/table_cache_sync_and_async.h +8 -14
- package/deps/rocksdb/rocksdb/db/table_properties_collector_test.cc +2 -2
- package/deps/rocksdb/rocksdb/db/version_builder_test.cc +35 -64
- package/deps/rocksdb/rocksdb/db/version_edit.cc +3 -32
- package/deps/rocksdb/rocksdb/db/version_edit.h +2 -12
- package/deps/rocksdb/rocksdb/db/version_edit_test.cc +10 -23
- package/deps/rocksdb/rocksdb/db/version_set.cc +34 -10
- package/deps/rocksdb/rocksdb/db/version_set.h +3 -3
- package/deps/rocksdb/rocksdb/db/version_set_sync_and_async.h +5 -6
- package/deps/rocksdb/rocksdb/db/version_set_test.cc +17 -15
- package/deps/rocksdb/rocksdb/db/wal_manager.cc +0 -4
- package/deps/rocksdb/rocksdb/db/wal_manager_test.cc +2 -1
- package/deps/rocksdb/rocksdb/db/wide/db_wide_basic_test.cc +137 -42
- package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.cc +21 -0
- package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.h +1 -0
- package/deps/rocksdb/rocksdb/db/write_batch_test.cc +2 -1
- package/deps/rocksdb/rocksdb/db/write_callback_test.cc +4 -4
- package/deps/rocksdb/rocksdb/db/write_thread.cc +51 -46
- package/deps/rocksdb/rocksdb/db/write_thread.h +0 -4
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +4 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +6 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +6 -0
- package/deps/rocksdb/rocksdb/env/env_posix.cc +1 -1
- package/deps/rocksdb/rocksdb/env/env_test.cc +38 -8
- package/deps/rocksdb/rocksdb/env/file_system.cc +20 -0
- package/deps/rocksdb/rocksdb/env/fs_posix.cc +2 -46
- package/deps/rocksdb/rocksdb/env/io_posix.cc +1 -0
- package/deps/rocksdb/rocksdb/file/writable_file_writer.cc +110 -5
- package/deps/rocksdb/rocksdb/file/writable_file_writer.h +7 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +14 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/db.h +4 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +1 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/iostats_context.h +7 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/options.h +10 -3
- package/deps/rocksdb/rocksdb/include/rocksdb/slice.h +3 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/status.h +1 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/wide_columns.h +2 -0
- package/deps/rocksdb/rocksdb/logging/auto_roll_logger.cc +12 -0
- package/deps/rocksdb/rocksdb/logging/auto_roll_logger_test.cc +9 -13
- package/deps/rocksdb/rocksdb/logging/env_logger.h +39 -13
- package/deps/rocksdb/rocksdb/memtable/inlineskiplist.h +1 -1
- package/deps/rocksdb/rocksdb/memtable/write_buffer_manager_test.cc +1 -1
- package/deps/rocksdb/rocksdb/microbench/db_basic_bench.cc +6 -0
- package/deps/rocksdb/rocksdb/monitoring/iostats_context_imp.h +4 -1
- package/deps/rocksdb/rocksdb/options/cf_options.cc +6 -3
- package/deps/rocksdb/rocksdb/options/cf_options.h +6 -5
- package/deps/rocksdb/rocksdb/options/options_helper.cc +2 -1
- package/deps/rocksdb/rocksdb/options/options_settable_test.cc +1 -0
- package/deps/rocksdb/rocksdb/options/options_test.cc +4 -2
- package/deps/rocksdb/rocksdb/port/util_logger.h +1 -3
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +50 -8
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +4 -0
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +7 -0
- package/deps/rocksdb/rocksdb/table/block_based/block_like_traits.h +28 -10
- package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index_test.cc +1 -1
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +5 -2
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.h +1 -0
- package/deps/rocksdb/rocksdb/table/get_context.cc +16 -6
- package/deps/rocksdb/rocksdb/table/table_reader.h +9 -0
- package/deps/rocksdb/rocksdb/table/table_test.cc +2 -1
- package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +14 -1
- package/deps/rocksdb/rocksdb/tools/db_sanity_test.cc +5 -2
- package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +7 -8
- package/deps/rocksdb/rocksdb/tools/ldb_cmd_test.cc +6 -6
- package/deps/rocksdb/rocksdb/tools/reduce_levels_test.cc +1 -1
- package/deps/rocksdb/rocksdb/util/file_reader_writer_test.cc +2 -0
- package/deps/rocksdb/rocksdb/util/stderr_logger.h +13 -0
- package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +55 -46
- package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_functional_test.cc +2 -1
- package/deps/rocksdb/rocksdb/utilities/counted_fs.cc +10 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_locking_test.cc +2 -2
- package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_test.cc +2 -2
- package/deps/rocksdb/rocksdb/utilities/ttl/ttl_test.cc +2 -2
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +2 -2
- package/index.js +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/logging/posix_logger.h +0 -179
|
@@ -207,6 +207,9 @@ TEST_F(LRUCacheTest, EntriesWithPriority) {
|
|
|
207
207
|
ValidateLRUList({"e", "f", "g", "Z", "d"}, 2);
|
|
208
208
|
}
|
|
209
209
|
|
|
210
|
+
// TODO: FastLRUCache and ClockCache use the same tests. We can probably remove
|
|
211
|
+
// them from FastLRUCache after ClockCache becomes productive, and we don't plan
|
|
212
|
+
// to use or maintain FastLRUCache any more.
|
|
210
213
|
namespace fast_lru_cache {
|
|
211
214
|
|
|
212
215
|
// TODO(guido) Replicate LRU policy tests from LRUCache here.
|
|
@@ -225,11 +228,11 @@ class FastLRUCacheTest : public testing::Test {
|
|
|
225
228
|
|
|
226
229
|
void NewCache(size_t capacity) {
|
|
227
230
|
DeleteCache();
|
|
228
|
-
cache_ = reinterpret_cast<
|
|
229
|
-
port::cacheline_aligned_alloc(sizeof(
|
|
230
|
-
new (cache_)
|
|
231
|
-
|
|
232
|
-
|
|
231
|
+
cache_ = reinterpret_cast<LRUCacheShard*>(
|
|
232
|
+
port::cacheline_aligned_alloc(sizeof(LRUCacheShard)));
|
|
233
|
+
new (cache_) LRUCacheShard(capacity, 1 /*estimated_value_size*/,
|
|
234
|
+
false /*strict_capacity_limit*/,
|
|
235
|
+
kDontChargeCacheMetadata);
|
|
233
236
|
}
|
|
234
237
|
|
|
235
238
|
Status Insert(const std::string& key) {
|
|
@@ -243,25 +246,23 @@ class FastLRUCacheTest : public testing::Test {
|
|
|
243
246
|
size_t CalcEstimatedHandleChargeWrapper(
|
|
244
247
|
size_t estimated_value_size,
|
|
245
248
|
CacheMetadataChargePolicy metadata_charge_policy) {
|
|
246
|
-
return
|
|
247
|
-
|
|
249
|
+
return LRUCacheShard::CalcEstimatedHandleCharge(estimated_value_size,
|
|
250
|
+
metadata_charge_policy);
|
|
248
251
|
}
|
|
249
252
|
|
|
250
253
|
int CalcHashBitsWrapper(size_t capacity, size_t estimated_value_size,
|
|
251
254
|
CacheMetadataChargePolicy metadata_charge_policy) {
|
|
252
|
-
return
|
|
253
|
-
|
|
255
|
+
return LRUCacheShard::CalcHashBits(capacity, estimated_value_size,
|
|
256
|
+
metadata_charge_policy);
|
|
254
257
|
}
|
|
255
258
|
|
|
256
259
|
// Maximum number of items that a shard can hold.
|
|
257
260
|
double CalcMaxOccupancy(size_t capacity, size_t estimated_value_size,
|
|
258
261
|
CacheMetadataChargePolicy metadata_charge_policy) {
|
|
259
|
-
size_t handle_charge =
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
return capacity / (fast_lru_cache::kLoadFactor * handle_charge);
|
|
262
|
+
size_t handle_charge = LRUCacheShard::CalcEstimatedHandleCharge(
|
|
263
|
+
estimated_value_size, metadata_charge_policy);
|
|
264
|
+
return capacity / (kLoadFactor * handle_charge);
|
|
263
265
|
}
|
|
264
|
-
|
|
265
266
|
bool TableSizeIsAppropriate(int hash_bits, double max_occupancy) {
|
|
266
267
|
if (hash_bits == 0) {
|
|
267
268
|
return max_occupancy <= 1;
|
|
@@ -272,7 +273,7 @@ class FastLRUCacheTest : public testing::Test {
|
|
|
272
273
|
}
|
|
273
274
|
|
|
274
275
|
private:
|
|
275
|
-
|
|
276
|
+
LRUCacheShard* cache_ = nullptr;
|
|
276
277
|
};
|
|
277
278
|
|
|
278
279
|
TEST_F(FastLRUCacheTest, ValidateKeySize) {
|
|
@@ -292,7 +293,6 @@ TEST_F(FastLRUCacheTest, CalcHashBitsTest) {
|
|
|
292
293
|
double max_occupancy;
|
|
293
294
|
int hash_bits;
|
|
294
295
|
CacheMetadataChargePolicy metadata_charge_policy;
|
|
295
|
-
|
|
296
296
|
// Vary the cache capacity, fix the element charge.
|
|
297
297
|
for (int i = 0; i < 2048; i++) {
|
|
298
298
|
capacity = i;
|
|
@@ -304,7 +304,6 @@ TEST_F(FastLRUCacheTest, CalcHashBitsTest) {
|
|
|
304
304
|
metadata_charge_policy);
|
|
305
305
|
EXPECT_TRUE(TableSizeIsAppropriate(hash_bits, max_occupancy));
|
|
306
306
|
}
|
|
307
|
-
|
|
308
307
|
// Fix the cache capacity, vary the element charge.
|
|
309
308
|
for (int i = 0; i < 1024; i++) {
|
|
310
309
|
capacity = 1024;
|
|
@@ -316,7 +315,6 @@ TEST_F(FastLRUCacheTest, CalcHashBitsTest) {
|
|
|
316
315
|
metadata_charge_policy);
|
|
317
316
|
EXPECT_TRUE(TableSizeIsAppropriate(hash_bits, max_occupancy));
|
|
318
317
|
}
|
|
319
|
-
|
|
320
318
|
// Zero-capacity cache, and only values have charge.
|
|
321
319
|
capacity = 0;
|
|
322
320
|
estimated_value_size = 1;
|
|
@@ -324,7 +322,6 @@ TEST_F(FastLRUCacheTest, CalcHashBitsTest) {
|
|
|
324
322
|
hash_bits = CalcHashBitsWrapper(capacity, estimated_value_size,
|
|
325
323
|
metadata_charge_policy);
|
|
326
324
|
EXPECT_TRUE(TableSizeIsAppropriate(hash_bits, 0 /* max_occupancy */));
|
|
327
|
-
|
|
328
325
|
// Zero-capacity cache, and only metadata has charge.
|
|
329
326
|
capacity = 0;
|
|
330
327
|
estimated_value_size = 0;
|
|
@@ -332,7 +329,6 @@ TEST_F(FastLRUCacheTest, CalcHashBitsTest) {
|
|
|
332
329
|
hash_bits = CalcHashBitsWrapper(capacity, estimated_value_size,
|
|
333
330
|
metadata_charge_policy);
|
|
334
331
|
EXPECT_TRUE(TableSizeIsAppropriate(hash_bits, 0 /* max_occupancy */));
|
|
335
|
-
|
|
336
332
|
// Small cache, large elements.
|
|
337
333
|
capacity = 1024;
|
|
338
334
|
estimated_value_size = 8192;
|
|
@@ -340,7 +336,6 @@ TEST_F(FastLRUCacheTest, CalcHashBitsTest) {
|
|
|
340
336
|
hash_bits = CalcHashBitsWrapper(capacity, estimated_value_size,
|
|
341
337
|
metadata_charge_policy);
|
|
342
338
|
EXPECT_TRUE(TableSizeIsAppropriate(hash_bits, 0 /* max_occupancy */));
|
|
343
|
-
|
|
344
339
|
// Large capacity.
|
|
345
340
|
capacity = 31924172;
|
|
346
341
|
estimated_value_size = 8192;
|
|
@@ -402,37 +397,38 @@ class ClockCacheTest : public testing::Test {
|
|
|
402
397
|
|
|
403
398
|
void Erase(const std::string& key) { shard_->Erase(key, 0 /*hash*/); }
|
|
404
399
|
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
//
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
400
|
+
size_t CalcEstimatedHandleChargeWrapper(
|
|
401
|
+
size_t estimated_value_size,
|
|
402
|
+
CacheMetadataChargePolicy metadata_charge_policy) {
|
|
403
|
+
return ClockCacheShard::CalcEstimatedHandleCharge(estimated_value_size,
|
|
404
|
+
metadata_charge_policy);
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
int CalcHashBitsWrapper(size_t capacity, size_t estimated_value_size,
|
|
408
|
+
CacheMetadataChargePolicy metadata_charge_policy) {
|
|
409
|
+
return ClockCacheShard::CalcHashBits(capacity, estimated_value_size,
|
|
410
|
+
metadata_charge_policy);
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
// Maximum number of items that a shard can hold.
|
|
414
|
+
double CalcMaxOccupancy(size_t capacity, size_t estimated_value_size,
|
|
415
|
+
CacheMetadataChargePolicy metadata_charge_policy) {
|
|
416
|
+
size_t handle_charge = ClockCacheShard::CalcEstimatedHandleCharge(
|
|
417
|
+
estimated_value_size, metadata_charge_policy);
|
|
418
|
+
return capacity / (kLoadFactor * handle_charge);
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
bool TableSizeIsAppropriate(int hash_bits, double max_occupancy) {
|
|
422
|
+
if (hash_bits == 0) {
|
|
423
|
+
return max_occupancy <= 1;
|
|
424
|
+
} else {
|
|
425
|
+
return (1 << hash_bits >= max_occupancy) &&
|
|
426
|
+
(1 << (hash_bits - 1) <= max_occupancy);
|
|
427
|
+
}
|
|
428
|
+
}
|
|
433
429
|
|
|
434
430
|
private:
|
|
435
|
-
|
|
431
|
+
ClockCacheShard* shard_ = nullptr;
|
|
436
432
|
};
|
|
437
433
|
|
|
438
434
|
TEST_F(ClockCacheTest, Validate) {
|
|
@@ -447,31 +443,89 @@ TEST_F(ClockCacheTest, Validate) {
|
|
|
447
443
|
}
|
|
448
444
|
|
|
449
445
|
TEST_F(ClockCacheTest, ClockPriorityTest) {
|
|
450
|
-
|
|
451
|
-
EXPECT_EQ(handle.GetClockPriority(),
|
|
452
|
-
|
|
453
|
-
handle.
|
|
454
|
-
EXPECT_EQ(handle.GetClockPriority(),
|
|
455
|
-
clock_cache::ClockHandle::ClockPriority::HIGH);
|
|
446
|
+
ClockHandle handle;
|
|
447
|
+
EXPECT_EQ(handle.GetClockPriority(), ClockHandle::ClockPriority::NONE);
|
|
448
|
+
handle.SetClockPriority(ClockHandle::ClockPriority::HIGH);
|
|
449
|
+
EXPECT_EQ(handle.GetClockPriority(), ClockHandle::ClockPriority::HIGH);
|
|
456
450
|
handle.DecreaseClockPriority();
|
|
457
|
-
EXPECT_EQ(handle.GetClockPriority(),
|
|
458
|
-
clock_cache::ClockHandle::ClockPriority::MEDIUM);
|
|
451
|
+
EXPECT_EQ(handle.GetClockPriority(), ClockHandle::ClockPriority::MEDIUM);
|
|
459
452
|
handle.DecreaseClockPriority();
|
|
460
|
-
EXPECT_EQ(handle.GetClockPriority(),
|
|
461
|
-
|
|
462
|
-
handle.
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
handle.SetClockPriority(
|
|
466
|
-
EXPECT_EQ(handle.GetClockPriority(),
|
|
467
|
-
clock_cache::ClockHandle::ClockPriority::NONE);
|
|
468
|
-
handle.SetClockPriority(clock_cache::ClockHandle::ClockPriority::MEDIUM);
|
|
469
|
-
EXPECT_EQ(handle.GetClockPriority(),
|
|
470
|
-
clock_cache::ClockHandle::ClockPriority::MEDIUM);
|
|
453
|
+
EXPECT_EQ(handle.GetClockPriority(), ClockHandle::ClockPriority::LOW);
|
|
454
|
+
handle.SetClockPriority(ClockHandle::ClockPriority::MEDIUM);
|
|
455
|
+
EXPECT_EQ(handle.GetClockPriority(), ClockHandle::ClockPriority::MEDIUM);
|
|
456
|
+
handle.SetClockPriority(ClockHandle::ClockPriority::NONE);
|
|
457
|
+
EXPECT_EQ(handle.GetClockPriority(), ClockHandle::ClockPriority::NONE);
|
|
458
|
+
handle.SetClockPriority(ClockHandle::ClockPriority::MEDIUM);
|
|
459
|
+
EXPECT_EQ(handle.GetClockPriority(), ClockHandle::ClockPriority::MEDIUM);
|
|
471
460
|
handle.DecreaseClockPriority();
|
|
472
461
|
handle.DecreaseClockPriority();
|
|
473
|
-
EXPECT_EQ(handle.GetClockPriority(),
|
|
474
|
-
|
|
462
|
+
EXPECT_EQ(handle.GetClockPriority(), ClockHandle::ClockPriority::NONE);
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
TEST_F(ClockCacheTest, CalcHashBitsTest) {
|
|
466
|
+
size_t capacity;
|
|
467
|
+
size_t estimated_value_size;
|
|
468
|
+
double max_occupancy;
|
|
469
|
+
int hash_bits;
|
|
470
|
+
CacheMetadataChargePolicy metadata_charge_policy;
|
|
471
|
+
|
|
472
|
+
// Vary the cache capacity, fix the element charge.
|
|
473
|
+
for (int i = 0; i < 2048; i++) {
|
|
474
|
+
capacity = i;
|
|
475
|
+
estimated_value_size = 0;
|
|
476
|
+
metadata_charge_policy = kFullChargeCacheMetadata;
|
|
477
|
+
max_occupancy = CalcMaxOccupancy(capacity, estimated_value_size,
|
|
478
|
+
metadata_charge_policy);
|
|
479
|
+
hash_bits = CalcHashBitsWrapper(capacity, estimated_value_size,
|
|
480
|
+
metadata_charge_policy);
|
|
481
|
+
EXPECT_TRUE(TableSizeIsAppropriate(hash_bits, max_occupancy));
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
// Fix the cache capacity, vary the element charge.
|
|
485
|
+
for (int i = 0; i < 1024; i++) {
|
|
486
|
+
capacity = 1024;
|
|
487
|
+
estimated_value_size = i;
|
|
488
|
+
metadata_charge_policy = kFullChargeCacheMetadata;
|
|
489
|
+
max_occupancy = CalcMaxOccupancy(capacity, estimated_value_size,
|
|
490
|
+
metadata_charge_policy);
|
|
491
|
+
hash_bits = CalcHashBitsWrapper(capacity, estimated_value_size,
|
|
492
|
+
metadata_charge_policy);
|
|
493
|
+
EXPECT_TRUE(TableSizeIsAppropriate(hash_bits, max_occupancy));
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
// Zero-capacity cache, and only values have charge.
|
|
497
|
+
capacity = 0;
|
|
498
|
+
estimated_value_size = 1;
|
|
499
|
+
metadata_charge_policy = kDontChargeCacheMetadata;
|
|
500
|
+
hash_bits = CalcHashBitsWrapper(capacity, estimated_value_size,
|
|
501
|
+
metadata_charge_policy);
|
|
502
|
+
EXPECT_TRUE(TableSizeIsAppropriate(hash_bits, 0 /* max_occupancy */));
|
|
503
|
+
|
|
504
|
+
// Zero-capacity cache, and only metadata has charge.
|
|
505
|
+
capacity = 0;
|
|
506
|
+
estimated_value_size = 0;
|
|
507
|
+
metadata_charge_policy = kFullChargeCacheMetadata;
|
|
508
|
+
hash_bits = CalcHashBitsWrapper(capacity, estimated_value_size,
|
|
509
|
+
metadata_charge_policy);
|
|
510
|
+
EXPECT_TRUE(TableSizeIsAppropriate(hash_bits, 0 /* max_occupancy */));
|
|
511
|
+
|
|
512
|
+
// Small cache, large elements.
|
|
513
|
+
capacity = 1024;
|
|
514
|
+
estimated_value_size = 8192;
|
|
515
|
+
metadata_charge_policy = kFullChargeCacheMetadata;
|
|
516
|
+
hash_bits = CalcHashBitsWrapper(capacity, estimated_value_size,
|
|
517
|
+
metadata_charge_policy);
|
|
518
|
+
EXPECT_TRUE(TableSizeIsAppropriate(hash_bits, 0 /* max_occupancy */));
|
|
519
|
+
|
|
520
|
+
// Large capacity.
|
|
521
|
+
capacity = 31924172;
|
|
522
|
+
estimated_value_size = 8192;
|
|
523
|
+
metadata_charge_policy = kFullChargeCacheMetadata;
|
|
524
|
+
max_occupancy =
|
|
525
|
+
CalcMaxOccupancy(capacity, estimated_value_size, metadata_charge_policy);
|
|
526
|
+
hash_bits = CalcHashBitsWrapper(capacity, estimated_value_size,
|
|
527
|
+
metadata_charge_policy);
|
|
528
|
+
EXPECT_TRUE(TableSizeIsAppropriate(hash_bits, max_occupancy));
|
|
475
529
|
}
|
|
476
530
|
|
|
477
531
|
} // namespace clock_cache
|
|
@@ -18,7 +18,9 @@ CRASHTEST_PY=$(PYTHON) -u tools/db_crashtest.py --stress_cmd=$(DB_STRESS_CMD)
|
|
|
18
18
|
whitebox_crash_test whitebox_crash_test_with_atomic_flush \
|
|
19
19
|
whitebox_crash_test_with_txn whitebox_crash_test_with_ts \
|
|
20
20
|
blackbox_crash_test_with_multiops_wc_txn \
|
|
21
|
-
blackbox_crash_test_with_multiops_wp_txn
|
|
21
|
+
blackbox_crash_test_with_multiops_wp_txn \
|
|
22
|
+
crash_test_with_tiered_storage blackbox_crash_test_with_tiered_storage \
|
|
23
|
+
whitebox_crash_test_with_tiered_storage \
|
|
22
24
|
|
|
23
25
|
crash_test: $(DB_STRESS_CMD)
|
|
24
26
|
# Do not parallelize
|
|
@@ -42,6 +44,11 @@ crash_test_with_ts: $(DB_STRESS_CMD)
|
|
|
42
44
|
$(CRASHTEST_MAKE) whitebox_crash_test_with_ts
|
|
43
45
|
$(CRASHTEST_MAKE) blackbox_crash_test_with_ts
|
|
44
46
|
|
|
47
|
+
crash_test_with_tiered_storage: $(DB_STRESS_CMD)
|
|
48
|
+
# Do not parallelize
|
|
49
|
+
$(CRASHTEST_MAKE) whitebox_crash_test_with_tiered_storage
|
|
50
|
+
$(CRASHTEST_MAKE) blackbox_crash_test_with_tiered_storage
|
|
51
|
+
|
|
45
52
|
crash_test_with_multiops_wc_txn: $(DB_STRESS_CMD)
|
|
46
53
|
$(CRASHTEST_MAKE) blackbox_crash_test_with_multiops_wc_txn
|
|
47
54
|
|
|
@@ -70,6 +77,9 @@ blackbox_crash_test_with_multiops_wc_txn: $(DB_STRESS_CMD)
|
|
|
70
77
|
blackbox_crash_test_with_multiops_wp_txn: $(DB_STRESS_CMD)
|
|
71
78
|
$(CRASHTEST_PY) --test_multiops_txn --write_policy write_prepared blackbox $(CRASH_TEST_EXT_ARGS)
|
|
72
79
|
|
|
80
|
+
blackbox_crash_test_with_tiered_storage: $(DB_STRESS_CMD)
|
|
81
|
+
$(CRASHTEST_PY) --enable_tiered_storage blackbox $(CRASH_TEST_EXT_ARGS)
|
|
82
|
+
|
|
73
83
|
ifeq ($(CRASH_TEST_KILL_ODD),)
|
|
74
84
|
CRASH_TEST_KILL_ODD=888887
|
|
75
85
|
endif
|
|
@@ -91,3 +101,7 @@ whitebox_crash_test_with_txn: $(DB_STRESS_CMD)
|
|
|
91
101
|
whitebox_crash_test_with_ts: $(DB_STRESS_CMD)
|
|
92
102
|
$(CRASHTEST_PY) --enable_ts whitebox --random_kill_odd \
|
|
93
103
|
$(CRASH_TEST_KILL_ODD) $(CRASH_TEST_EXT_ARGS)
|
|
104
|
+
|
|
105
|
+
whitebox_crash_test_with_tiered_storage: $(DB_STRESS_CMD)
|
|
106
|
+
$(CRASHTEST_PY) --enable_tiered_storage whitebox --random_kill_odd \
|
|
107
|
+
$(CRASH_TEST_KILL_ODD) $(CRASH_TEST_EXT_ARGS)
|
|
@@ -89,8 +89,8 @@ Status ArenaWrappedDBIter::Refresh() {
|
|
|
89
89
|
ReadRangeDelAggregator* range_del_agg =
|
|
90
90
|
db_iter_->GetRangeDelAggregator();
|
|
91
91
|
std::unique_ptr<FragmentedRangeTombstoneIterator> range_del_iter;
|
|
92
|
-
range_del_iter.reset(
|
|
93
|
-
|
|
92
|
+
range_del_iter.reset(sv->mem->NewRangeTombstoneIterator(
|
|
93
|
+
read_options_, latest_seq, false /* immutable_memtable */));
|
|
94
94
|
range_del_agg->AddTombstones(std::move(range_del_iter));
|
|
95
95
|
cfd_->ReturnThreadLocalSuperVersion(sv);
|
|
96
96
|
}
|
|
@@ -92,7 +92,7 @@ class BlobIndex {
|
|
|
92
92
|
}
|
|
93
93
|
|
|
94
94
|
Status DecodeFrom(Slice slice) {
|
|
95
|
-
|
|
95
|
+
const char* kErrorMessage = "Error while decoding blob index";
|
|
96
96
|
assert(slice.size() > 0);
|
|
97
97
|
type_ = static_cast<Type>(*slice.data());
|
|
98
98
|
if (type_ >= Type::kUnknown) {
|
|
@@ -26,8 +26,7 @@ void BlobLogHeader::EncodeTo(std::string* dst) {
|
|
|
26
26
|
}
|
|
27
27
|
|
|
28
28
|
Status BlobLogHeader::DecodeFrom(Slice src) {
|
|
29
|
-
|
|
30
|
-
"Error while decoding blob log header";
|
|
29
|
+
const char* kErrorMessage = "Error while decoding blob log header";
|
|
31
30
|
if (src.size() != BlobLogHeader::kSize) {
|
|
32
31
|
return Status::Corruption(kErrorMessage,
|
|
33
32
|
"Unexpected blob file header size");
|
|
@@ -71,8 +70,7 @@ void BlobLogFooter::EncodeTo(std::string* dst) {
|
|
|
71
70
|
}
|
|
72
71
|
|
|
73
72
|
Status BlobLogFooter::DecodeFrom(Slice src) {
|
|
74
|
-
|
|
75
|
-
"Error while decoding blob log footer";
|
|
73
|
+
const char* kErrorMessage = "Error while decoding blob log footer";
|
|
76
74
|
if (src.size() != BlobLogFooter::kSize) {
|
|
77
75
|
return Status::Corruption(kErrorMessage,
|
|
78
76
|
"Unexpected blob file footer size");
|
|
@@ -112,7 +110,7 @@ void BlobLogRecord::EncodeHeaderTo(std::string* dst) {
|
|
|
112
110
|
}
|
|
113
111
|
|
|
114
112
|
Status BlobLogRecord::DecodeHeaderFrom(Slice src) {
|
|
115
|
-
|
|
113
|
+
const char* kErrorMessage = "Error while decoding blob record";
|
|
116
114
|
if (src.size() != BlobLogRecord::kHeaderSize) {
|
|
117
115
|
return Status::Corruption(kErrorMessage,
|
|
118
116
|
"Unexpected blob record header size");
|
|
@@ -70,32 +70,38 @@ Status BlobLogWriter::AppendFooter(BlobLogFooter& footer,
|
|
|
70
70
|
std::string str;
|
|
71
71
|
footer.EncodeTo(&str);
|
|
72
72
|
|
|
73
|
-
Status s
|
|
74
|
-
if (
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
73
|
+
Status s;
|
|
74
|
+
if (dest_->seen_error()) {
|
|
75
|
+
s.PermitUncheckedError();
|
|
76
|
+
return Status::IOError("Seen Error. Skip closing.");
|
|
77
|
+
} else {
|
|
78
|
+
s = dest_->Append(Slice(str));
|
|
79
79
|
if (s.ok()) {
|
|
80
|
-
|
|
80
|
+
block_offset_ += str.size();
|
|
81
|
+
|
|
82
|
+
s = Sync();
|
|
81
83
|
|
|
82
84
|
if (s.ok()) {
|
|
83
|
-
|
|
85
|
+
s = dest_->Close();
|
|
84
86
|
|
|
85
|
-
if (
|
|
86
|
-
assert(checksum_method
|
|
87
|
+
if (s.ok()) {
|
|
88
|
+
assert(!!checksum_method == !!checksum_value);
|
|
87
89
|
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
90
|
+
if (checksum_method) {
|
|
91
|
+
assert(checksum_method->empty());
|
|
92
|
+
|
|
93
|
+
std::string method = dest_->GetFileChecksumFuncName();
|
|
94
|
+
if (method != kUnknownFileChecksumFuncName) {
|
|
95
|
+
*checksum_method = std::move(method);
|
|
96
|
+
}
|
|
91
97
|
}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
assert(checksum_value->empty());
|
|
98
|
+
if (checksum_value) {
|
|
99
|
+
assert(checksum_value->empty());
|
|
95
100
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
101
|
+
std::string value = dest_->GetFileChecksum();
|
|
102
|
+
if (value != kUnknownFileChecksum) {
|
|
103
|
+
*checksum_value = std::move(value);
|
|
104
|
+
}
|
|
99
105
|
}
|
|
100
106
|
}
|
|
101
107
|
}
|
|
@@ -135,6 +135,8 @@ TEST_F(DBBlobBasicTest, IterateBlobsFromCache) {
|
|
|
135
135
|
block_based_options.cache_index_and_filter_blocks = true;
|
|
136
136
|
options.table_factory.reset(NewBlockBasedTableFactory(block_based_options));
|
|
137
137
|
|
|
138
|
+
options.statistics = CreateDBStatistics();
|
|
139
|
+
|
|
138
140
|
Reopen(options);
|
|
139
141
|
|
|
140
142
|
int num_blobs = 5;
|
|
@@ -165,6 +167,7 @@ TEST_F(DBBlobBasicTest, IterateBlobsFromCache) {
|
|
|
165
167
|
++i;
|
|
166
168
|
}
|
|
167
169
|
ASSERT_EQ(i, num_blobs);
|
|
170
|
+
ASSERT_EQ(options.statistics->getAndResetTickerCount(BLOB_DB_CACHE_ADD), 0);
|
|
168
171
|
}
|
|
169
172
|
|
|
170
173
|
{
|
|
@@ -180,6 +183,7 @@ TEST_F(DBBlobBasicTest, IterateBlobsFromCache) {
|
|
|
180
183
|
iter->SeekToFirst();
|
|
181
184
|
ASSERT_NOK(iter->status());
|
|
182
185
|
ASSERT_FALSE(iter->Valid());
|
|
186
|
+
ASSERT_EQ(options.statistics->getAndResetTickerCount(BLOB_DB_CACHE_ADD), 0);
|
|
183
187
|
}
|
|
184
188
|
|
|
185
189
|
{
|
|
@@ -198,6 +202,8 @@ TEST_F(DBBlobBasicTest, IterateBlobsFromCache) {
|
|
|
198
202
|
++i;
|
|
199
203
|
}
|
|
200
204
|
ASSERT_EQ(i, num_blobs);
|
|
205
|
+
ASSERT_EQ(options.statistics->getAndResetTickerCount(BLOB_DB_CACHE_ADD),
|
|
206
|
+
num_blobs);
|
|
201
207
|
}
|
|
202
208
|
|
|
203
209
|
{
|
|
@@ -217,6 +223,149 @@ TEST_F(DBBlobBasicTest, IterateBlobsFromCache) {
|
|
|
217
223
|
++i;
|
|
218
224
|
}
|
|
219
225
|
ASSERT_EQ(i, num_blobs);
|
|
226
|
+
ASSERT_EQ(options.statistics->getAndResetTickerCount(BLOB_DB_CACHE_ADD), 0);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
TEST_F(DBBlobBasicTest, IterateBlobsFromCachePinning) {
|
|
231
|
+
constexpr size_t min_blob_size = 6;
|
|
232
|
+
|
|
233
|
+
Options options = GetDefaultOptions();
|
|
234
|
+
|
|
235
|
+
LRUCacheOptions cache_options;
|
|
236
|
+
cache_options.capacity = 2048;
|
|
237
|
+
cache_options.num_shard_bits = 0;
|
|
238
|
+
cache_options.metadata_charge_policy = kDontChargeCacheMetadata;
|
|
239
|
+
|
|
240
|
+
options.blob_cache = NewLRUCache(cache_options);
|
|
241
|
+
options.enable_blob_files = true;
|
|
242
|
+
options.min_blob_size = min_blob_size;
|
|
243
|
+
|
|
244
|
+
Reopen(options);
|
|
245
|
+
|
|
246
|
+
// Put then iterate over three key-values. The second value is below the size
|
|
247
|
+
// limit and is thus stored inline; the other two are stored separately as
|
|
248
|
+
// blobs. We expect to have something pinned in the cache iff we are
|
|
249
|
+
// positioned on a blob.
|
|
250
|
+
|
|
251
|
+
constexpr char first_key[] = "first_key";
|
|
252
|
+
constexpr char first_value[] = "long_value";
|
|
253
|
+
static_assert(sizeof(first_value) - 1 >= min_blob_size,
|
|
254
|
+
"first_value too short to be stored as blob");
|
|
255
|
+
|
|
256
|
+
ASSERT_OK(Put(first_key, first_value));
|
|
257
|
+
|
|
258
|
+
constexpr char second_key[] = "second_key";
|
|
259
|
+
constexpr char second_value[] = "short";
|
|
260
|
+
static_assert(sizeof(second_value) - 1 < min_blob_size,
|
|
261
|
+
"second_value too long to be inlined");
|
|
262
|
+
|
|
263
|
+
ASSERT_OK(Put(second_key, second_value));
|
|
264
|
+
|
|
265
|
+
constexpr char third_key[] = "third_key";
|
|
266
|
+
constexpr char third_value[] = "other_long_value";
|
|
267
|
+
static_assert(sizeof(third_value) - 1 >= min_blob_size,
|
|
268
|
+
"third_value too short to be stored as blob");
|
|
269
|
+
|
|
270
|
+
ASSERT_OK(Put(third_key, third_value));
|
|
271
|
+
|
|
272
|
+
ASSERT_OK(Flush());
|
|
273
|
+
|
|
274
|
+
{
|
|
275
|
+
ReadOptions read_options;
|
|
276
|
+
read_options.fill_cache = true;
|
|
277
|
+
|
|
278
|
+
std::unique_ptr<Iterator> iter(db_->NewIterator(read_options));
|
|
279
|
+
|
|
280
|
+
iter->SeekToFirst();
|
|
281
|
+
ASSERT_TRUE(iter->Valid());
|
|
282
|
+
ASSERT_OK(iter->status());
|
|
283
|
+
ASSERT_EQ(iter->key(), first_key);
|
|
284
|
+
ASSERT_EQ(iter->value(), first_value);
|
|
285
|
+
|
|
286
|
+
iter->Next();
|
|
287
|
+
ASSERT_TRUE(iter->Valid());
|
|
288
|
+
ASSERT_OK(iter->status());
|
|
289
|
+
ASSERT_EQ(iter->key(), second_key);
|
|
290
|
+
ASSERT_EQ(iter->value(), second_value);
|
|
291
|
+
|
|
292
|
+
iter->Next();
|
|
293
|
+
ASSERT_TRUE(iter->Valid());
|
|
294
|
+
ASSERT_OK(iter->status());
|
|
295
|
+
ASSERT_EQ(iter->key(), third_key);
|
|
296
|
+
ASSERT_EQ(iter->value(), third_value);
|
|
297
|
+
|
|
298
|
+
iter->Next();
|
|
299
|
+
ASSERT_FALSE(iter->Valid());
|
|
300
|
+
ASSERT_OK(iter->status());
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
{
|
|
304
|
+
ReadOptions read_options;
|
|
305
|
+
read_options.fill_cache = false;
|
|
306
|
+
read_options.read_tier = kBlockCacheTier;
|
|
307
|
+
|
|
308
|
+
std::unique_ptr<Iterator> iter(db_->NewIterator(read_options));
|
|
309
|
+
|
|
310
|
+
iter->SeekToFirst();
|
|
311
|
+
ASSERT_TRUE(iter->Valid());
|
|
312
|
+
ASSERT_OK(iter->status());
|
|
313
|
+
ASSERT_EQ(iter->key(), first_key);
|
|
314
|
+
ASSERT_EQ(iter->value(), first_value);
|
|
315
|
+
ASSERT_GT(options.blob_cache->GetPinnedUsage(), 0);
|
|
316
|
+
|
|
317
|
+
iter->Next();
|
|
318
|
+
ASSERT_TRUE(iter->Valid());
|
|
319
|
+
ASSERT_OK(iter->status());
|
|
320
|
+
ASSERT_EQ(iter->key(), second_key);
|
|
321
|
+
ASSERT_EQ(iter->value(), second_value);
|
|
322
|
+
ASSERT_EQ(options.blob_cache->GetPinnedUsage(), 0);
|
|
323
|
+
|
|
324
|
+
iter->Next();
|
|
325
|
+
ASSERT_TRUE(iter->Valid());
|
|
326
|
+
ASSERT_OK(iter->status());
|
|
327
|
+
ASSERT_EQ(iter->key(), third_key);
|
|
328
|
+
ASSERT_EQ(iter->value(), third_value);
|
|
329
|
+
ASSERT_GT(options.blob_cache->GetPinnedUsage(), 0);
|
|
330
|
+
|
|
331
|
+
iter->Next();
|
|
332
|
+
ASSERT_FALSE(iter->Valid());
|
|
333
|
+
ASSERT_OK(iter->status());
|
|
334
|
+
ASSERT_EQ(options.blob_cache->GetPinnedUsage(), 0);
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
{
|
|
338
|
+
ReadOptions read_options;
|
|
339
|
+
read_options.fill_cache = false;
|
|
340
|
+
read_options.read_tier = kBlockCacheTier;
|
|
341
|
+
|
|
342
|
+
std::unique_ptr<Iterator> iter(db_->NewIterator(read_options));
|
|
343
|
+
|
|
344
|
+
iter->SeekToLast();
|
|
345
|
+
ASSERT_TRUE(iter->Valid());
|
|
346
|
+
ASSERT_OK(iter->status());
|
|
347
|
+
ASSERT_EQ(iter->key(), third_key);
|
|
348
|
+
ASSERT_EQ(iter->value(), third_value);
|
|
349
|
+
ASSERT_GT(options.blob_cache->GetPinnedUsage(), 0);
|
|
350
|
+
|
|
351
|
+
iter->Prev();
|
|
352
|
+
ASSERT_TRUE(iter->Valid());
|
|
353
|
+
ASSERT_OK(iter->status());
|
|
354
|
+
ASSERT_EQ(iter->key(), second_key);
|
|
355
|
+
ASSERT_EQ(iter->value(), second_value);
|
|
356
|
+
ASSERT_EQ(options.blob_cache->GetPinnedUsage(), 0);
|
|
357
|
+
|
|
358
|
+
iter->Prev();
|
|
359
|
+
ASSERT_TRUE(iter->Valid());
|
|
360
|
+
ASSERT_OK(iter->status());
|
|
361
|
+
ASSERT_EQ(iter->key(), first_key);
|
|
362
|
+
ASSERT_EQ(iter->value(), first_value);
|
|
363
|
+
ASSERT_GT(options.blob_cache->GetPinnedUsage(), 0);
|
|
364
|
+
|
|
365
|
+
iter->Prev();
|
|
366
|
+
ASSERT_FALSE(iter->Valid());
|
|
367
|
+
ASSERT_OK(iter->status());
|
|
368
|
+
ASSERT_EQ(options.blob_cache->GetPinnedUsage(), 0);
|
|
220
369
|
}
|
|
221
370
|
}
|
|
222
371
|
|
|
@@ -798,6 +798,42 @@ TEST_F(DBBlobCompactionTest, CompactionReadaheadMerge) {
|
|
|
798
798
|
Close();
|
|
799
799
|
}
|
|
800
800
|
|
|
801
|
+
TEST_F(DBBlobCompactionTest, CompactionDoNotFillCache) {
|
|
802
|
+
Options options = GetDefaultOptions();
|
|
803
|
+
|
|
804
|
+
options.enable_blob_files = true;
|
|
805
|
+
options.min_blob_size = 0;
|
|
806
|
+
options.enable_blob_garbage_collection = true;
|
|
807
|
+
options.blob_garbage_collection_age_cutoff = 1.0;
|
|
808
|
+
options.disable_auto_compactions = true;
|
|
809
|
+
options.statistics = CreateDBStatistics();
|
|
810
|
+
|
|
811
|
+
LRUCacheOptions cache_options;
|
|
812
|
+
cache_options.capacity = 1 << 20;
|
|
813
|
+
cache_options.metadata_charge_policy = kDontChargeCacheMetadata;
|
|
814
|
+
|
|
815
|
+
options.blob_cache = NewLRUCache(cache_options);
|
|
816
|
+
|
|
817
|
+
Reopen(options);
|
|
818
|
+
|
|
819
|
+
ASSERT_OK(Put("key", "lime"));
|
|
820
|
+
ASSERT_OK(Put("foo", "bar"));
|
|
821
|
+
ASSERT_OK(Flush());
|
|
822
|
+
|
|
823
|
+
ASSERT_OK(Put("key", "pie"));
|
|
824
|
+
ASSERT_OK(Put("foo", "baz"));
|
|
825
|
+
ASSERT_OK(Flush());
|
|
826
|
+
|
|
827
|
+
constexpr Slice* begin = nullptr;
|
|
828
|
+
constexpr Slice* end = nullptr;
|
|
829
|
+
|
|
830
|
+
ASSERT_OK(db_->CompactRange(CompactRangeOptions(), begin, end));
|
|
831
|
+
|
|
832
|
+
ASSERT_EQ(options.statistics->getTickerCount(BLOB_DB_CACHE_ADD), 0);
|
|
833
|
+
|
|
834
|
+
Close();
|
|
835
|
+
}
|
|
836
|
+
|
|
801
837
|
} // namespace ROCKSDB_NAMESPACE
|
|
802
838
|
|
|
803
839
|
int main(int argc, char** argv) {
|