| // 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 <mutex> |
| #include <queue> |
| #include <string> |
| #include <vector> |
| |
| #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<Iterator> 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 |