@@ -913,21 +913,8 @@ Status DBImpl::Recover(
913
913
}
914
914
}
915
915
916
- Status s = versions_->Recover ();
916
+ Status s = versions_->Recover (column_families );
917
917
if (s.ok ()) {
918
- if (column_families.size () != versions_->column_families_ .size ()) {
919
- return Status::InvalidArgument (" Column family specifications mismatch" );
920
- }
921
- for (auto cf : column_families) {
922
- auto cf_iter = versions_->column_families_ .find (cf.name );
923
- if (cf_iter == versions_->column_families_ .end ()) {
924
- return Status::InvalidArgument (" Column family specifications mismatch" );
925
- }
926
- auto cf_data_iter = versions_->column_family_data_ .find (cf_iter->second );
927
- assert (cf_data_iter != versions_->column_family_data_ .end ());
928
- cf_data_iter->second ->options = cf.options ;
929
- }
930
-
931
918
SequenceNumber max_sequence (0 );
932
919
933
920
// Recover from all newer log files than the ones named in the
@@ -2933,11 +2920,13 @@ std::vector<Status> DBImpl::MultiGet(
2933
2920
Status DBImpl::CreateColumnFamily (const ColumnFamilyOptions& options,
2934
2921
const std::string& column_family_name,
2935
2922
ColumnFamilyHandle* handle) {
2923
+ if (!versions_->GetColumnFamilySet ()->Exists (column_family_name)) {
2924
+ return Status::InvalidArgument (" Column family already exists" );
2925
+ }
2936
2926
VersionEdit edit;
2937
2927
edit.AddColumnFamily (column_family_name);
2938
2928
MutexLock l (&mutex_);
2939
- ++versions_->max_column_family_ ;
2940
- handle->id = versions_->max_column_family_ ;
2929
+ handle->id = versions_->GetColumnFamilySet ()->GetNextColumnFamilyID ();
2941
2930
edit.SetColumnFamily (handle->id );
2942
2931
Status s = versions_->LogAndApply (&edit, &mutex_);
2943
2932
if (s.ok ()) {
@@ -2948,21 +2937,16 @@ Status DBImpl::CreateColumnFamily(const ColumnFamilyOptions& options,
2948
2937
}
2949
2938
2950
2939
Status DBImpl::DropColumnFamily (const ColumnFamilyHandle& column_family) {
2951
- // TODO this is not good. implement some sort of refcounting
2952
- // column family data and only delete when refcount goes to 0
2953
- // We don't want to delete column family if there is a compaction going on,
2954
- // or if there are some outstanding iterators
2955
2940
if (column_family.id == 0 ) {
2956
2941
return Status::InvalidArgument (" Can't drop default column family" );
2957
2942
}
2958
- VersionEdit edit;
2959
- edit.DropColumnFamily ();
2960
- edit.SetColumnFamily (column_family.id );
2961
2943
MutexLock l (&mutex_);
2962
- auto data_iter = versions_->column_family_data_ .find (column_family.id );
2963
- if (data_iter == versions_->column_family_data_ .end ()) {
2944
+ if (!versions_->GetColumnFamilySet ()->Exists (column_family.id )) {
2964
2945
return Status::NotFound (" Column family not found" );
2965
2946
}
2947
+ VersionEdit edit;
2948
+ edit.DropColumnFamily ();
2949
+ edit.SetColumnFamily (column_family.id );
2966
2950
Status s = versions_->LogAndApply (&edit, &mutex_);
2967
2951
if (s.ok ()) {
2968
2952
// remove from internal data structures
@@ -3968,10 +3952,16 @@ Status DB::OpenWithColumnFamilies(
3968
3952
// set column family handles
3969
3953
handles->clear ();
3970
3954
for (auto cf : column_families) {
3971
- auto cf_iter = impl->versions_ ->column_families_ .find (cf.name );
3972
- assert (cf_iter != impl->versions_ ->column_families_ .end ());
3973
- handles->push_back (ColumnFamilyHandle (cf_iter->second ));
3955
+ if (!impl->versions_ ->GetColumnFamilySet ()->Exists (cf.name )) {
3956
+ s = Status::InvalidArgument (" Column family not found: " , cf.name );
3957
+ handles->clear ();
3958
+ break ;
3959
+ }
3960
+ uint32_t id = impl->versions_ ->GetColumnFamilySet ()->GetID (cf.name );
3961
+ handles->push_back (ColumnFamilyHandle (id));
3974
3962
}
3963
+ }
3964
+ if (s.ok ()) {
3975
3965
delete impl->InstallSuperVersion (new DBImpl::SuperVersion ());
3976
3966
impl->mem_ ->SetLogNumber (impl->logfile_number_ );
3977
3967
impl->DeleteObsoleteFiles ();
@@ -4006,23 +3996,7 @@ Status DB::OpenWithColumnFamilies(
4006
3996
Status DB::ListColumnFamilies (const DBOptions& db_options,
4007
3997
const std::string& name,
4008
3998
std::vector<std::string>* column_families) {
4009
- Options options (db_options, ColumnFamilyOptions ());
4010
- InternalKeyComparator* icmp = new InternalKeyComparator (options.comparator );
4011
- TableCache* table_cache = new TableCache (name, &options, EnvOptions (options),
4012
- db_options.max_open_files - 10 );
4013
- VersionSet* version_set =
4014
- new VersionSet (name, &options, EnvOptions (options), table_cache, icmp);
4015
-
4016
- version_set->Recover ();
4017
- column_families->clear ();
4018
- for (auto cf : version_set->column_families_ ) {
4019
- column_families->push_back (cf.first );
4020
- }
4021
-
4022
- delete version_set;
4023
- delete table_cache;
4024
- delete icmp;
4025
- return Status::NotSupported (" Working on it" );
3999
+ return VersionSet::ListColumnFamilies (column_families, name, db_options.env );
4026
4000
}
4027
4001
4028
4002
Snapshot::~Snapshot () {
0 commit comments