debug.cc 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  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. #ifndef ROCKSDB_LITE
  6. #include "rocksdb/utilities/debug.h"
  7. #include "db/db_impl/db_impl.h"
  8. namespace ROCKSDB_NAMESPACE {
  9. Status GetAllKeyVersions(DB* db, Slice begin_key, Slice end_key,
  10. size_t max_num_ikeys,
  11. std::vector<KeyVersion>* key_versions) {
  12. if (nullptr == db) {
  13. return Status::InvalidArgument("db cannot be null.");
  14. }
  15. return GetAllKeyVersions(db, db->DefaultColumnFamily(), begin_key, end_key,
  16. max_num_ikeys, key_versions);
  17. }
  18. Status GetAllKeyVersions(DB* db, ColumnFamilyHandle* cfh, Slice begin_key,
  19. Slice end_key, size_t max_num_ikeys,
  20. std::vector<KeyVersion>* key_versions) {
  21. if (nullptr == db) {
  22. return Status::InvalidArgument("db cannot be null.");
  23. }
  24. if (nullptr == cfh) {
  25. return Status::InvalidArgument("Column family handle cannot be null.");
  26. }
  27. if (nullptr == key_versions) {
  28. return Status::InvalidArgument("key_versions cannot be null.");
  29. }
  30. key_versions->clear();
  31. DBImpl* idb = static_cast<DBImpl*>(db->GetRootDB());
  32. auto icmp = InternalKeyComparator(idb->GetOptions(cfh).comparator);
  33. ReadRangeDelAggregator range_del_agg(&icmp,
  34. kMaxSequenceNumber /* upper_bound */);
  35. Arena arena;
  36. ScopedArenaIterator iter(idb->NewInternalIterator(&arena, &range_del_agg,
  37. kMaxSequenceNumber, cfh));
  38. if (!begin_key.empty()) {
  39. InternalKey ikey;
  40. ikey.SetMinPossibleForUserKey(begin_key);
  41. iter->Seek(ikey.Encode());
  42. } else {
  43. iter->SeekToFirst();
  44. }
  45. size_t num_keys = 0;
  46. for (; iter->Valid(); iter->Next()) {
  47. ParsedInternalKey ikey;
  48. if (!ParseInternalKey(iter->key(), &ikey)) {
  49. return Status::Corruption("Internal Key [" + iter->key().ToString() +
  50. "] parse error!");
  51. }
  52. if (!end_key.empty() &&
  53. icmp.user_comparator()->Compare(ikey.user_key, end_key) > 0) {
  54. break;
  55. }
  56. key_versions->emplace_back(ikey.user_key.ToString() /* _user_key */,
  57. iter->value().ToString() /* _value */,
  58. ikey.sequence /* _sequence */,
  59. static_cast<int>(ikey.type) /* _type */);
  60. if (++num_keys >= max_num_ikeys) {
  61. break;
  62. }
  63. }
  64. return Status::OK();
  65. }
  66. } // namespace ROCKSDB_NAMESPACE
  67. #endif // ROCKSDB_LITE