Summary: WriteUnPrepared adds a virtual function, MaxUnpreparedSequenceNumber, to ReadCallback, which returns 0 unless WriteUnPrepared is enabled and the transaction has uncommitted data written to the DB. Together with snapshot sequence number, this determines the last sequence that is visible to reads. The patch clarifies the guarantees of the GetIterator API in WriteUnPrepared transactions and make use of that to statically initialize the read callback and thus avoid the virtual call. Furthermore it increases the minimum value for min_uncommitted from 0 to 1 as seq 0 is used only for last level keys that are committed in all snapshots. The following benchmark shows +0.26% higher throughput in seekrandom benchmark. Benchmark: ./db_bench --benchmarks=fillrandom --use_existing_db=0 --num=1000000 --db=/dev/shm/dbbench ./db_bench --benchmarks=seekrandom[X10] --use_existing_db=1 --db=/dev/shm/dbbench --num=1000000 --duration=60 --seek_nexts=100 seekrandom [AVG 10 runs] : 20355 ops/sec; 225.2 MB/sec seekrandom [MEDIAN 10 runs] : 20425 ops/sec; 225.9 MB/sec ./db_bench_lessvirtual3 --benchmarks=seekrandom[X10] --use_existing_db=1 --db=/dev/shm/dbbench --num=1000000 --duration=60 --seek_nexts=100 seekrandom [AVG 10 runs] : 20409 ops/sec; 225.8 MB/sec seekrandom [MEDIAN 10 runs] : 20487 ops/sec; 226.6 MB/sec Pull Request resolved: https://github.com/facebook/rocksdb/pull/5049 Differential Revision: D14366459 Pulled By: maysamyabandeh fbshipit-source-id: ebaff8908332a5ae9af7defeadabcb624be660ef
56 lines
1.8 KiB
C++
56 lines
1.8 KiB
C++
// Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
|
|
// This source code is licensed under both the GPLv2 (found in the
|
|
// COPYING file in the root directory) and Apache 2.0 License
|
|
// (found in the LICENSE.Apache file in the root directory).
|
|
|
|
#pragma once
|
|
|
|
#include "rocksdb/types.h"
|
|
|
|
namespace rocksdb {
|
|
|
|
class ReadCallback {
|
|
public:
|
|
ReadCallback(SequenceNumber last_visible_seq)
|
|
: max_visible_seq_(last_visible_seq) {}
|
|
ReadCallback(SequenceNumber last_visible_seq, SequenceNumber min_uncommitted)
|
|
: max_visible_seq_(last_visible_seq), min_uncommitted_(min_uncommitted) {}
|
|
|
|
virtual ~ReadCallback() {}
|
|
|
|
// Will be called to see if the seq number visible; if not it moves on to
|
|
// the next seq number.
|
|
virtual bool IsVisibleFullCheck(SequenceNumber seq) = 0;
|
|
|
|
inline bool IsVisible(SequenceNumber seq) {
|
|
assert(min_uncommitted_ > 0);
|
|
assert(min_uncommitted_ >= kMinUnCommittedSeq);
|
|
if (seq < min_uncommitted_) { // handles seq == 0 as well
|
|
assert(seq <= max_visible_seq_);
|
|
return true;
|
|
} else if (max_visible_seq_ < seq) {
|
|
assert(seq != 0);
|
|
return false;
|
|
} else {
|
|
assert(seq != 0); // already handled in the first if-then clause
|
|
return IsVisibleFullCheck(seq);
|
|
}
|
|
}
|
|
|
|
inline SequenceNumber max_visible_seq() { return max_visible_seq_; }
|
|
|
|
virtual void Refresh(SequenceNumber seq) { max_visible_seq_ = seq; }
|
|
|
|
// Refer to DBIter::CanReseekToSkip
|
|
virtual bool CanReseekToSkip() { return true; }
|
|
|
|
protected:
|
|
// The max visible seq, it is usually the snapshot but could be larger if
|
|
// transaction has its own writes written to db.
|
|
SequenceNumber max_visible_seq_ = kMaxSequenceNumber;
|
|
// Any seq less than min_uncommitted_ is committed.
|
|
const SequenceNumber min_uncommitted_ = kMinUnCommittedSeq;
|
|
};
|
|
|
|
} // namespace rocksdb
|