Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 3bc624a

Browse files
committedMar 31, 2021
Make Address Sanitizer happy
1 parent 65f859b commit 3bc624a

File tree

2 files changed

+59
-12
lines changed

2 files changed

+59
-12
lines changed
 

‎db/version_set.cc

+4-11
Original file line numberDiff line numberDiff line change
@@ -342,8 +342,6 @@ class FilePicker {
342342
};
343343
} // anonymous namespace
344344

345-
VersionStorageInfo::~VersionStorageInfo() { delete[](files_ - 1); }
346-
347345
Version::~Version() {
348346
assert(refs_ == 0);
349347

@@ -1174,7 +1172,7 @@ VersionStorageInfo::VersionStorageInfo(
11741172
num_non_empty_levels_(0),
11751173
file_indexer_(user_comparator),
11761174
compaction_style_(compaction_style),
1177-
files_(new std::vector<FileMetaData*>[num_levels_ + 1]),
1175+
files_(num_levels_),
11781176
base_level_(num_levels_ == 1 ? -1 : 1),
11791177
level_multiplier_(0.0),
11801178
files_by_compaction_pri_(num_levels_),
@@ -1196,9 +1194,7 @@ VersionStorageInfo::VersionStorageInfo(
11961194
is_pick_compaction_fail(false),
11971195
is_pick_garbage_collection_fail(false),
11981196
force_consistency_checks_(_force_consistency_checks),
1199-
blob_marked_for_compaction_(false) {
1200-
++files_; // level -1 used for dependence files
1201-
}
1197+
blob_marked_for_compaction_(false) {}
12021198

12031199
Version::Version(ColumnFamilyData* column_family_data, VersionSet* vset,
12041200
const EnvOptions& env_opt,
@@ -4046,9 +4042,7 @@ Status VersionSet::ReduceNumberOfLevels(const std::string& dbname,
40464042
// we need to allocate an array with the old number of levels size to
40474043
// avoid SIGSEGV in WriteSnapshot()
40484044
// however, all levels bigger or equal to new_levels will be empty
4049-
std::vector<FileMetaData*>* new_files_list =
4050-
new std::vector<FileMetaData*>[current_levels + 1];
4051-
++new_files_list;
4045+
VersionStorageInfo::Files new_files_list(current_levels);
40524046
for (int i = -1; i < new_levels - 1; i++) {
40534047
new_files_list[i] = vstorage->LevelFiles(i);
40544048
}
@@ -4057,8 +4051,7 @@ Status VersionSet::ReduceNumberOfLevels(const std::string& dbname,
40574051
new_files_list[new_levels - 1] = vstorage->LevelFiles(first_nonempty_level);
40584052
}
40594053

4060-
delete[](vstorage->files_ - 1);
4061-
vstorage->files_ = new_files_list;
4054+
vstorage->files_ = std::move(new_files_list);
40624055
vstorage->num_levels_ = new_levels;
40634056

40644057
MutableCFOptions mutable_cf_options(*options);

‎db/version_set.h

+55-1
Original file line numberDiff line numberDiff line change
@@ -514,7 +514,61 @@ class VersionStorageInfo {
514514

515515
// List of files per level, files in each level are arranged
516516
// in increasing order of keys
517-
std::vector<FileMetaData*>* files_;
517+
struct Files {
518+
Files(const Files&) = delete;
519+
Files& operator=(const Files&) = delete;
520+
521+
#if __SANITIZE_ADDRESS__
522+
std::vector<std::vector<FileMetaData*>> files;
523+
524+
Files(size_t num_levels) { files.resize(num_levels + 1); }
525+
Files(Files&&) = default;
526+
Files& operator=(Files&&) = default;
527+
528+
std::vector<FileMetaData*>& operator[](int l) { return files[l + 1]; }
529+
const std::vector<FileMetaData*>& operator[](int l) const {
530+
return files[l + 1];
531+
}
532+
533+
operator std::vector<FileMetaData*> const *() const {
534+
return files.data() + 1;
535+
}
536+
#else
537+
std::vector<FileMetaData*>* files;
538+
539+
Files(size_t num_levels)
540+
: files(new std::vector<FileMetaData*>[num_levels + 1]) {
541+
++files;
542+
}
543+
Files(Files&& other) {
544+
files = other.files;
545+
other.files = nullptr;
546+
}
547+
Files& operator=(Files&& other) {
548+
if (this != &other) {
549+
if (files != nullptr) {
550+
delete[](files - 1);
551+
}
552+
files = other.files;
553+
other.files = nullptr;
554+
}
555+
return *this
556+
}
557+
~Files() {
558+
if (files != nullptr) {
559+
delete[](files - 1);
560+
}
561+
}
562+
563+
std::vector<FileMetaData*>& operator[](int l) { return files[l]; }
564+
const std::vector<FileMetaData*>& operator[](int l) const {
565+
return files[l];
566+
}
567+
568+
operator std::vector<FileMetaData*> const *() const { return files; }
569+
#endif
570+
};
571+
Files files_;
518572

519573
// Dependence files both in files[-1] and dependence_map
520574
DependenceMap dependence_map_;

0 commit comments

Comments
 (0)
Please sign in to comment.