mirror of
https://github.com/facebook/rocksdb.git
synced 2024-11-27 02:44:18 +00:00
7125e24619
Summary: If user do not end the trace manually, the tracing will continue which can potential use up all the storage space and cause problem. In this PR, the max trace file size is added to the TraceOptions and user can set the value if they need or the default is 64GB. Pull Request resolved: https://github.com/facebook/rocksdb/pull/4610 Differential Revision: D12893400 Pulled By: zhichao-cao fbshipit-source-id: acf4b5a6076bb691778bdfbac4864e1006758953
101 lines
2.4 KiB
C++
101 lines
2.4 KiB
C++
// 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
|
|
|
|
#include <memory>
|
|
#include <unordered_map>
|
|
#include <utility>
|
|
|
|
#include "rocksdb/env.h"
|
|
#include "rocksdb/options.h"
|
|
#include "rocksdb/trace_reader_writer.h"
|
|
|
|
namespace rocksdb {
|
|
|
|
class ColumnFamilyHandle;
|
|
class ColumnFamilyData;
|
|
class DB;
|
|
class DBImpl;
|
|
class Slice;
|
|
class WriteBatch;
|
|
|
|
extern const std::string kTraceMagic;
|
|
const unsigned int kTraceTimestampSize = 8;
|
|
const unsigned int kTraceTypeSize = 1;
|
|
const unsigned int kTracePayloadLengthSize = 4;
|
|
const unsigned int kTraceMetadataSize =
|
|
kTraceTimestampSize + kTraceTypeSize + kTracePayloadLengthSize;
|
|
|
|
enum TraceType : char {
|
|
kTraceBegin = 1,
|
|
kTraceEnd = 2,
|
|
kTraceWrite = 3,
|
|
kTraceGet = 4,
|
|
kTraceIteratorSeek = 5,
|
|
kTraceIteratorSeekForPrev = 6,
|
|
kTraceMax,
|
|
};
|
|
|
|
// TODO: This should also be made part of public interface to help users build
|
|
// custom TracerReaders and TraceWriters.
|
|
struct Trace {
|
|
uint64_t ts;
|
|
TraceType type;
|
|
std::string payload;
|
|
|
|
void reset() {
|
|
ts = 0;
|
|
type = kTraceMax;
|
|
payload.clear();
|
|
}
|
|
};
|
|
|
|
// Trace RocksDB operations using a TraceWriter.
|
|
class Tracer {
|
|
public:
|
|
Tracer(Env* env, const TraceOptions& trace_options,
|
|
std::unique_ptr<TraceWriter>&& trace_writer);
|
|
~Tracer();
|
|
|
|
Status Write(WriteBatch* write_batch);
|
|
Status Get(ColumnFamilyHandle* cfname, const Slice& key);
|
|
Status IteratorSeek(const uint32_t& cf_id, const Slice& key);
|
|
Status IteratorSeekForPrev(const uint32_t& cf_id, const Slice& key);
|
|
bool IsTraceFileOverMax();
|
|
|
|
Status Close();
|
|
|
|
private:
|
|
Status WriteHeader();
|
|
Status WriteFooter();
|
|
Status WriteTrace(const Trace& trace);
|
|
|
|
Env* env_;
|
|
TraceOptions trace_options_;
|
|
std::unique_ptr<TraceWriter> trace_writer_;
|
|
};
|
|
|
|
// Replay RocksDB operations from a trace.
|
|
class Replayer {
|
|
public:
|
|
Replayer(DB* db, const std::vector<ColumnFamilyHandle*>& handles,
|
|
std::unique_ptr<TraceReader>&& reader);
|
|
~Replayer();
|
|
|
|
Status Replay();
|
|
|
|
private:
|
|
Status ReadHeader(Trace* header);
|
|
Status ReadFooter(Trace* footer);
|
|
Status ReadTrace(Trace* trace);
|
|
|
|
DBImpl* db_;
|
|
std::unique_ptr<TraceReader> trace_reader_;
|
|
std::unordered_map<uint32_t, ColumnFamilyHandle*> cf_map_;
|
|
};
|
|
|
|
} // namespace rocksdb
|