2013-10-16 23:59:46 +02:00
|
|
|
// Copyright (c) 2013, Facebook, Inc. All rights reserved.
|
|
|
|
// This source code is licensed under the BSD-style license found in the
|
|
|
|
// LICENSE file in the root directory of this source tree. An additional grant
|
|
|
|
// of patent rights can be found in the PATENTS file in the same directory.
|
|
|
|
//
|
2013-10-05 07:32:05 +02:00
|
|
|
#pragma once
|
2012-11-30 02:28:37 +01:00
|
|
|
#include <vector>
|
|
|
|
|
2013-08-23 17:38:13 +02:00
|
|
|
#include "rocksdb/env.h"
|
|
|
|
#include "rocksdb/options.h"
|
|
|
|
#include "rocksdb/types.h"
|
|
|
|
#include "rocksdb/transaction_log.h"
|
2013-10-25 04:09:02 +02:00
|
|
|
#include "db/db_impl.h"
|
2012-11-30 02:28:37 +01:00
|
|
|
#include "db/log_reader.h"
|
2013-08-06 21:54:37 +02:00
|
|
|
#include "db/filename.h"
|
2012-11-30 02:28:37 +01:00
|
|
|
|
2013-10-04 06:49:15 +02:00
|
|
|
namespace rocksdb {
|
2012-11-30 02:28:37 +01:00
|
|
|
|
|
|
|
struct LogReporter : public log::Reader::Reporter {
|
|
|
|
Env* env;
|
|
|
|
Logger* info_log;
|
|
|
|
virtual void Corruption(size_t bytes, const Status& s) {
|
2013-04-29 22:19:24 +02:00
|
|
|
Log(info_log, "dropping %zu bytes; %s", bytes, s.ToString().c_str());
|
2012-11-30 02:28:37 +01:00
|
|
|
}
|
2013-10-21 04:06:19 +02:00
|
|
|
virtual void Info(const char* s) {
|
|
|
|
Log(info_log, "%s", s);
|
|
|
|
}
|
2012-11-30 02:28:37 +01:00
|
|
|
};
|
|
|
|
|
2013-08-06 21:54:37 +02:00
|
|
|
class LogFileImpl : public LogFile {
|
|
|
|
public:
|
|
|
|
LogFileImpl(uint64_t logNum, WalFileType logType, SequenceNumber startSeq,
|
|
|
|
uint64_t sizeBytes) :
|
|
|
|
logNumber_(logNum),
|
|
|
|
type_(logType),
|
|
|
|
startSequence_(startSeq),
|
|
|
|
sizeFileBytes_(sizeBytes) {
|
|
|
|
}
|
|
|
|
|
2013-08-29 23:30:52 +02:00
|
|
|
std::string PathName() const {
|
|
|
|
if (type_ == kArchivedLogFile) {
|
|
|
|
return ArchivedLogFileName("", logNumber_);
|
|
|
|
}
|
|
|
|
return LogFileName("", logNumber_);
|
|
|
|
}
|
2013-08-06 21:54:37 +02:00
|
|
|
|
|
|
|
uint64_t LogNumber() const { return logNumber_; }
|
|
|
|
|
|
|
|
WalFileType Type() const { return type_; }
|
|
|
|
|
|
|
|
SequenceNumber StartSequence() const { return startSequence_; }
|
|
|
|
|
|
|
|
uint64_t SizeFileBytes() const { return sizeFileBytes_; }
|
|
|
|
|
|
|
|
bool operator < (const LogFile& that) const {
|
|
|
|
return LogNumber() < that.LogNumber();
|
|
|
|
}
|
|
|
|
|
|
|
|
private:
|
|
|
|
uint64_t logNumber_;
|
|
|
|
WalFileType type_;
|
|
|
|
SequenceNumber startSequence_;
|
|
|
|
uint64_t sizeFileBytes_;
|
|
|
|
|
|
|
|
};
|
|
|
|
|
2012-11-30 02:28:37 +01:00
|
|
|
class TransactionLogIteratorImpl : public TransactionLogIterator {
|
|
|
|
public:
|
2013-10-01 23:46:52 +02:00
|
|
|
TransactionLogIteratorImpl(const std::string& dir,
|
2013-01-20 11:07:13 +01:00
|
|
|
const Options* options,
|
2013-06-08 00:35:17 +02:00
|
|
|
const EnvOptions& soptions,
|
2013-08-06 21:54:37 +02:00
|
|
|
const SequenceNumber seqNum,
|
|
|
|
std::unique_ptr<VectorLogPtr> files,
|
2013-10-25 04:09:02 +02:00
|
|
|
DBImpl const * const dbimpl);
|
2013-03-04 19:44:04 +01:00
|
|
|
|
2012-11-30 02:28:37 +01:00
|
|
|
virtual bool Valid();
|
|
|
|
|
|
|
|
virtual void Next();
|
|
|
|
|
|
|
|
virtual Status status();
|
|
|
|
|
2013-03-04 19:44:04 +01:00
|
|
|
virtual BatchResult GetBatch();
|
2012-11-30 02:28:37 +01:00
|
|
|
|
|
|
|
private:
|
2013-10-01 23:46:52 +02:00
|
|
|
const std::string& dir_;
|
2012-11-30 02:28:37 +01:00
|
|
|
const Options* options_;
|
2013-06-08 00:35:17 +02:00
|
|
|
const EnvOptions& soptions_;
|
2013-10-21 04:06:19 +02:00
|
|
|
SequenceNumber startingSequenceNumber_;
|
2013-08-06 21:54:37 +02:00
|
|
|
std::unique_ptr<VectorLogPtr> files_;
|
2012-11-30 02:28:37 +01:00
|
|
|
bool started_;
|
|
|
|
bool isValid_; // not valid when it starts of.
|
|
|
|
Status currentStatus_;
|
|
|
|
size_t currentFileIndex_;
|
2013-03-04 19:44:04 +01:00
|
|
|
std::unique_ptr<WriteBatch> currentBatch_;
|
2013-01-20 11:07:13 +01:00
|
|
|
unique_ptr<log::Reader> currentLogReader_;
|
2013-08-06 21:54:37 +02:00
|
|
|
Status OpenLogFile(const LogFile* logFile, unique_ptr<SequentialFile>* file);
|
2013-04-29 22:19:24 +02:00
|
|
|
LogReporter reporter_;
|
2013-10-14 00:28:24 +02:00
|
|
|
SequenceNumber currentBatchSeq_; // sequence number at start of current batch
|
2013-10-25 04:09:02 +02:00
|
|
|
SequenceNumber currentLastSeq_; // last sequence in the current batch
|
|
|
|
DBImpl const * const dbimpl_; // The db on whose log files this iterates
|
2013-10-14 00:28:24 +02:00
|
|
|
|
2013-10-21 04:06:19 +02:00
|
|
|
// Reads from transaction log only if the writebatch record has been written
|
|
|
|
bool RestrictedRead(Slice* record, std::string* scratch);
|
|
|
|
// Seeks to startingSequenceNumber reading from startFileIndex in files_.
|
|
|
|
// If strict is set,then must get a batch starting with startingSequenceNumber
|
|
|
|
void SeekToStartSequence(uint64_t startFileIndex = 0, bool strict = false);
|
2013-10-25 04:09:02 +02:00
|
|
|
// Implementation of Next. SeekToStartSequence calls it internally with
|
|
|
|
// internal=true to let it find next entry even if it has to jump gaps because
|
|
|
|
// the iterator may start off from the first available entry but promises to
|
|
|
|
// be continuous after that
|
|
|
|
void NextImpl(bool internal = false);
|
|
|
|
// Check if batch is expected, else return false
|
|
|
|
bool IsBatchExpected(const WriteBatch* batch, SequenceNumber expectedSeq);
|
2013-10-21 04:06:19 +02:00
|
|
|
// Update current batch if a continuous batch is found, else return false
|
2013-03-04 19:44:04 +01:00
|
|
|
void UpdateCurrentWriteBatch(const Slice& record);
|
2013-08-06 21:54:37 +02:00
|
|
|
Status OpenLogReader(const LogFile* file);
|
2012-11-30 02:28:37 +01:00
|
|
|
};
|
2013-10-04 06:49:15 +02:00
|
|
|
} // namespace rocksdb
|