Summary: This PR does the following: - Enable backward iteration for keys with user-defined timestamp. Note that merge, single delete, range delete are not supported yet. - Introduces a new helper API `Comparator::EqualWithoutTimestamp()`. - Fix a typo in `SetTimestamp()`. - Add/update unit tests Run db_bench (built with DEBUG_LEVEL=0) to demonstrate that no overhead is introduced for CPU-intensive workloads with a lot of `Prev()`. Also provided results of iterating keys with timestamps. 1. Disable timestamp, run: ``` ./db_bench -db=/dev/shm/rocksdb -disable_wal=1 -benchmarks=fillseq,seekrandom[-W1-X6] -reverse_iterator=1 -seek_nexts=5 ``` Results: > Baseline > - seekrandom [AVG 6 runs] : 96115 ops/sec; 53.2 MB/sec > - seekrandom [MEDIAN 6 runs] : 98075 ops/sec; 54.2 MB/sec > > This PR > - seekrandom [AVG 6 runs] : 95521 ops/sec; 52.8 MB/sec > - seekrandom [MEDIAN 6 runs] : 96338 ops/sec; 53.3 MB/sec 2. Enable timestamp, run: ``` ./db_bench -user_timestamp_size=8 -db=/dev/shm/rocksdb -disable_wal=1 -benchmarks=fillseq,seekrandom[-W1-X6] -reverse_iterator=1 -seek_nexts=5 ``` Result: > Baseline: not supported > > This PR > - seekrandom [AVG 6 runs] : 90514 ops/sec; 50.1 MB/sec > - seekrandom [MEDIAN 6 runs] : 90834 ops/sec; 50.2 MB/sec Pull Request resolved: https://github.com/facebook/rocksdb/pull/8035 Reviewed By: ltamasi Differential Revision: D26926668 Pulled By: riversand963 fbshipit-source-id: 95330cc2242397c03e09d29e5417dfb0adc98ef5
127 lines
5.0 KiB
C++
127 lines
5.0 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).
|
|
// Copyright (c) 2011 The LevelDB Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file. See the AUTHORS file for names of contributors.
|
|
//
|
|
// An iterator yields a sequence of key/value pairs from a source.
|
|
// The following class defines the interface. Multiple implementations
|
|
// are provided by this library. In particular, iterators are provided
|
|
// to access the contents of a Table or a DB.
|
|
//
|
|
// Multiple threads can invoke const methods on an Iterator without
|
|
// external synchronization, but if any of the threads may call a
|
|
// non-const method, all threads accessing the same Iterator must use
|
|
// external synchronization.
|
|
|
|
#pragma once
|
|
|
|
#include <string>
|
|
#include "rocksdb/cleanable.h"
|
|
#include "rocksdb/slice.h"
|
|
#include "rocksdb/status.h"
|
|
|
|
namespace ROCKSDB_NAMESPACE {
|
|
|
|
class Iterator : public Cleanable {
|
|
public:
|
|
Iterator() {}
|
|
// No copying allowed
|
|
Iterator(const Iterator&) = delete;
|
|
void operator=(const Iterator&) = delete;
|
|
|
|
virtual ~Iterator() {}
|
|
|
|
// An iterator is either positioned at a key/value pair, or
|
|
// not valid. This method returns true iff the iterator is valid.
|
|
// Always returns false if !status().ok().
|
|
virtual bool Valid() const = 0;
|
|
|
|
// Position at the first key in the source. The iterator is Valid()
|
|
// after this call iff the source is not empty.
|
|
virtual void SeekToFirst() = 0;
|
|
|
|
// Position at the last key in the source. The iterator is
|
|
// Valid() after this call iff the source is not empty.
|
|
virtual void SeekToLast() = 0;
|
|
|
|
// Position at the first key in the source that at or past target.
|
|
// The iterator is Valid() after this call iff the source contains
|
|
// an entry that comes at or past target.
|
|
// All Seek*() methods clear any error status() that the iterator had prior to
|
|
// the call; after the seek, status() indicates only the error (if any) that
|
|
// happened during the seek, not any past errors.
|
|
// Target does not contain timestamp.
|
|
virtual void Seek(const Slice& target) = 0;
|
|
|
|
// Position at the last key in the source that at or before target.
|
|
// The iterator is Valid() after this call iff the source contains
|
|
// an entry that comes at or before target.
|
|
// Target does not contain timestamp.
|
|
virtual void SeekForPrev(const Slice& target) = 0;
|
|
|
|
// Moves to the next entry in the source. After this call, Valid() is
|
|
// true iff the iterator was not positioned at the last entry in the source.
|
|
// REQUIRES: Valid()
|
|
virtual void Next() = 0;
|
|
|
|
// Moves to the previous entry in the source. After this call, Valid() is
|
|
// true iff the iterator was not positioned at the first entry in source.
|
|
// REQUIRES: Valid()
|
|
virtual void Prev() = 0;
|
|
|
|
// Return the key for the current entry. The underlying storage for
|
|
// the returned slice is valid only until the next modification of
|
|
// the iterator.
|
|
// REQUIRES: Valid()
|
|
virtual Slice key() const = 0;
|
|
|
|
// Return the value for the current entry. The underlying storage for
|
|
// the returned slice is valid only until the next modification of
|
|
// the iterator.
|
|
// REQUIRES: Valid()
|
|
virtual Slice value() const = 0;
|
|
|
|
// If an error has occurred, return it. Else return an ok status.
|
|
// If non-blocking IO is requested and this operation cannot be
|
|
// satisfied without doing some IO, then this returns Status::Incomplete().
|
|
virtual Status status() const = 0;
|
|
|
|
// If supported, renew the iterator to represent the latest state. The
|
|
// iterator will be invalidated after the call. Not supported if
|
|
// ReadOptions.snapshot is given when creating the iterator.
|
|
virtual Status Refresh() {
|
|
return Status::NotSupported("Refresh() is not supported");
|
|
}
|
|
|
|
// Property "rocksdb.iterator.is-key-pinned":
|
|
// If returning "1", this means that the Slice returned by key() is valid
|
|
// as long as the iterator is not deleted.
|
|
// It is guaranteed to always return "1" if
|
|
// - Iterator created with ReadOptions::pin_data = true
|
|
// - DB tables were created with
|
|
// BlockBasedTableOptions::use_delta_encoding = false.
|
|
// Property "rocksdb.iterator.super-version-number":
|
|
// LSM version used by the iterator. The same format as DB Property
|
|
// kCurrentSuperVersionNumber. See its comment for more information.
|
|
// Property "rocksdb.iterator.internal-key":
|
|
// Get the user-key portion of the internal key at which the iteration
|
|
// stopped.
|
|
virtual Status GetProperty(std::string prop_name, std::string* prop);
|
|
|
|
virtual Slice timestamp() const {
|
|
assert(false);
|
|
return Slice();
|
|
}
|
|
};
|
|
|
|
// Return an empty iterator (yields nothing).
|
|
extern Iterator* NewEmptyIterator();
|
|
|
|
// Return an empty iterator with the specified status.
|
|
extern Iterator* NewErrorIterator(const Status& status);
|
|
|
|
} // namespace ROCKSDB_NAMESPACE
|