trace_record.cc 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. // Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
  2. // This source code is licensed under both the GPLv2 (found in the
  3. // COPYING file in the root directory) and Apache 2.0 License
  4. // (found in the LICENSE.Apache file in the root directory).
  5. #include "rocksdb/trace_record.h"
  6. #include <utility>
  7. #include "rocksdb/db.h"
  8. #include "rocksdb/iterator.h"
  9. #include "rocksdb/options.h"
  10. #include "rocksdb/status.h"
  11. #include "rocksdb/trace_record_result.h"
  12. #include "trace_replay/trace_record_handler.h"
  13. namespace ROCKSDB_NAMESPACE {
  14. // TraceRecord
  15. TraceRecord::TraceRecord(uint64_t timestamp) : timestamp_(timestamp) {}
  16. uint64_t TraceRecord::GetTimestamp() const { return timestamp_; }
  17. TraceRecord::Handler* TraceRecord::NewExecutionHandler(
  18. DB* db, const std::vector<ColumnFamilyHandle*>& handles) {
  19. return new TraceExecutionHandler(db, handles);
  20. }
  21. // QueryTraceRecord
  22. QueryTraceRecord::QueryTraceRecord(uint64_t timestamp)
  23. : TraceRecord(timestamp) {}
  24. // WriteQueryTraceRecord
  25. WriteQueryTraceRecord::WriteQueryTraceRecord(PinnableSlice&& write_batch_rep,
  26. uint64_t timestamp)
  27. : QueryTraceRecord(timestamp), rep_(std::move(write_batch_rep)) {}
  28. WriteQueryTraceRecord::WriteQueryTraceRecord(const std::string& write_batch_rep,
  29. uint64_t timestamp)
  30. : QueryTraceRecord(timestamp) {
  31. rep_.PinSelf(write_batch_rep);
  32. }
  33. WriteQueryTraceRecord::~WriteQueryTraceRecord() { rep_.clear(); }
  34. Slice WriteQueryTraceRecord::GetWriteBatchRep() const { return Slice(rep_); }
  35. Status WriteQueryTraceRecord::Accept(
  36. Handler* handler, std::unique_ptr<TraceRecordResult>* result) {
  37. assert(handler != nullptr);
  38. return handler->Handle(*this, result);
  39. }
  40. // GetQueryTraceRecord
  41. GetQueryTraceRecord::GetQueryTraceRecord(uint32_t column_family_id,
  42. PinnableSlice&& key,
  43. uint64_t timestamp)
  44. : QueryTraceRecord(timestamp),
  45. cf_id_(column_family_id),
  46. key_(std::move(key)) {}
  47. GetQueryTraceRecord::GetQueryTraceRecord(uint32_t column_family_id,
  48. const std::string& key,
  49. uint64_t timestamp)
  50. : QueryTraceRecord(timestamp), cf_id_(column_family_id) {
  51. key_.PinSelf(key);
  52. }
  53. GetQueryTraceRecord::~GetQueryTraceRecord() { key_.clear(); }
  54. uint32_t GetQueryTraceRecord::GetColumnFamilyID() const { return cf_id_; }
  55. Slice GetQueryTraceRecord::GetKey() const { return Slice(key_); }
  56. Status GetQueryTraceRecord::Accept(Handler* handler,
  57. std::unique_ptr<TraceRecordResult>* result) {
  58. assert(handler != nullptr);
  59. return handler->Handle(*this, result);
  60. }
  61. // IteratorQueryTraceRecord
  62. IteratorQueryTraceRecord::IteratorQueryTraceRecord(uint64_t timestamp)
  63. : QueryTraceRecord(timestamp) {}
  64. IteratorQueryTraceRecord::IteratorQueryTraceRecord(PinnableSlice&& lower_bound,
  65. PinnableSlice&& upper_bound,
  66. uint64_t timestamp)
  67. : QueryTraceRecord(timestamp),
  68. lower_(std::move(lower_bound)),
  69. upper_(std::move(upper_bound)) {}
  70. IteratorQueryTraceRecord::IteratorQueryTraceRecord(
  71. const std::string& lower_bound, const std::string& upper_bound,
  72. uint64_t timestamp)
  73. : QueryTraceRecord(timestamp) {
  74. lower_.PinSelf(lower_bound);
  75. upper_.PinSelf(upper_bound);
  76. }
  77. IteratorQueryTraceRecord::~IteratorQueryTraceRecord() = default;
  78. Slice IteratorQueryTraceRecord::GetLowerBound() const { return Slice(lower_); }
  79. Slice IteratorQueryTraceRecord::GetUpperBound() const { return Slice(upper_); }
  80. // IteratorSeekQueryTraceRecord
  81. IteratorSeekQueryTraceRecord::IteratorSeekQueryTraceRecord(
  82. SeekType seek_type, uint32_t column_family_id, PinnableSlice&& key,
  83. uint64_t timestamp)
  84. : IteratorQueryTraceRecord(timestamp),
  85. type_(seek_type),
  86. cf_id_(column_family_id),
  87. key_(std::move(key)) {}
  88. IteratorSeekQueryTraceRecord::IteratorSeekQueryTraceRecord(
  89. SeekType seek_type, uint32_t column_family_id, const std::string& key,
  90. uint64_t timestamp)
  91. : IteratorQueryTraceRecord(timestamp),
  92. type_(seek_type),
  93. cf_id_(column_family_id) {
  94. key_.PinSelf(key);
  95. }
  96. IteratorSeekQueryTraceRecord::IteratorSeekQueryTraceRecord(
  97. SeekType seek_type, uint32_t column_family_id, PinnableSlice&& key,
  98. PinnableSlice&& lower_bound, PinnableSlice&& upper_bound,
  99. uint64_t timestamp)
  100. : IteratorQueryTraceRecord(std::move(lower_bound), std::move(upper_bound),
  101. timestamp),
  102. type_(seek_type),
  103. cf_id_(column_family_id),
  104. key_(std::move(key)) {}
  105. IteratorSeekQueryTraceRecord::IteratorSeekQueryTraceRecord(
  106. SeekType seek_type, uint32_t column_family_id, const std::string& key,
  107. const std::string& lower_bound, const std::string& upper_bound,
  108. uint64_t timestamp)
  109. : IteratorQueryTraceRecord(lower_bound, upper_bound, timestamp),
  110. type_(seek_type),
  111. cf_id_(column_family_id) {
  112. key_.PinSelf(key);
  113. }
  114. IteratorSeekQueryTraceRecord::~IteratorSeekQueryTraceRecord() { key_.clear(); }
  115. TraceType IteratorSeekQueryTraceRecord::GetTraceType() const {
  116. return static_cast<TraceType>(type_);
  117. }
  118. IteratorSeekQueryTraceRecord::SeekType
  119. IteratorSeekQueryTraceRecord::GetSeekType() const {
  120. return type_;
  121. }
  122. uint32_t IteratorSeekQueryTraceRecord::GetColumnFamilyID() const {
  123. return cf_id_;
  124. }
  125. Slice IteratorSeekQueryTraceRecord::GetKey() const { return Slice(key_); }
  126. Status IteratorSeekQueryTraceRecord::Accept(
  127. Handler* handler, std::unique_ptr<TraceRecordResult>* result) {
  128. assert(handler != nullptr);
  129. return handler->Handle(*this, result);
  130. }
  131. // MultiGetQueryTraceRecord
  132. MultiGetQueryTraceRecord::MultiGetQueryTraceRecord(
  133. std::vector<uint32_t> column_family_ids, std::vector<PinnableSlice>&& keys,
  134. uint64_t timestamp)
  135. : QueryTraceRecord(timestamp),
  136. cf_ids_(column_family_ids),
  137. keys_(std::move(keys)) {}
  138. MultiGetQueryTraceRecord::MultiGetQueryTraceRecord(
  139. std::vector<uint32_t> column_family_ids,
  140. const std::vector<std::string>& keys, uint64_t timestamp)
  141. : QueryTraceRecord(timestamp), cf_ids_(column_family_ids) {
  142. keys_.reserve(keys.size());
  143. for (const std::string& key : keys) {
  144. PinnableSlice ps;
  145. ps.PinSelf(key);
  146. keys_.push_back(std::move(ps));
  147. }
  148. }
  149. MultiGetQueryTraceRecord::~MultiGetQueryTraceRecord() {
  150. cf_ids_.clear();
  151. keys_.clear();
  152. }
  153. std::vector<uint32_t> MultiGetQueryTraceRecord::GetColumnFamilyIDs() const {
  154. return cf_ids_;
  155. }
  156. std::vector<Slice> MultiGetQueryTraceRecord::GetKeys() const {
  157. return std::vector<Slice>(keys_.begin(), keys_.end());
  158. }
  159. Status MultiGetQueryTraceRecord::Accept(
  160. Handler* handler, std::unique_ptr<TraceRecordResult>* result) {
  161. assert(handler != nullptr);
  162. return handler->Handle(*this, result);
  163. }
  164. } // namespace ROCKSDB_NAMESPACE