@@ -1497,6 +1497,9 @@ Status VersionSet::LogAndApply(ColumnFamilyData* column_family_data,
1497
1497
return Status::OK ();
1498
1498
}
1499
1499
if (edit->is_column_family_drop_ ) {
1500
+ // if we drop column family, we have to make sure to save max column family,
1501
+ // so that we don't reuse existing ID
1502
+ edit->SetMaxColumnFamily (column_family_set_->GetMaxColumnFamily ());
1500
1503
column_family_data->SetDropped ();
1501
1504
}
1502
1505
@@ -1789,6 +1792,7 @@ Status VersionSet::Recover(
1789
1792
uint64_t last_sequence = 0 ;
1790
1793
uint64_t log_number = 0 ;
1791
1794
uint64_t prev_log_number = 0 ;
1795
+ uint32_t max_column_family = 0 ;
1792
1796
std::unordered_map<uint32_t , Builder*> builders;
1793
1797
1794
1798
// add default column family
@@ -1918,6 +1922,10 @@ Status VersionSet::Recover(
1918
1922
have_next_file = true ;
1919
1923
}
1920
1924
1925
+ if (edit.has_max_column_family_ ) {
1926
+ max_column_family = edit.max_column_family_ ;
1927
+ }
1928
+
1921
1929
if (edit.has_last_sequence_ ) {
1922
1930
last_sequence = edit.last_sequence_ ;
1923
1931
have_last_sequence = true ;
@@ -1938,6 +1946,8 @@ Status VersionSet::Recover(
1938
1946
prev_log_number = 0 ;
1939
1947
}
1940
1948
1949
+ column_family_set_->UpdateMaxColumnFamily (max_column_family);
1950
+
1941
1951
MarkFileNumberUsed (prev_log_number);
1942
1952
MarkFileNumberUsed (log_number);
1943
1953
}
@@ -1981,13 +1991,15 @@ Status VersionSet::Recover(
1981
1991
Log (options_->info_log , " Recovered from manifest file:%s succeeded,"
1982
1992
" manifest_file_number is %lu, next_file_number is %lu, "
1983
1993
" last_sequence is %lu, log_number is %lu,"
1984
- " prev_log_number is %lu\n " ,
1994
+ " prev_log_number is %lu,"
1995
+ " max_column_family is %u\n " ,
1985
1996
manifest_filename.c_str (),
1986
1997
(unsigned long )manifest_file_number_,
1987
1998
(unsigned long )next_file_number_,
1988
1999
(unsigned long )last_sequence_,
1989
2000
(unsigned long )log_number,
1990
- (unsigned long )prev_log_number_);
2001
+ (unsigned long )prev_log_number_,
2002
+ column_family_set_->GetMaxColumnFamily ());
1991
2003
1992
2004
for (auto cfd : *column_family_set_) {
1993
2005
Log (options_->info_log ,
@@ -2267,6 +2279,10 @@ Status VersionSet::DumpManifest(Options& options, std::string& dscname,
2267
2279
last_sequence = edit.last_sequence_ ;
2268
2280
have_last_sequence = true ;
2269
2281
}
2282
+
2283
+ if (edit.has_max_column_family_ ) {
2284
+ column_family_set_->UpdateMaxColumnFamily (edit.max_column_family_ );
2285
+ }
2270
2286
}
2271
2287
}
2272
2288
file.reset ();
@@ -2315,9 +2331,10 @@ Status VersionSet::DumpManifest(Options& options, std::string& dscname,
2315
2331
2316
2332
printf (
2317
2333
" manifest_file_number %lu next_file_number %lu last_sequence "
2318
- " %lu prev_log_number %lu\n " ,
2334
+ " %lu prev_log_number %lu max_column_family %u \n " ,
2319
2335
(unsigned long )manifest_file_number_, (unsigned long )next_file_number_,
2320
- (unsigned long )last_sequence, (unsigned long )prev_log_number);
2336
+ (unsigned long )last_sequence, (unsigned long )prev_log_number,
2337
+ column_family_set_->GetMaxColumnFamily ());
2321
2338
}
2322
2339
2323
2340
return s;
@@ -2378,6 +2395,18 @@ Status VersionSet::WriteSnapshot(log::Writer* log) {
2378
2395
}
2379
2396
}
2380
2397
2398
+ // save max column family to avoid reusing the same column
2399
+ // family ID for two different column families
2400
+ if (column_family_set_->GetMaxColumnFamily () > 0 ) {
2401
+ VersionEdit edit;
2402
+ edit.SetMaxColumnFamily (column_family_set_->GetMaxColumnFamily ());
2403
+ std::string record;
2404
+ edit.EncodeTo (&record);
2405
+ Status s = log ->AddRecord (record);
2406
+ if (!s.ok ()) {
2407
+ return s;
2408
+ }
2409
+ }
2381
2410
return Status::OK ();
2382
2411
}
2383
2412
0 commit comments