Skip to content

Commit 7535443

Browse files
committed
[RocksDB] Support for column families in manifest
Summary: <This diff is for Column Family branch> Added fields in manifest file to support adding and deleting column families. Pretty simple change, each version edit record can be: 1. add column family 2. drop column family 3. add and delete N files from a single column family (compactions and flushes will generate such records) Test Plan: make check works, the code is backward compatible Reviewers: dhruba, haobo CC: leveldb Differential Revision: https://reviews.facebook.net/D14733
1 parent 6de1b5b commit 7535443

7 files changed

+113
-11
lines changed

db/db_test.cc

+2-2
Original file line numberDiff line numberDiff line change
@@ -767,8 +767,8 @@ TEST(DBTest, LevelLimitReopen) {
767767
Status s = TryReopen(&options);
768768
ASSERT_EQ(s.IsCorruption(), true);
769769
ASSERT_EQ(s.ToString(),
770-
"Corruption: VersionEdit: db already has "
771-
"more levels than options.num_levels");
770+
"Corruption: VersionEdit: column family already has "
771+
"more levels than specified");
772772

773773
options.num_levels = 10;
774774
options.max_bytes_for_level_multiplier_additional.resize(10, 1);

db/version_edit.cc

+58-2
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
#include "db/version_set.h"
1313
#include "util/coding.h"
14+
#include "rocksdb/slice.h"
1415

