// 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 #ifndef ROCKSDB_LITE #include #include #include #include #include "db/column_family.h" #include "rocksdb/db.h" #include "rocksdb/iterator.h" #include "rocksdb/options.h" #include "util/arena.h" namespace rocksdb { class DBImpl; struct SuperVersion; class ColumnFamilyData; /** * ManagedIterator is a special type of iterator that supports freeing the * underlying iterator and still being able to access the current key/value * pair. This is done by copying the key/value pair so that clients can * continue to access the data without getting a SIGSEGV. * The underlying iterator can be freed manually through the call to * ReleaseIter or automatically (as needed on space pressure or age.) * The iterator is recreated using the saved original arguments. */ class ManagedIterator : public Iterator { public: ManagedIterator(DBImpl* db, const ReadOptions& read_options, ColumnFamilyData* cfd); virtual ~ManagedIterator(); virtual void SeekToLast() override; virtual void Prev() override; virtual bool Valid() const override; void SeekToFirst() override; virtual void Seek(const Slice& target) override; virtual void SeekForPrev(const Slice& target) override; virtual void Next() override; virtual Slice key() const override; virtual Slice value() const override; virtual Status status() const override; void ReleaseIter(bool only_old); void SetDropOld(bool only_old) { only_drop_old_ = read_options_.tailing || only_old; } private: void RebuildIterator(); void UpdateCurrent(); void SeekInternal(const Slice& user_key, bool seek_to_first); bool NeedToRebuild(); void Lock(); bool TryLock(); void UnLock(); DBImpl* const db_; ReadOptions read_options_; ColumnFamilyData* const cfd_; ColumnFamilyHandleInternal cfh_; uint64_t svnum_; std::unique_ptr mutable_iter_; // internal iterator status Status status_; bool valid_; IterKey cached_key_; IterKey cached_value_; bool only_drop_old_ = true; bool snapshot_created_; bool release_supported_; std::mutex in_use_; // is managed iterator in use }; } // namespace rocksdb #endif // !ROCKSDB_LITE