debug.cc 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  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/utilities/debug.h"
  6. #include "db/db_impl/db_impl.h"
  7. #include "rocksdb/utilities/options_type.h"
  8. namespace ROCKSDB_NAMESPACE {
  9. static std::unordered_map<std::string, ValueType> value_type_string_map = {
  10. {"TypeDeletion", ValueType::kTypeDeletion},
  11. {"TypeValue", ValueType::kTypeValue},
  12. {"TypeMerge", ValueType::kTypeMerge},
  13. {"TypeLogData", ValueType::kTypeLogData},
  14. {"TypeColumnFamilyDeletion", ValueType::kTypeColumnFamilyDeletion},
  15. {"TypeColumnFamilyValue", ValueType::kTypeColumnFamilyValue},
  16. {"TypeColumnFamilyMerge", ValueType::kTypeColumnFamilyMerge},
  17. {"TypeSingleDeletion", ValueType::kTypeSingleDeletion},
  18. {"TypeColumnFamilySingleDeletion",
  19. ValueType::kTypeColumnFamilySingleDeletion},
  20. {"TypeBeginPrepareXID", ValueType::kTypeBeginPrepareXID},
  21. {"TypeEndPrepareXID", ValueType::kTypeEndPrepareXID},
  22. {"TypeCommitXID", ValueType::kTypeCommitXID},
  23. {"TypeRollbackXID", ValueType::kTypeRollbackXID},
  24. {"TypeNoop", ValueType::kTypeNoop},
  25. {"TypeColumnFamilyRangeDeletion",
  26. ValueType::kTypeColumnFamilyRangeDeletion},
  27. {"TypeRangeDeletion", ValueType::kTypeRangeDeletion},
  28. {"TypeColumnFamilyBlobIndex", ValueType::kTypeColumnFamilyBlobIndex},
  29. {"TypeBlobIndex", ValueType::kTypeBlobIndex},
  30. {"TypeBeginPersistedPrepareXID", ValueType::kTypeBeginPersistedPrepareXID},
  31. {"TypeBeginUnprepareXID", ValueType::kTypeBeginUnprepareXID},
  32. {"TypeDeletionWithTimestamp", ValueType::kTypeDeletionWithTimestamp},
  33. {"TypeCommitXIDAndTimestamp", ValueType::kTypeCommitXIDAndTimestamp},
  34. {"TypeWideColumnEntity", ValueType::kTypeWideColumnEntity},
  35. {"TypeColumnFamilyWideColumnEntity",
  36. ValueType::kTypeColumnFamilyWideColumnEntity},
  37. {"TypeValuePreferredSeqno", ValueType::kTypeValuePreferredSeqno},
  38. {"TypeColumnFamilyValuePreferredSeqno",
  39. ValueType::kTypeColumnFamilyValuePreferredSeqno},
  40. };
  41. std::string KeyVersion::GetTypeName() const {
  42. std::string type_name;
  43. if (SerializeEnum<ValueType>(value_type_string_map,
  44. static_cast<ValueType>(type), &type_name)) {
  45. return type_name;
  46. } else {
  47. return "Invalid";
  48. }
  49. }
  50. Status GetAllKeyVersions(DB* db, OptSlice begin_key, OptSlice end_key,
  51. size_t max_num_ikeys,
  52. std::vector<KeyVersion>* key_versions) {
  53. if (nullptr == db) {
  54. return Status::InvalidArgument("db cannot be null.");
  55. }
  56. return GetAllKeyVersions(db, db->DefaultColumnFamily(), begin_key, end_key,
  57. max_num_ikeys, key_versions);
  58. }
  59. Status GetAllKeyVersions(DB* db, ColumnFamilyHandle* cfh, OptSlice begin_key,
  60. OptSlice end_key, size_t max_num_ikeys,
  61. std::vector<KeyVersion>* key_versions) {
  62. if (nullptr == db) {
  63. return Status::InvalidArgument("db cannot be null.");
  64. }
  65. if (nullptr == cfh) {
  66. return Status::InvalidArgument("Column family handle cannot be null.");
  67. }
  68. if (nullptr == key_versions) {
  69. return Status::InvalidArgument("key_versions cannot be null.");
  70. }
  71. key_versions->clear();
  72. DBImpl* idb = static_cast<DBImpl*>(db->GetRootDB());
  73. auto icmp = InternalKeyComparator(idb->GetOptions(cfh).comparator);
  74. ReadOptions read_options;
  75. Arena arena;
  76. ScopedArenaPtr<InternalIterator> iter(
  77. idb->NewInternalIterator(read_options, &arena, kMaxSequenceNumber, cfh));
  78. const Comparator* ucmp = icmp.user_comparator();
  79. size_t ts_sz = ucmp->timestamp_size();
  80. std::string begin_key_buf, end_key_buf;
  81. auto [from, end] = MaybeAddTimestampsToRange(begin_key, end_key, ts_sz,
  82. &begin_key_buf, &end_key_buf);
  83. if (begin_key.has_value()) {
  84. assert(from.has_value());
  85. InternalKey ikey;
  86. ikey.SetMinPossibleForUserKey(from.value());
  87. iter->Seek(ikey.Encode());
  88. } else {
  89. iter->SeekToFirst();
  90. }
  91. size_t num_keys = 0;
  92. for (; iter->Valid(); iter->Next()) {
  93. ParsedInternalKey ikey;
  94. Status pik_status =
  95. ParseInternalKey(iter->key(), &ikey, true /* log_err_key */); // TODO
  96. if (!pik_status.ok()) {
  97. return pik_status;
  98. }
  99. if (end_key.has_value() && end.has_value() &&
  100. icmp.user_comparator()->Compare(ikey.user_key, end.value()) > 0) {
  101. break;
  102. }
  103. key_versions->emplace_back(ikey.user_key.ToString() /* _user_key */,
  104. iter->value().ToString() /* _value */,
  105. ikey.sequence /* _sequence */,
  106. static_cast<int>(ikey.type) /* _type */);
  107. if (++num_keys >= max_num_ikeys) {
  108. break;
  109. }
  110. }
  111. return Status::OK();
  112. }
  113. } // namespace ROCKSDB_NAMESPACE