Skip to content

Commit 6af1ee6

Browse files
Changing single key deletions to delete based on number of deletes instead of bytelimit.
1 parent 4808747 commit 6af1ee6

10 files changed

+29
-30
lines changed

fdbclient/ServerKnobs.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -421,7 +421,9 @@ void ServerKnobs::initialize(Randomize randomize, ClientKnobs* clientKnobs, IsSi
421421
// These knobs have contrary functionality.
422422
init( ROCKSDB_SINGLEKEY_DELETES_ON_CLEARRANGE, true );
423423
init( ROCKSDB_SINGLEKEY_DELETES_BYTES_LIMIT, 10000 ); // 10KB
424+
init( ROCKSDB_SINGLEKEY_DELETES_MAX, 200 ); // Max rocksdb::delete calls in a transaction
424425
init( ROCKSDB_ENABLE_CLEAR_RANGE_EAGER_READS, false );
426+
init( ROCKSDB_FORCE_DELETERANGE_FOR_CLEARRANGE, false );
425427
// ROCKSDB_STATS_LEVEL=1 indicates rocksdb::StatsLevel::kExceptHistogramOrTimers
426428
// Refer StatsLevel: https://github.com/facebook/rocksdb/blob/main/include/rocksdb/statistics.h#L594
427429
init( ROCKSDB_STATS_LEVEL, 1 ); if( randomize && BUGGIFY ) ROCKSDB_STATS_LEVEL = deterministicRandom()->randomInt(0, 6);

fdbclient/ServerKnobs.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -342,7 +342,9 @@ class ServerKnobs : public KnobsImpl<ServerKnobs> {
342342
bool ROCKSDB_DISABLE_WAL_EXPERIMENTAL;
343343
bool ROCKSDB_SINGLEKEY_DELETES_ON_CLEARRANGE;
344344
int64_t ROCKSDB_SINGLEKEY_DELETES_BYTES_LIMIT;
345+
int ROCKSDB_SINGLEKEY_DELETES_MAX;
345346
bool ROCKSDB_ENABLE_CLEAR_RANGE_EAGER_READS;
347+
bool ROCKSDB_FORCE_DELETERANGE_FOR_CLEARRANGE;
346348
bool ROCKSDB_ENABLE_COMPACT_ON_DELETION;
347349
int64_t ROCKSDB_CDCF_SLIDING_WINDOW_SIZE; // CDCF: CompactOnDeletionCollectorFactory
348350
int64_t ROCKSDB_CDCF_DELETION_TRIGGER; // CDCF: CompactOnDeletionCollectorFactory

fdbserver/IKeyValueStore.h

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,9 +62,7 @@ class IKeyValueStore : public IClosable {
6262
public:
6363
virtual KeyValueStoreType getType() const = 0;
6464
virtual void set(KeyValueRef keyValue, const Arena* arena = nullptr) = 0;
65-
virtual void clear(KeyRangeRef range,
66-
const StorageServerMetrics* storageMetrics = nullptr,
67-
const Arena* arena = nullptr) = 0;
65+
virtual void clear(KeyRangeRef range, const Arena* arena = nullptr) = 0;
6866
virtual Future<Void> canCommit() { return Void(); }
6967
virtual Future<Void> commit(
7068
bool sequential = false) = 0; // returns when prior sets and clears are (atomically) durable

fdbserver/KeyValueStoreCompressTestData.actor.cpp

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -53,11 +53,7 @@ struct KeyValueStoreCompressTestData final : IKeyValueStore {
5353
void set(KeyValueRef keyValue, const Arena* arena = nullptr) override {
5454
store->set(KeyValueRef(keyValue.key, pack(keyValue.value)), arena);
5555
}
56-
void clear(KeyRangeRef range,
57-
const StorageServerMetrics* storageMetrics = nullptr,
58-
const Arena* arena = nullptr) override {
59-
store->clear(range, storageMetrics, arena);
60-
}
56+
void clear(KeyRangeRef range, const Arena* arena = nullptr) override { store->clear(range, arena); }
6157
Future<Void> commit(bool sequential = false) override { return store->commit(sequential); }
6258

6359
Future<Optional<Value>> readValue(KeyRef key, IKeyValueStore::ReadType, Optional<UID> debugID) override {

fdbserver/KeyValueStoreMemory.actor.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ class KeyValueStoreMemory final : public IKeyValueStore, NonCopyable {
124124
}
125125
}
126126

127-
void clear(KeyRangeRef range, const StorageServerMetrics* storageMetrics, const Arena* arena) override {
127+
void clear(KeyRangeRef range, const Arena* arena) override {
128128
// A commit that occurs with no available space returns Never, so we can throw out all modifications
129129
if (getAvailableSize() <= 0)
130130
return;

fdbserver/KeyValueStoreRocksDB.actor.cpp

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1884,6 +1884,8 @@ struct RocksDBKeyValueStore : IKeyValueStore {
18841884
Future<Void> openFuture;
18851885
std::unique_ptr<rocksdb::WriteBatch> writeBatch;
18861886
std::set<Key> keysSet;
1887+
// maximum number of single key deletes in a commit, if ROCKSDB_SINGLEKEY_DELETES_ON_CLEARRANGE is enabled.
1888+
int maxDeletes;
18871889
Optional<Future<Void>> metrics;
18881890
FlowLock readSemaphore;
18891891
int numReadWaiters;
@@ -2072,6 +2074,7 @@ struct RocksDBKeyValueStore : IKeyValueStore {
20722074
if (writeBatch == nullptr) {
20732075
writeBatch.reset(new rocksdb::WriteBatch());
20742076
keysSet.clear();
2077+
maxDeletes = SERVER_KNOBS->ROCKSDB_SINGLEKEY_DELETES_MAX;
20752078
}
20762079
ASSERT(defaultFdbCF != nullptr);
20772080
writeBatch->Put(defaultFdbCF, toSlice(kv.key), toSlice(kv.value));
@@ -2080,23 +2083,24 @@ struct RocksDBKeyValueStore : IKeyValueStore {
20802083
}
20812084
}
20822085

2083-
void clear(KeyRangeRef keyRange, const StorageServerMetrics* storageMetrics, const Arena*) override {
2086+
void clear(KeyRangeRef keyRange, const Arena*) override {
20842087
if (writeBatch == nullptr) {
20852088
writeBatch.reset(new rocksdb::WriteBatch());
20862089
keysSet.clear();
2090+
maxDeletes = SERVER_KNOBS->ROCKSDB_SINGLEKEY_DELETES_MAX;
20872091
}
20882092

20892093
ASSERT(defaultFdbCF != nullptr);
20902094
// Number of deletes to rocksdb = counters.deleteKeyReqs + convertedDeleteKeyReqs;
20912095
// Number of deleteRanges to rocksdb = counters.deleteRangeReqs - counters.convertedDeleteRangeReqs;
2092-
if (keyRange.singleKeyRange()) {
2096+
if (keyRange.singleKeyRange() && !SERVER_KNOBS->ROCKSDB_FORCE_DELETERANGE_FOR_CLEARRANGE) {
20932097
writeBatch->Delete(defaultFdbCF, toSlice(keyRange.begin));
20942098
++counters.deleteKeyReqs;
2099+
--maxDeletes;
20952100
} else {
20962101
++counters.deleteRangeReqs;
2097-
if (SERVER_KNOBS->ROCKSDB_SINGLEKEY_DELETES_ON_CLEARRANGE && storageMetrics != nullptr &&
2098-
storageMetrics->byteSample.getEstimate(keyRange) <
2099-
SERVER_KNOBS->ROCKSDB_SINGLEKEY_DELETES_BYTES_LIMIT) {
2102+
if (SERVER_KNOBS->ROCKSDB_SINGLEKEY_DELETES_ON_CLEARRANGE &&
2103+
!SERVER_KNOBS->ROCKSDB_FORCE_DELETERANGE_FOR_CLEARRANGE && maxDeletes > 0) {
21002104
++counters.convertedDeleteRangeReqs;
21012105
rocksdb::ReadOptions options = getReadOptions();
21022106
auto beginSlice = toSlice(keyRange.begin);
@@ -2105,19 +2109,21 @@ struct RocksDBKeyValueStore : IKeyValueStore {
21052109
options.iterate_upper_bound = &endSlice;
21062110
auto cursor = std::unique_ptr<rocksdb::Iterator>(db->NewIterator(options, defaultFdbCF));
21072111
cursor->Seek(toSlice(keyRange.begin));
2108-
while (cursor->Valid() && toStringRef(cursor->key()) < keyRange.end) {
2112+
while (cursor->Valid() && toStringRef(cursor->key()) < keyRange.end && maxDeletes > 0) {
21092113
writeBatch->Delete(defaultFdbCF, cursor->key());
21102114
++counters.convertedDeleteKeyReqs;
2115+
--maxDeletes;
21112116
cursor->Next();
21122117
}
2113-
if (!cursor->status().ok()) {
2118+
if (!cursor->status().ok() || maxDeletes <= 0) {
21142119
// if readrange iteration fails, then do a deleteRange.
21152120
writeBatch->DeleteRange(defaultFdbCF, toSlice(keyRange.begin), toSlice(keyRange.end));
21162121
} else {
21172122
auto it = keysSet.lower_bound(keyRange.begin);
21182123
while (it != keysSet.end() && *it < keyRange.end) {
21192124
writeBatch->Delete(defaultFdbCF, toSlice(*it));
21202125
++counters.convertedDeleteKeyReqs;
2126+
--maxDeletes;
21212127
it++;
21222128
}
21232129
}
@@ -2156,6 +2162,7 @@ struct RocksDBKeyValueStore : IKeyValueStore {
21562162
auto a = new Writer::CommitAction();
21572163
a->batchToCommit = std::move(writeBatch);
21582164
keysSet.clear();
2165+
maxDeletes = SERVER_KNOBS->ROCKSDB_SINGLEKEY_DELETES_MAX;
21592166
auto res = a->done.getFuture();
21602167
writeThread->post(a);
21612168
return res;

fdbserver/KeyValueStoreSQLite.actor.cpp

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1586,9 +1586,7 @@ class KeyValueStoreSQLite final : public IKeyValueStore {
15861586
StorageBytes getStorageBytes() const override;
15871587

15881588
void set(KeyValueRef keyValue, const Arena* arena = nullptr) override;
1589-
void clear(KeyRangeRef range,
1590-
const StorageServerMetrics* storageMetrics = nullptr,
1591-
const Arena* arena = nullptr) override;
1589+
void clear(KeyRangeRef range, const Arena* arena = nullptr) override;
15921590
Future<Void> commit(bool sequential = false) override;
15931591

15941592
Future<Optional<Value>> readValue(KeyRef key, IKeyValueStore::ReadType, Optional<UID> debugID) override;
@@ -2204,7 +2202,7 @@ void KeyValueStoreSQLite::set(KeyValueRef keyValue, const Arena* arena) {
22042202
++writesRequested;
22052203
writeThread->post(new Writer::SetAction(keyValue));
22062204
}
2207-
void KeyValueStoreSQLite::clear(KeyRangeRef range, const StorageServerMetrics* storageMetrics, const Arena* arena) {
2205+
void KeyValueStoreSQLite::clear(KeyRangeRef range, const Arena* arena) {
22082206
++writesRequested;
22092207
writeThread->post(new Writer::ClearAction(range));
22102208
}

fdbserver/RemoteIKeyValueStore.actor.h

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -392,9 +392,7 @@ struct RemoteIKeyValueStore : public IKeyValueStore {
392392
void set(KeyValueRef keyValue, const Arena* arena = nullptr) override {
393393
interf.set.send(IKVSSetRequest{ keyValue, ReplyPromise<Void>() });
394394
}
395-
void clear(KeyRangeRef range,
396-
const StorageServerMetrics* storageMetrics = nullptr,
397-
const Arena* arena = nullptr) override {
395+
void clear(KeyRangeRef range, const Arena* arena = nullptr) override {
398396
interf.clear.send(IKVSClearRequest{ range, ReplyPromise<Void>() });
399397
}
400398

fdbserver/VersionedBTree.actor.cpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7822,9 +7822,7 @@ class KeyValueStoreRedwood : public IKeyValueStore {
78227822

78237823
Future<Void> getError() const override { return delayed(m_error.getFuture()); };
78247824

7825-
void clear(KeyRangeRef range,
7826-
const StorageServerMetrics* storageMetrics = nullptr,
7827-
const Arena* arena = 0) override {
7825+
void clear(KeyRangeRef range, const Arena* arena = 0) override {
78287826
debug_printf("CLEAR %s\n", printable(range).c_str());
78297827
m_tree->clear(range);
78307828
}

fdbserver/storageserver.actor.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7870,7 +7870,7 @@ void setAssignedStatus(StorageServer* self, KeyRangeRef keys, bool nowAssigned)
78707870
}
78717871

78727872
void StorageServerDisk::clearRange(KeyRangeRef keys) {
7873-
storage->clear(keys, &data->metrics);
7873+
storage->clear(keys);
78747874
++(*kvClearRanges);
78757875
if (keys.singleKeyRange()) {
78767876
++(*kvClearSingleKey);
@@ -7887,7 +7887,7 @@ void StorageServerDisk::writeMutation(MutationRef mutation) {
78877887
storage->set(KeyValueRef(mutation.param1, mutation.param2));
78887888
*kvCommitLogicalBytes += mutation.expectedSize();
78897889
} else if (mutation.type == MutationRef::ClearRange) {
7890-
storage->clear(KeyRangeRef(mutation.param1, mutation.param2), &data->metrics);
7890+
storage->clear(KeyRangeRef(mutation.param1, mutation.param2));
78917891
++(*kvClearRanges);
78927892
if (KeyRangeRef(mutation.param1, mutation.param2).singleKeyRange()) {
78937893
++(*kvClearSingleKey);
@@ -7905,7 +7905,7 @@ void StorageServerDisk::writeMutations(const VectorRef<MutationRef>& mutations,
79057905
storage->set(KeyValueRef(m.param1, m.param2));
79067906
*kvCommitLogicalBytes += m.expectedSize();
79077907
} else if (m.type == MutationRef::ClearRange) {
7908-
storage->clear(KeyRangeRef(m.param1, m.param2), &data->metrics);
7908+
storage->clear(KeyRangeRef(m.param1, m.param2));
79097909
++(*kvClearRanges);
79107910
if (KeyRangeRef(m.param1, m.param2).singleKeyRange()) {
79117911
++(*kvClearSingleKey);
@@ -8318,7 +8318,7 @@ ACTOR Future<bool> restoreDurableState(StorageServer* data, IKeyValueStore* stor
83188318
++data->counters.kvSystemClearRanges;
83198319
// TODO(alexmiller): Figure out how to selectively enable spammy data distribution events.
83208320
// DEBUG_KEY_RANGE("clearInvalidVersion", invalidVersion, clearRange);
8321-
storage->clear(clearRange, &data->metrics);
8321+
storage->clear(clearRange);
83228322
++data->counters.kvSystemClearRanges;
83238323
data->byteSampleApplyClear(clearRange, invalidVersion);
83248324
}

0 commit comments

Comments
 (0)