d68880a1b9
Summary: Store the last flushed, seq no. in db_impl. Check against it in transaction Log iterator. Do not attempt to read ahead if we do not know if the data is flushed completely. Does not work if flush is disabled. Any ideas on fixing that? * Minor change, iter->Next is called the first time automatically for * the first time. Test Plan: existing test pass. More ideas on testing this? Planning to run some stress test. Reviewers: dhruba, heyongqiang CC: leveldb Differential Revision: https://reviews.facebook.net/D9087
71 lines
2.0 KiB
C++
71 lines
2.0 KiB
C++
// Copyright 2008-present Facebook. All Rights Reserved.
|
|
#ifndef STORAGE_LEVELDB_INCLUDE_WRITES_ITERATOR_IMPL_H_
|
|
#define STORAGE_LEVELDB_INCLUDE_WRITES_ITERATOR_IMPL_H_
|
|
|
|
#include <vector>
|
|
|
|
#include "leveldb/env.h"
|
|
#include "leveldb/options.h"
|
|
#include "leveldb/types.h"
|
|
#include "leveldb/transaction_log_iterator.h"
|
|
#include "db/log_file.h"
|
|
#include "db/log_reader.h"
|
|
|
|
namespace leveldb {
|
|
|
|
struct LogReporter : public log::Reader::Reporter {
|
|
Env* env;
|
|
Logger* info_log;
|
|
uint64_t log_number;
|
|
virtual void Corruption(size_t bytes, const Status& s) {
|
|
Log(info_log, "%ld: dropping %d bytes; %s",
|
|
log_number, static_cast<int>(bytes), s.ToString().c_str());
|
|
}
|
|
};
|
|
|
|
class TransactionLogIteratorImpl : public TransactionLogIterator {
|
|
public:
|
|
TransactionLogIteratorImpl(const std::string& dbname,
|
|
const Options* options,
|
|
SequenceNumber& seqNum,
|
|
std::vector<LogFile>* files,
|
|
SequenceNumber const * const lastFlushedSequence);
|
|
|
|
virtual ~TransactionLogIteratorImpl() {
|
|
// TODO move to cc file.
|
|
delete files_;
|
|
}
|
|
|
|
virtual bool Valid();
|
|
|
|
virtual void Next();
|
|
|
|
virtual Status status();
|
|
|
|
virtual BatchResult GetBatch();
|
|
|
|
private:
|
|
const std::string& dbname_;
|
|
const Options* options_;
|
|
const uint64_t sequenceNumber_;
|
|
const std::vector<LogFile>* files_;
|
|
bool started_;
|
|
bool isValid_; // not valid when it starts of.
|
|
Status currentStatus_;
|
|
size_t currentFileIndex_;
|
|
std::unique_ptr<WriteBatch> currentBatch_;
|
|
unique_ptr<log::Reader> currentLogReader_;
|
|
Status OpenLogFile(const LogFile& logFile, unique_ptr<SequentialFile>* file);
|
|
LogReporter NewLogReporter(uint64_t logNumber);
|
|
SequenceNumber const * const lastFlushedSequence_;
|
|
// represents the sequence number being read currently.
|
|
SequenceNumber currentSequence_;
|
|
|
|
void UpdateCurrentWriteBatch(const Slice& record);
|
|
};
|
|
|
|
|
|
|
|
} // namespace leveldb
|
|
#endif // STORAGE_LEVELDB_INCLUDE_WRITES_ITERATOR_IMPL_H_
|