options_file_test.cc 3.5 KB

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