version_builder_test.cc 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349
  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 <string>
  6. #include "db/version_edit.h"
  7. #include "db/version_set.h"
  8. #include "logging/logging.h"
  9. #include "test_util/testharness.h"
  10. #include "test_util/testutil.h"
  11. #include "util/string_util.h"
  12. namespace ROCKSDB_NAMESPACE {
  13. class VersionBuilderTest : public testing::Test {
  14. public:
  15. const Comparator* ucmp_;
  16. InternalKeyComparator icmp_;
  17. Options options_;
  18. ImmutableCFOptions ioptions_;
  19. MutableCFOptions mutable_cf_options_;
  20. VersionStorageInfo vstorage_;
  21. uint32_t file_num_;
  22. CompactionOptionsFIFO fifo_options_;
  23. std::vector<uint64_t> size_being_compacted_;
  24. VersionBuilderTest()
  25. : ucmp_(BytewiseComparator()),
  26. icmp_(ucmp_),
  27. ioptions_(options_),
  28. mutable_cf_options_(options_),
  29. vstorage_(&icmp_, ucmp_, options_.num_levels, kCompactionStyleLevel,
  30. nullptr, false),
  31. file_num_(1) {
  32. mutable_cf_options_.RefreshDerivedOptions(ioptions_);
  33. size_being_compacted_.resize(options_.num_levels);
  34. }
  35. ~VersionBuilderTest() override {
  36. for (int i = 0; i < vstorage_.num_levels(); i++) {
  37. for (auto* f : vstorage_.LevelFiles(i)) {
  38. if (--f->refs == 0) {
  39. delete f;
  40. }
  41. }
  42. }
  43. }
  44. InternalKey GetInternalKey(const char* ukey,
  45. SequenceNumber smallest_seq = 100) {
  46. return InternalKey(ukey, smallest_seq, kTypeValue);
  47. }
  48. void Add(int level, uint32_t file_number, const char* smallest,
  49. const char* largest, uint64_t file_size = 0, uint32_t path_id = 0,
  50. SequenceNumber smallest_seq = 100, SequenceNumber largest_seq = 100,
  51. uint64_t num_entries = 0, uint64_t num_deletions = 0,
  52. bool sampled = false, SequenceNumber smallest_seqno = 0,
  53. SequenceNumber largest_seqno = 0) {
  54. assert(level < vstorage_.num_levels());
  55. FileMetaData* f = new FileMetaData(
  56. file_number, path_id, file_size, GetInternalKey(smallest, smallest_seq),
  57. GetInternalKey(largest, largest_seq), smallest_seqno, largest_seqno,
  58. /* marked_for_compact */ false, kInvalidBlobFileNumber,
  59. kUnknownOldestAncesterTime, kUnknownFileCreationTime,
  60. kUnknownFileChecksum, kUnknownFileChecksumFuncName);
  61. f->compensated_file_size = file_size;
  62. f->num_entries = num_entries;
  63. f->num_deletions = num_deletions;
  64. vstorage_.AddFile(level, f);
  65. if (sampled) {
  66. f->init_stats_from_file = true;
  67. vstorage_.UpdateAccumulatedStats(f);
  68. }
  69. }
  70. void UpdateVersionStorageInfo() {
  71. vstorage_.UpdateFilesByCompactionPri(ioptions_.compaction_pri);
  72. vstorage_.UpdateNumNonEmptyLevels();
  73. vstorage_.GenerateFileIndexer();
  74. vstorage_.GenerateLevelFilesBrief();
  75. vstorage_.CalculateBaseBytes(ioptions_, mutable_cf_options_);
  76. vstorage_.GenerateLevel0NonOverlapping();
  77. vstorage_.SetFinalized();
  78. }
  79. };
  80. void UnrefFilesInVersion(VersionStorageInfo* new_vstorage) {
  81. for (int i = 0; i < new_vstorage->num_levels(); i++) {
  82. for (auto* f : new_vstorage->LevelFiles(i)) {
  83. if (--f->refs == 0) {
  84. delete f;
  85. }
  86. }
  87. }
  88. }
  89. TEST_F(VersionBuilderTest, ApplyAndSaveTo) {
  90. Add(0, 1U, "150", "200", 100U);
  91. Add(1, 66U, "150", "200", 100U);
  92. Add(1, 88U, "201", "300", 100U);
  93. Add(2, 6U, "150", "179", 100U);
  94. Add(2, 7U, "180", "220", 100U);
  95. Add(2, 8U, "221", "300", 100U);
  96. Add(3, 26U, "150", "170", 100U);
  97. Add(3, 27U, "171", "179", 100U);
  98. Add(3, 28U, "191", "220", 100U);
  99. Add(3, 29U, "221", "300", 100U);
  100. UpdateVersionStorageInfo();
  101. VersionEdit version_edit;
  102. version_edit.AddFile(2, 666, 0, 100U, GetInternalKey("301"),
  103. GetInternalKey("350"), 200, 200, false,
  104. kInvalidBlobFileNumber, kUnknownOldestAncesterTime,
  105. kUnknownFileCreationTime, kUnknownFileChecksum,
  106. kUnknownFileChecksumFuncName);
  107. version_edit.DeleteFile(3, 27U);
  108. EnvOptions env_options;
  109. VersionBuilder version_builder(env_options, nullptr, &vstorage_);
  110. VersionStorageInfo new_vstorage(&icmp_, ucmp_, options_.num_levels,
  111. kCompactionStyleLevel, nullptr, false);
  112. version_builder.Apply(&version_edit);
  113. version_builder.SaveTo(&new_vstorage);
  114. ASSERT_EQ(400U, new_vstorage.NumLevelBytes(2));
  115. ASSERT_EQ(300U, new_vstorage.NumLevelBytes(3));
  116. UnrefFilesInVersion(&new_vstorage);
  117. }
  118. TEST_F(VersionBuilderTest, ApplyAndSaveToDynamic) {
  119. ioptions_.level_compaction_dynamic_level_bytes = true;
  120. Add(0, 1U, "150", "200", 100U, 0, 200U, 200U, 0, 0, false, 200U, 200U);
  121. Add(0, 88U, "201", "300", 100U, 0, 100U, 100U, 0, 0, false, 100U, 100U);
  122. Add(4, 6U, "150", "179", 100U);
  123. Add(4, 7U, "180", "220", 100U);
  124. Add(4, 8U, "221", "300", 100U);
  125. Add(5, 26U, "150", "170", 100U);
  126. Add(5, 27U, "171", "179", 100U);
  127. UpdateVersionStorageInfo();
  128. VersionEdit version_edit;
  129. version_edit.AddFile(3, 666, 0, 100U, GetInternalKey("301"),
  130. GetInternalKey("350"), 200, 200, false,
  131. kInvalidBlobFileNumber, kUnknownOldestAncesterTime,
  132. kUnknownFileCreationTime, kUnknownFileChecksum,
  133. kUnknownFileChecksumFuncName);
  134. version_edit.DeleteFile(0, 1U);
  135. version_edit.DeleteFile(0, 88U);
  136. EnvOptions env_options;
  137. VersionBuilder version_builder(env_options, nullptr, &vstorage_);
  138. VersionStorageInfo new_vstorage(&icmp_, ucmp_, options_.num_levels,
  139. kCompactionStyleLevel, nullptr, false);
  140. version_builder.Apply(&version_edit);
  141. version_builder.SaveTo(&new_vstorage);
  142. ASSERT_EQ(0U, new_vstorage.NumLevelBytes(0));
  143. ASSERT_EQ(100U, new_vstorage.NumLevelBytes(3));
  144. ASSERT_EQ(300U, new_vstorage.NumLevelBytes(4));
  145. ASSERT_EQ(200U, new_vstorage.NumLevelBytes(5));
  146. UnrefFilesInVersion(&new_vstorage);
  147. }
  148. TEST_F(VersionBuilderTest, ApplyAndSaveToDynamic2) {
  149. ioptions_.level_compaction_dynamic_level_bytes = true;
  150. Add(0, 1U, "150", "200", 100U, 0, 200U, 200U, 0, 0, false, 200U, 200U);
  151. Add(0, 88U, "201", "300", 100U, 0, 100U, 100U, 0, 0, false, 100U, 100U);
  152. Add(4, 6U, "150", "179", 100U);
  153. Add(4, 7U, "180", "220", 100U);
  154. Add(4, 8U, "221", "300", 100U);
  155. Add(5, 26U, "150", "170", 100U);
  156. Add(5, 27U, "171", "179", 100U);
  157. UpdateVersionStorageInfo();
  158. VersionEdit version_edit;
  159. version_edit.AddFile(4, 666, 0, 100U, GetInternalKey("301"),
  160. GetInternalKey("350"), 200, 200, false,
  161. kInvalidBlobFileNumber, kUnknownOldestAncesterTime,
  162. kUnknownFileCreationTime, kUnknownFileChecksum,
  163. kUnknownFileChecksumFuncName);
  164. version_edit.DeleteFile(0, 1U);
  165. version_edit.DeleteFile(0, 88U);
  166. version_edit.DeleteFile(4, 6U);
  167. version_edit.DeleteFile(4, 7U);
  168. version_edit.DeleteFile(4, 8U);
  169. EnvOptions env_options;
  170. VersionBuilder version_builder(env_options, nullptr, &vstorage_);
  171. VersionStorageInfo new_vstorage(&icmp_, ucmp_, options_.num_levels,
  172. kCompactionStyleLevel, nullptr, false);
  173. version_builder.Apply(&version_edit);
  174. version_builder.SaveTo(&new_vstorage);
  175. ASSERT_EQ(0U, new_vstorage.NumLevelBytes(0));
  176. ASSERT_EQ(100U, new_vstorage.NumLevelBytes(4));
  177. ASSERT_EQ(200U, new_vstorage.NumLevelBytes(5));
  178. UnrefFilesInVersion(&new_vstorage);
  179. }
  180. TEST_F(VersionBuilderTest, ApplyMultipleAndSaveTo) {
  181. UpdateVersionStorageInfo();
  182. VersionEdit version_edit;
  183. version_edit.AddFile(2, 666, 0, 100U, GetInternalKey("301"),
  184. GetInternalKey("350"), 200, 200, false,
  185. kInvalidBlobFileNumber, kUnknownOldestAncesterTime,
  186. kUnknownFileCreationTime, kUnknownFileChecksum,
  187. kUnknownFileChecksumFuncName);
  188. version_edit.AddFile(2, 676, 0, 100U, GetInternalKey("401"),
  189. GetInternalKey("450"), 200, 200, false,
  190. kInvalidBlobFileNumber, kUnknownOldestAncesterTime,
  191. kUnknownFileCreationTime, kUnknownFileChecksum,
  192. kUnknownFileChecksumFuncName);
  193. version_edit.AddFile(2, 636, 0, 100U, GetInternalKey("601"),
  194. GetInternalKey("650"), 200, 200, false,
  195. kInvalidBlobFileNumber, kUnknownOldestAncesterTime,
  196. kUnknownFileCreationTime, kUnknownFileChecksum,
  197. kUnknownFileChecksumFuncName);
  198. version_edit.AddFile(2, 616, 0, 100U, GetInternalKey("501"),
  199. GetInternalKey("550"), 200, 200, false,
  200. kInvalidBlobFileNumber, kUnknownOldestAncesterTime,
  201. kUnknownFileCreationTime, kUnknownFileChecksum,
  202. kUnknownFileChecksumFuncName);
  203. version_edit.AddFile(2, 606, 0, 100U, GetInternalKey("701"),
  204. GetInternalKey("750"), 200, 200, false,
  205. kInvalidBlobFileNumber, kUnknownOldestAncesterTime,
  206. kUnknownFileCreationTime, kUnknownFileChecksum,
  207. kUnknownFileChecksumFuncName);
  208. EnvOptions env_options;
  209. VersionBuilder version_builder(env_options, nullptr, &vstorage_);
  210. VersionStorageInfo new_vstorage(&icmp_, ucmp_, options_.num_levels,
  211. kCompactionStyleLevel, nullptr, false);
  212. version_builder.Apply(&version_edit);
  213. version_builder.SaveTo(&new_vstorage);
  214. ASSERT_EQ(500U, new_vstorage.NumLevelBytes(2));
  215. UnrefFilesInVersion(&new_vstorage);
  216. }
  217. TEST_F(VersionBuilderTest, ApplyDeleteAndSaveTo) {
  218. UpdateVersionStorageInfo();
  219. EnvOptions env_options;
  220. VersionBuilder version_builder(env_options, nullptr, &vstorage_);
  221. VersionStorageInfo new_vstorage(&icmp_, ucmp_, options_.num_levels,
  222. kCompactionStyleLevel, nullptr, false);
  223. VersionEdit version_edit;
  224. version_edit.AddFile(2, 666, 0, 100U, GetInternalKey("301"),
  225. GetInternalKey("350"), 200, 200, false,
  226. kInvalidBlobFileNumber, kUnknownOldestAncesterTime,
  227. kUnknownFileCreationTime, kUnknownFileChecksum,
  228. kUnknownFileChecksumFuncName);
  229. version_edit.AddFile(2, 676, 0, 100U, GetInternalKey("401"),
  230. GetInternalKey("450"), 200, 200, false,
  231. kInvalidBlobFileNumber, kUnknownOldestAncesterTime,
  232. kUnknownFileCreationTime, kUnknownFileChecksum,
  233. kUnknownFileChecksumFuncName);
  234. version_edit.AddFile(2, 636, 0, 100U, GetInternalKey("601"),
  235. GetInternalKey("650"), 200, 200, false,
  236. kInvalidBlobFileNumber, kUnknownOldestAncesterTime,
  237. kUnknownFileCreationTime, kUnknownFileChecksum,
  238. kUnknownFileChecksumFuncName);
  239. version_edit.AddFile(2, 616, 0, 100U, GetInternalKey("501"),
  240. GetInternalKey("550"), 200, 200, false,
  241. kInvalidBlobFileNumber, kUnknownOldestAncesterTime,
  242. kUnknownFileCreationTime, kUnknownFileChecksum,
  243. kUnknownFileChecksumFuncName);
  244. version_edit.AddFile(2, 606, 0, 100U, GetInternalKey("701"),
  245. GetInternalKey("750"), 200, 200, false,
  246. kInvalidBlobFileNumber, kUnknownOldestAncesterTime,
  247. kUnknownFileCreationTime, kUnknownFileChecksum,
  248. kUnknownFileChecksumFuncName);
  249. version_builder.Apply(&version_edit);
  250. VersionEdit version_edit2;
  251. version_edit.AddFile(2, 808, 0, 100U, GetInternalKey("901"),
  252. GetInternalKey("950"), 200, 200, false,
  253. kInvalidBlobFileNumber, kUnknownOldestAncesterTime,
  254. kUnknownFileCreationTime, kUnknownFileChecksum,
  255. kUnknownFileChecksumFuncName);
  256. version_edit2.DeleteFile(2, 616);
  257. version_edit2.DeleteFile(2, 636);
  258. version_edit.AddFile(2, 806, 0, 100U, GetInternalKey("801"),
  259. GetInternalKey("850"), 200, 200, false,
  260. kInvalidBlobFileNumber, kUnknownOldestAncesterTime,
  261. kUnknownFileCreationTime, kUnknownFileChecksum,
  262. kUnknownFileChecksumFuncName);
  263. version_builder.Apply(&version_edit2);
  264. version_builder.SaveTo(&new_vstorage);
  265. ASSERT_EQ(300U, new_vstorage.NumLevelBytes(2));
  266. UnrefFilesInVersion(&new_vstorage);
  267. }
  268. TEST_F(VersionBuilderTest, EstimatedActiveKeys) {
  269. const uint32_t kTotalSamples = 20;
  270. const uint32_t kNumLevels = 5;
  271. const uint32_t kFilesPerLevel = 8;
  272. const uint32_t kNumFiles = kNumLevels * kFilesPerLevel;
  273. const uint32_t kEntriesPerFile = 1000;
  274. const uint32_t kDeletionsPerFile = 100;
  275. for (uint32_t i = 0; i < kNumFiles; ++i) {
  276. Add(static_cast<int>(i / kFilesPerLevel), i + 1,
  277. ToString((i + 100) * 1000).c_str(),
  278. ToString((i + 100) * 1000 + 999).c_str(),
  279. 100U, 0, 100, 100,
  280. kEntriesPerFile, kDeletionsPerFile,
  281. (i < kTotalSamples));
  282. }
  283. // minus 2X for the number of deletion entries because:
  284. // 1x for deletion entry does not count as a data entry.
  285. // 1x for each deletion entry will actually remove one data entry.
  286. ASSERT_EQ(vstorage_.GetEstimatedActiveKeys(),
  287. (kEntriesPerFile - 2 * kDeletionsPerFile) * kNumFiles);
  288. }
  289. } // namespace ROCKSDB_NAMESPACE
  290. int main(int argc, char** argv) {
  291. ::testing::InitGoogleTest(&argc, argv);
  292. return RUN_ALL_TESTS();
  293. }