Summary:
- Remove extra `;` in trace_record.h
- Remove some unnecessary `assert` in trace_record_handler.cc
- Initialize `env_` after` exec_handler_` in `ReplayerImpl` to let db be asserted in creating the handler before getting `db->GetEnv()`.
- Update history to include the new `TraceReader::Reset()`
Pull Request resolved: https://github.com/facebook/rocksdb/pull/8652
Reviewed By: ajkr
Differential Revision:
D30276872
Pulled By: autopear
fbshipit-source-id:
476ee162e0f241490c6209307448343a5b326b37
* Fast forward option in Trace replay changed to double type to allow replaying at a lower speed, by settings the value between 0 and 1. This option can be set via `ReplayOptions` in `Replayer::Replay()`, or via `--trace_replay_fast_forward` in db_bench.
## Public API change
-* Added APIs to decode and replay trace file via Replayer class. Added `DB::NewDefaultReplayer()` to create a default Replayer instance. Created trace_record.h and utilities/replayer.h files to access decoded Trace records and replay them.
+* Added APIs to decode and replay trace file via Replayer class. Added `DB::NewDefaultReplayer()` to create a default Replayer instance. Added `TraceReader::Reset()` to restart reading a trace file. Created trace_record.h and utilities/replayer.h files to access decoded Trace records and replay them.
### Performance Improvements
* Try to avoid updating DBOptions if `SetDBOptions()` does not change any option value.
virtual ~WriteQueryTraceRecord() override;
- TraceType GetTraceType() const override { return kTraceWrite; };
+ TraceType GetTraceType() const override { return kTraceWrite; }
virtual Slice GetWriteBatchRep() const;
virtual ~GetQueryTraceRecord() override;
- TraceType GetTraceType() const override { return kTraceGet; };
+ TraceType GetTraceType() const override { return kTraceGet; }
virtual uint32_t GetColumnFamilyID() const;
virtual ~MultiGetQueryTraceRecord() override;
- TraceType GetTraceType() const override { return kTraceMultiGet; };
+ TraceType GetTraceType() const override { return kTraceMultiGet; }
virtual std::vector<uint32_t> GetColumnFamilyIDs() const;
if (it == cf_map_.end()) {
return Status::Corruption("Invalid Column Family ID.");
}
- assert(it->second != nullptr);
std::string value;
Status s = db_->Get(read_opts_, it->second, record.GetKey(), &value);
if (it == cf_map_.end()) {
return Status::Corruption("Invalid Column Family ID.");
}
- assert(it->second != nullptr);
Iterator* single_iter = db_->NewIterator(read_opts_, it->second);
if (it == cf_map_.end()) {
return Status::Corruption("Invalid Column Family ID.");
}
- assert(it->second != nullptr);
handles.push_back(it->second);
}
const std::vector<ColumnFamilyHandle*>& handles,
std::unique_ptr<TraceReader>&& reader)
: Replayer(),
- env_(db->GetEnv()),
trace_reader_(std::move(reader)),
prepared_(false),
trace_end_(false),
header_ts_(0),
- exec_handler_(TraceRecord::NewExecutionHandler(db, handles)) {}
+ exec_handler_(TraceRecord::NewExecutionHandler(db, handles)),
+ env_(db->GetEnv()),
+ trace_file_version_(-1) {}
ReplayerImpl::~ReplayerImpl() {
exec_handler_.reset();
// Generic function to execute a Trace in a thread pool.
static void BackgroundWork(void* arg);
- Env* env_;
std::unique_ptr<TraceReader> trace_reader_;
- // When reading the trace header, the trace file version can be parsed.
- // Replayer will use different decode method to get the trace content based
- // on different trace file version.
- int trace_file_version_;
std::mutex mutex_;
std::atomic<bool> prepared_;
std::atomic<bool> trace_end_;
uint64_t header_ts_;
std::unique_ptr<TraceRecord::Handler> exec_handler_;
+ Env* env_;
+ // When reading the trace header, the trace file version can be parsed.
+ // Replayer will use different decode method to get the trace content based
+ // on different trace file version.
+ int trace_file_version_;
};
// The passin arg of MultiThreadRepkay for each trace record.