options_file_test.cc 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  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 <string>
  7. #include "db/db_impl/db_impl.h"
  8. #include "db/db_test_util.h"
  9. #include "rocksdb/options.h"
  10. #include "rocksdb/table.h"
  11. #include "test_util/testharness.h"
  12. namespace ROCKSDB_NAMESPACE {
  13. class OptionsFileTest : public testing::Test {
  14. public:
  15. OptionsFileTest() : dbname_(test::PerThreadDBPath("options_file_test")) {}
  16. std::string dbname_;
  17. };
  18. namespace {
  19. void UpdateOptionsFiles(DB* db,
  20. std::unordered_set<std::string>* filename_history,
  21. int* options_files_count) {
  22. std::vector<std::string> filenames;
  23. db->GetEnv()->GetChildren(db->GetName(), &filenames);
  24. uint64_t number;
  25. FileType type;
  26. *options_files_count = 0;
  27. for (auto filename : filenames) {
  28. if (ParseFileName(filename, &number, &type) && type == kOptionsFile) {
  29. filename_history->insert(filename);
  30. (*options_files_count)++;
  31. }
  32. }
  33. }
  34. // Verify whether the current Options Files are the latest ones.
  35. void VerifyOptionsFileName(
  36. DB* db, const std::unordered_set<std::string>& past_filenames) {
  37. std::vector<std::string> filenames;
  38. std::unordered_set<std::string> current_filenames;
  39. db->GetEnv()->GetChildren(db->GetName(), &filenames);
  40. uint64_t number;
  41. FileType type;
  42. for (auto filename : filenames) {
  43. if (ParseFileName(filename, &number, &type) && type == kOptionsFile) {
  44. current_filenames.insert(filename);
  45. }
  46. }
  47. for (auto past_filename : past_filenames) {
  48. if (current_filenames.find(past_filename) != current_filenames.end()) {
  49. continue;
  50. }
  51. for (auto filename : current_filenames) {
  52. ASSERT_GT(filename, past_filename);
  53. }
  54. }
  55. }
  56. } // namespace
  57. TEST_F(OptionsFileTest, NumberOfOptionsFiles) {
  58. const int kReopenCount = 20;
  59. Options opt;
  60. opt.create_if_missing = true;
  61. DestroyDB(dbname_, opt);
  62. std::unordered_set<std::string> filename_history;
  63. DB* db;
  64. for (int i = 0; i < kReopenCount; ++i) {
  65. ASSERT_OK(DB::Open(opt, dbname_, &db));
  66. int num_options_files = 0;
  67. UpdateOptionsFiles(db, &filename_history, &num_options_files);
  68. ASSERT_GT(num_options_files, 0);
  69. ASSERT_LE(num_options_files, 2);
  70. // Make sure we always keep the latest option files.
  71. VerifyOptionsFileName(db, filename_history);
  72. delete db;
  73. }
  74. }
  75. TEST_F(OptionsFileTest, OptionsFileName) {
  76. const uint64_t kOptionsFileNum = 12345;
  77. uint64_t number;
  78. FileType type;
  79. auto options_file_name = OptionsFileName("", kOptionsFileNum);
  80. ASSERT_TRUE(ParseFileName(options_file_name, &number, &type, nullptr));
  81. ASSERT_EQ(type, kOptionsFile);
  82. ASSERT_EQ(number, kOptionsFileNum);
  83. const uint64_t kTempOptionsFileNum = 54352;
  84. auto temp_options_file_name = TempOptionsFileName("", kTempOptionsFileNum);
  85. ASSERT_TRUE(ParseFileName(temp_options_file_name, &number, &type, nullptr));
  86. ASSERT_NE(temp_options_file_name.find(kTempFileNameSuffix),
  87. std::string::npos);
  88. ASSERT_EQ(type, kTempFile);
  89. ASSERT_EQ(number, kTempOptionsFileNum);
  90. }
  91. } // namespace ROCKSDB_NAMESPACE
  92. int main(int argc, char** argv) {
  93. #if !(defined NDEBUG) || !defined(OS_WIN)
  94. ::testing::InitGoogleTest(&argc, argv);
  95. return RUN_ALL_TESTS();
  96. #else
  97. return 0;
  98. #endif // !(defined NDEBUG) || !defined(OS_WIN)
  99. }
  100. #else
  101. #include <cstdio>
  102. int main(int /*argc*/, char** /*argv*/) {
  103. printf("Skipped as Options file is not supported in RocksDBLite.\n");
  104. return 0;
  105. }
  106. #endif // !ROCKSDB_LITE