// 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). #ifndef STORAGE_ROCKSDB_INCLUDE_TRANSACTION_LOG_ITERATOR_H_ #define STORAGE_ROCKSDB_INCLUDE_TRANSACTION_LOG_ITERATOR_H_ #include "rocksdb/status.h" #include "rocksdb/types.h" #include "rocksdb/write_batch.h" #include #include namespace rocksdb { class LogFile; typedef std::vector> VectorLogPtr; enum WalFileType { /* Indicates that WAL file is in archive directory. WAL files are moved from * the main db directory to archive directory once they are not live and stay * there until cleaned up. Files are cleaned depending on archive size * (Options::WAL_size_limit_MB) and time since last cleaning * (Options::WAL_ttl_seconds). */ kArchivedLogFile = 0, /* Indicates that WAL file is live and resides in the main db directory */ kAliveLogFile = 1 } ; class LogFile { public: LogFile() {} virtual ~LogFile() {} // Returns log file's pathname relative to the main db dir // Eg. For a live-log-file = /000003.log // For an archived-log-file = /archive/000003.log virtual std::string PathName() const = 0; // Primary identifier for log file. // This is directly proportional to creation time of the log file virtual uint64_t LogNumber() const = 0; // Log file can be either alive or archived virtual WalFileType Type() const = 0; // Starting sequence number of writebatch written in this log file virtual SequenceNumber StartSequence() const = 0; // Size of log file on disk in Bytes virtual uint64_t SizeFileBytes() const = 0; }; struct BatchResult { SequenceNumber sequence = 0; std::unique_ptr writeBatchPtr; // Add empty __ctor and __dtor for the rule of five // However, preserve the original semantics and prohibit copying // as the unique_ptr member does not copy. BatchResult() {} ~BatchResult() {} BatchResult(const BatchResult&) = delete; BatchResult& operator=(const BatchResult&) = delete; BatchResult(BatchResult&& bResult) : sequence(std::move(bResult.sequence)), writeBatchPtr(std::move(bResult.writeBatchPtr)) {} BatchResult& operator=(BatchResult&& bResult) { sequence = std::move(bResult.sequence); writeBatchPtr = std::move(bResult.writeBatchPtr); return *this; } }; // A TransactionLogIterator is used to iterate over the transactions in a db. // One run of the iterator is continuous, i.e. the iterator will stop at the // beginning of any gap in sequences class TransactionLogIterator { public: TransactionLogIterator() {} virtual ~TransactionLogIterator() {} // An iterator is either positioned at a WriteBatch or not valid. // This method returns true if the iterator is valid. // Can read data from a valid iterator. virtual bool Valid() = 0; // Moves the iterator to the next WriteBatch. // REQUIRES: Valid() to be true. virtual void Next() = 0; // Returns ok if the iterator is valid. // Returns the Error when something has gone wrong. virtual Status status() = 0; // If valid return's the current write_batch and the sequence number of the // earliest transaction contained in the batch. // ONLY use if Valid() is true and status() is OK. virtual BatchResult GetBatch() = 0; // The read options for TransactionLogIterator. struct ReadOptions { // If true, all data read from underlying storage will be // verified against corresponding checksums. // Default: true bool verify_checksums_; ReadOptions() : verify_checksums_(true) {} explicit ReadOptions(bool verify_checksums) : verify_checksums_(verify_checksums) {} }; }; } // namespace rocksdb #endif // STORAGE_ROCKSDB_INCLUDE_TRANSACTION_LOG_ITERATOR_H_