1516
namespace rocksdb {
1617

@@ -28,7 +29,11 @@ enum Tag {
2829
kPrevLogNumber = 9,
2930

3031
// these are new formats divergent from open source leveldb
31-
kNewFile2 = 100 // store smallest & largest seqno
32+
kNewFile2 = 100, // store smallest & largest seqno
33+
34+
kColumnFamily = 200, // specify column family for version edit
35+
kColumnFamilyAdd = 201,
36+
kColumnFamilyDrop = 202,
3237
};
3338

3439
void VersionEdit::Clear() {
@@ -44,6 +49,10 @@ void VersionEdit::Clear() {
4449
has_last_sequence_ = false;
4550
deleted_files_.clear();
4651
new_files_.clear();
52+
column_family_ = 0;
53+
is_column_family_add_ = 0;
54+
is_column_family_drop_ = 0;
55+
column_family_name_.clear();
4756
}
4857

4958
void VersionEdit::EncodeTo(std::string* dst) const {
@@ -93,6 +102,21 @@ void VersionEdit::EncodeTo(std::string* dst) const {
93102
PutVarint64(dst, f.smallest_seqno);
94103
PutVarint64(dst, f.largest_seqno);
95104
}
105+
106+
// 0 is default and does not need to be explicitly written
107+
if (column_family_ != 0) {
108+
PutVarint32(dst, kColumnFamily);
109+
PutVarint32(dst, column_family_);
110+
}
111+
112+
if (is_column_family_add_) {
113+
PutVarint32(dst, kColumnFamilyAdd);
114+
PutLengthPrefixedSlice(dst, Slice(column_family_name_));
115+
}
116+
117+
if (is_column_family_drop_) {
118+
PutVarint32(dst, kColumnFamilyDrop);
119+
}
96120
}
97121

98122
static bool GetInternalKey(Slice* input, InternalKey* dst) {
@@ -113,7 +137,7 @@ bool VersionEdit::GetLevel(Slice* input, int* level, const char** msg) {
113137
return true;
114138
} else {
115139
if ((int)v >= number_levels_) {
116-
*msg = "db already has more levels than options.num_levels";
140+
*msg = "column family already has more levels than specified";
117141
}
118142
return false;
119143
}
@@ -227,6 +251,29 @@ Status VersionEdit::DecodeFrom(const Slice& src) {
227251
}
228252
break;
229253

254+
case kColumnFamily:
255+
if (!GetVarint32(&input, &column_family_)) {
256+
if (!msg) {
257+
msg = "set column family id";
258+
}
259+
}
260+
break;
261+
262+
case kColumnFamilyAdd:
263+
if (GetLengthPrefixedSlice(&input, &str)) {
264+
is_column_family_add_ = true;
265+
column_family_name_ = str.ToString();
266+
} else {
267+
if (!msg) {
268+
msg = "column family add";
269+
}
270+
}
271+
break;
272+
273+
case kColumnFamilyDrop:
274+
is_column_family_drop_ = true;
275+
break;
276+
230277
default:
231278
msg = "unknown tag";
232279
break;
@@ -294,6 +341,15 @@ std::string VersionEdit::DebugString(bool hex_key) const {
294341
r.append(" .. ");
295342
r.append(f.largest.DebugString(hex_key));
296343
}
344+
r.append("\n ColumnFamily: ");
345+
AppendNumberTo(&r, column_family_);
346+
if (is_column_family_add_) {
347+
r.append("\n ColumnFamilyAdd: ");
348+
r.append(column_family_name_);
349+
}
350+
if (is_column_family_drop_) {
351+
r.append("\n ColumnFamilyDrop");
352+
}
297353
r.append("\n}\n");
298354
return r;
299355
}

db/version_edit.h

+33-3
Original file line numberDiff line numberDiff line change
@@ -29,13 +29,12 @@ struct FileMetaData {
2929
SequenceNumber largest_seqno; // The largest seqno in this file
3030

3131
FileMetaData() : refs(0), allowed_seeks(1 << 30), file_size(0),
32-
being_compacted(false) { }
32+
being_compacted(false) {}
3333
};
3434

3535
class VersionEdit {
3636
public:
37-
explicit VersionEdit(int number_levels) :
38-
number_levels_(number_levels) {
37+
explicit VersionEdit(int number_levels) : number_levels_(number_levels) {
3938
Clear();
4039
}
4140
~VersionEdit() { }
@@ -96,6 +95,27 @@ class VersionEdit {
9695
return new_files_.size() + deleted_files_.size();
9796
}
9897

98+
void SetColumnFamily(uint32_t column_family_id) {
99+
column_family_ = column_family_id;
100+
}
101+
102+
// set column family ID by calling SetColumnFamily()
103+
void AddColumnFamily(const std::string& name) {
104+
assert(!is_column_family_drop_);
105+
assert(!is_column_family_add_);
106+
assert(NumEntries() == 0);
107+
is_column_family_add_ = true;
108+
column_family_name_ = name;
109+
}
110+
111+
// set column family ID by calling SetColumnFamily()
112+
void DropColumnFamily() {
113+
assert(!is_column_family_drop_);
114+
assert(!is_column_family_add_);
115+
assert(NumEntries() == 0);
116+
is_column_family_drop_ = true;
117+
}
118+
99119
void EncodeTo(std::string* dst) const;
100120
Status DecodeFrom(const Slice& src);
101121

@@ -123,6 +143,16 @@ class VersionEdit {
123143
std::vector< std::pair<int, InternalKey> > compact_pointers_;
124144
DeletedFileSet deleted_files_;
125145
std::vector< std::pair<int, FileMetaData> > new_files_;
146+
147+
// Each version edit record should have column_family_id set
148+
// If it's not set, it is default (0)
149+
uint32_t column_family_;
150+
// a version edit can be either column_family add or
151+
// column_family drop. If it's column family add,
152+
// it also includes column family name.
153+
bool is_column_family_drop_;
154+
bool is_column_family_add_;
155+
std::string column_family_name_;
126156
};
127157

128158
} // namespace rocksdb

db/version_edit_test.cc

+12
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,18 @@ TEST(VersionEditTest, EncodeDecode) {
4646
TestEncodeDecode(edit);
4747
}
4848

49+
TEST(VersionEditTest, ColumnFamilyTest) {
50+
VersionEdit edit(7);
51+
edit.SetColumnFamily(2);
52+
edit.AddColumnFamily("column_family");
53+
TestEncodeDecode(edit);
54+
55+
edit.Clear();
56+
edit.SetColumnFamily(3);
57+
edit.DropColumnFamily();
58+
TestEncodeDecode(edit);
59+
}
60+
4961
} // namespace rocksdb
5062

5163
int main(int argc, char** argv) {

db/version_set.cc

+2-2
Original file line numberDiff line numberDiff line change
@@ -987,7 +987,7 @@ class VersionSet::Builder {
987987
#ifndef NDEBUG
988988
// a file to be deleted better exist in the previous version
989989
bool found = false;
990-
for (int l = 0; !found && l < edit->number_levels_; l++) {
990+
for (int l = 0; !found && l < vset_->NumberLevels(); l++) {
991991
const std::vector<FileMetaData*>& base_files = base_->files_[l];
992992
for (unsigned int i = 0; i < base_files.size(); i++) {
993993
FileMetaData* f = base_files[i];
@@ -1000,7 +1000,7 @@ class VersionSet::Builder {
10001000
// if the file did not exist in the previous version, then it
10011001
// is possibly moved from lower level to higher level in current
10021002
// version
1003-
for (int l = level+1; !found && l < edit->number_levels_; l++) {
1003+
for (int l = level+1; !found && l < vset_->NumberLevels(); l++) {
10041004
const FileSet* added = levels_[l].added_files;
10051005
for (FileSet::const_iterator added_iter = added->begin();
10061006
added_iter != added->end(); ++added_iter) {

db/version_set.h

+4
Original file line numberDiff line numberDiff line change
@@ -505,6 +505,10 @@ class VersionSet {
505505
// generates a increasing version number for every new version
506506
uint64_t current_version_number_;
507507

508+
// column family metadata
509+
std::unordered_map<std::string, ColumnFamilyHandle> column_families_;
510+
uint32_t max_column_family_id_;
511+
508512
// Queue of writers to the manifest file
509513
std::deque<ManifestWriter*> manifest_writers_;
510514

include/rocksdb/column_family.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,11 @@ namespace rocksdb {
1818
// should not be used by the clients
1919

2020
struct ColumnFamilyHandle {
21-
int id;
21+
uint32_t id;
2222
// default
2323
ColumnFamilyHandle() : id() {}
2424
/* implicit */
25-
ColumnFamilyHandle(int _id) : id(_id) {}
25+
ColumnFamilyHandle(uint32_t _id) : id(_id) {}
2626
};
2727

2828
const ColumnFamilyHandle default_column_family = ColumnFamilyHandle();

0 commit comments

Comments
 (0)