YugabyteDB (2.13.0.0-b42, bfc6a6643e7399ac8a0e81d06a3ee6d6571b33ab)

Coverage Report

Created: 2022-03-09 17:30

/Users/deen/code/yugabyte-db/src/yb/rocksdb/db/filename_test.cc
Line
Count
Source
1
//  Copyright (c) 2011-present, Facebook, Inc.  All rights reserved.
2
//  This source code is licensed under the BSD-style license found in the
3
//  LICENSE file in the root directory of this source tree. An additional grant
4
//  of patent rights can be found in the PATENTS file in the same directory.
5
//
6
// The following only applies to changes made to this file as part of YugaByte development.
7
//
8
// Portions Copyright (c) YugaByte, Inc.
9
//
10
// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
11
// in compliance with the License.  You may obtain a copy of the License at
12
//
13
// http://www.apache.org/licenses/LICENSE-2.0
14
//
15
// Unless required by applicable law or agreed to in writing, software distributed under the License
16
// is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
17
// or implied.  See the License for the specific language governing permissions and limitations
18
// under the License.
19
//
20
// Copyright (c) 2011 The LevelDB Authors. All rights reserved.
21
// Use of this source code is governed by a BSD-style license that can be
22
// found in the LICENSE file. See the AUTHORS file for names of contributors.
23
24
#include <string>
25
26
#include <gtest/gtest.h>
27
28
#include "yb/rocksdb/db/filename.h"
29
#include "yb/rocksdb/env.h"
30
#include "yb/util/test_macros.h"
31
#include "yb/rocksdb/util/testutil.h"
32
33
namespace rocksdb {
34
35
class FileNameTest : public RocksDBTest {};
36
37
1
TEST_F(FileNameTest, Parse) {
38
1
  Slice db;
39
1
  FileType type;
40
1
  uint64_t number;
41
42
1
  char kDefautInfoLogDir = 1;
43
1
  char kDifferentInfoLogDir = 2;
44
1
  char kNoCheckLogDir = 4;
45
1
  char kAllMode = kDefautInfoLogDir | kDifferentInfoLogDir | kNoCheckLogDir;
46
47
  // Successful parses
48
1
  static struct {
49
1
    const char* fname;
50
1
    uint64_t number;
51
1
    FileType type;
52
1
    char mode;
53
1
  } cases[] = {
54
1
        {"100.log", 100, kLogFile, kAllMode},
55
1
        {"0.log", 0, kLogFile, kAllMode},
56
1
        {"0.sst", 0, kTableFile, kAllMode},
57
1
        {"CURRENT", 0, kCurrentFile, kAllMode},
58
1
        {"LOCK", 0, kDBLockFile, kAllMode},
59
1
        {"MANIFEST-2", 2, kDescriptorFile, kAllMode},
60
1
        {"MANIFEST-7", 7, kDescriptorFile, kAllMode},
61
1
        {"METADB-2", 2, kMetaDatabase, kAllMode},
62
1
        {"METADB-7", 7, kMetaDatabase, kAllMode},
63
1
        {"LOG", 0, kInfoLogFile, kDefautInfoLogDir},
64
1
        {"LOG.old", 0, kInfoLogFile, kDefautInfoLogDir},
65
1
        {"LOG.old.6688", 6688, kInfoLogFile, kDefautInfoLogDir},
66
1
        {"rocksdb_dir_LOG", 0, kInfoLogFile, kDifferentInfoLogDir},
67
1
        {"rocksdb_dir_LOG.old", 0, kInfoLogFile, kDifferentInfoLogDir},
68
1
        {"rocksdb_dir_LOG.old.6688", 6688, kInfoLogFile, kDifferentInfoLogDir},
69
1
        {"18446744073709551615.log", 18446744073709551615ull, kLogFile,
70
1
         kAllMode}, };
71
3
  for (char mode : {kDifferentInfoLogDir, kDefautInfoLogDir, kNoCheckLogDir}) {
72
51
    for (unsigned int i = 0; i < sizeof(cases) / sizeof(cases[0]); i++) {
73
48
      InfoLogPrefix info_log_prefix(mode != kDefautInfoLogDir, "/rocksdb/dir");
74
48
      if (cases[i].mode & mode) {
75
36
        std::string f = cases[i].fname;
76
36
        if (mode == kNoCheckLogDir) {
77
20
          ASSERT_TRUE(ParseFileName(f, &number, &type)) << f;
78
26
        } else {
79
52
          ASSERT_TRUE(ParseFileName(f, &number, info_log_prefix.prefix, &type))
80
52
              << f;
81
36
        }
82
72
        ASSERT_EQ(cases[i].type, type) << f;
83
72
        ASSERT_EQ(cases[i].number, number) << f;
84
36
      }
85
48
    }
86
3
  }
87
88
  // Errors
89
1
  static const char* errors[] = {
90
1
    "",
91
1
    "foo",
92
1
    "foo-dx-100.log",
93
1
    ".log",
94
1
    "",
95
1
    "manifest",
96
1
    "CURREN",
97
1
    "CURRENTX",
98
1
    "MANIFES",
99
1
    "MANIFEST",
100
1
    "MANIFEST-",
101
1
    "XMANIFEST-3",
102
1
    "MANIFEST-3x",
103
1
    "META",
104
1
    "METADB",
105
1
    "METADB-",
106
1
    "XMETADB-3",
107
1
    "METADB-3x",
108
1
    "LOC",
109
1
    "LOCKx",
110
1
    "LO",
111
1
    "LOGx",
112
1
    "18446744073709551616.log",
113
1
    "184467440737095516150.log",
114
1
    "100",
115
1
    "100.",
116
1
    "100.lop"
117
1
  };
118
28
  for (unsigned int i = 0; i < sizeof(errors) / sizeof(errors[0]); i++) {
119
27
    std::string f = errors[i];
120
54
    ASSERT_TRUE(!ParseFileName(f, &number, &type)) << f;
121
27
  }
122
1
}
123
124
1
TEST_F(FileNameTest, InfoLogFileName) {
125
1
  std::string dbname = ("/data/rocksdb");
126
1
  std::string db_absolute_path;
127
1
  ASSERT_OK(Env::Default()->GetAbsolutePath(dbname, &db_absolute_path));
128
129
1
  ASSERT_EQ("/data/rocksdb/LOG", InfoLogFileName(dbname, db_absolute_path, ""));
130
1
  ASSERT_EQ("/data/rocksdb/LOG.old.666",
131
1
            OldInfoLogFileName(dbname, 666u, db_absolute_path, ""));
132
133
1
  ASSERT_EQ("/data/rocksdb_log/data_rocksdb_LOG",
134
1
            InfoLogFileName(dbname, db_absolute_path, "/data/rocksdb_log"));
135
1
  ASSERT_EQ(
136
1
      "/data/rocksdb_log/data_rocksdb_LOG.old.666",
137
1
      OldInfoLogFileName(dbname, 666u, db_absolute_path, "/data/rocksdb_log"));
138
1
}
139
140
1
TEST_F(FileNameTest, Construction) {
141
1
  uint64_t number;
142
1
  FileType type;
143
1
  std::string fname;
144
145
1
  fname = CurrentFileName("foo");
146
1
  ASSERT_EQ("foo/", std::string(fname.data(), 4));
147
1
  ASSERT_TRUE(ParseFileName(fname.c_str() + 4, &number, &type));
148
1
  ASSERT_EQ(0U, number);
149
1
  ASSERT_EQ(kCurrentFile, type);
150
151
1
  fname = LockFileName("foo");
152
1
  ASSERT_EQ("foo/", std::string(fname.data(), 4));
153
1
  ASSERT_TRUE(ParseFileName(fname.c_str() + 4, &number, &type));
154
1
  ASSERT_EQ(0U, number);
155
1
  ASSERT_EQ(kDBLockFile, type);
156
157
1
  fname = LogFileName("foo", 192);
158
1
  ASSERT_EQ("foo/", std::string(fname.data(), 4));
159
1
  ASSERT_TRUE(ParseFileName(fname.c_str() + 4, &number, &type));
160
1
  ASSERT_EQ(192U, number);
161
1
  ASSERT_EQ(kLogFile, type);
162
163
1
  fname = TableFileName({DbPath("bar", 0)}, 200, 0);
164
1
  std::string fname1 =
165
1
      TableFileName({DbPath("foo", 0), DbPath("bar", 0)}, 200, 1);
166
1
  ASSERT_EQ(fname, fname1);
167
1
  ASSERT_EQ("bar/", std::string(fname.data(), 4));
168
1
  ASSERT_TRUE(ParseFileName(fname.c_str() + 4, &number, &type));
169
1
  ASSERT_EQ(200U, number);
170
1
  ASSERT_EQ(kTableFile, type);
171
172
1
  fname = DescriptorFileName("bar", 100);
173
1
  ASSERT_EQ("bar/", std::string(fname.data(), 4));
174
1
  ASSERT_TRUE(ParseFileName(fname.c_str() + 4, &number, &type));
175
1
  ASSERT_EQ(100U, number);
176
1
  ASSERT_EQ(kDescriptorFile, type);
177
178
1
  fname = TempFileName("tmp", 999);
179
1
  ASSERT_EQ("tmp/", std::string(fname.data(), 4));
180
1
  ASSERT_TRUE(ParseFileName(fname.c_str() + 4, &number, &type));
181
1
  ASSERT_EQ(999U, number);
182
1
  ASSERT_EQ(kTempFile, type);
183
184
1
  fname = MetaDatabaseName("met", 100);
185
1
  ASSERT_EQ("met/", std::string(fname.data(), 4));
186
1
  ASSERT_TRUE(ParseFileName(fname.c_str() + 4, &number, &type));
187
1
  ASSERT_EQ(100U, number);
188
1
  ASSERT_EQ(kMetaDatabase, type);
189
1
}
190
191
}  // namespace rocksdb
192
193
13.2k
int main(int argc, char** argv) {
194
13.2k
  ::testing::InitGoogleTest(&argc, argv);
195
13.2k
  return RUN_ALL_TESTS();
196
13.2k
}