Add ColumnFamilyHandle::GetDescriptor()

Summary:
This patch addes ColumnFamilyHandle::GetDescriptor(), which allows
developers to obtain the CF options and names of the associated column
family given its handle.

  // Returns the up-to-date descriptor used by the current handle.  Since it
  // returns the up-to-date information, this call might internally locks
  // and releases DB mutex to access the up-to-date CF options.
  virtual ColumnFamilyDescriptor GetDescriptor() = 0;

Test Plan: augment column_family_test

Reviewers: sdong, yoshinorim, IslamAbdelRahman, rven, kradhakrishnan, anthony

Reviewed By: anthony

Subscribers: dhruba, leveldb

Differential Revision: https://reviews.facebook.net/D51543
This commit is contained in:
Yueh-Hsuan Chiang 2016-01-06 18:14:01 -08:00
parent 9760c842ce
commit 6935eb24e0
4 changed files with 46 additions and 12 deletions

View File

@ -68,6 +68,20 @@ const std::string& ColumnFamilyHandleImpl::GetName() const {
return cfd()->GetName(); return cfd()->GetName();
} }
Status ColumnFamilyHandleImpl::GetDescriptor(ColumnFamilyDescriptor* desc) {
#ifndef ROCKSDB_LITE
// accessing mutable cf-options requires db mutex.
InstrumentedMutexLock l(mutex_);
*desc = ColumnFamilyDescriptor(
cfd()->GetName(),
BuildColumnFamilyOptions(*cfd()->options(),
*cfd()->GetLatestMutableCFOptions()));
return Status::OK();
#else
return Status::NotSupported();
#endif // !ROCKSDB_LITE
}
const Comparator* ColumnFamilyHandleImpl::user_comparator() const { const Comparator* ColumnFamilyHandleImpl::user_comparator() const {
return cfd()->user_comparator(); return cfd()->user_comparator();
} }

View File

@ -59,6 +59,7 @@ class ColumnFamilyHandleImpl : public ColumnFamilyHandle {
virtual uint32_t GetID() const override; virtual uint32_t GetID() const override;
virtual const std::string& GetName() const override; virtual const std::string& GetName() const override;
virtual Status GetDescriptor(ColumnFamilyDescriptor* desc) override;
private: private:
ColumnFamilyData* cfd_; ColumnFamilyData* cfd_;

View File

@ -16,11 +16,12 @@
#include "rocksdb/db.h" #include "rocksdb/db.h"
#include "rocksdb/env.h" #include "rocksdb/env.h"
#include "rocksdb/iterator.h" #include "rocksdb/iterator.h"
#include "util/coding.h"
#include "util/options_parser.h"
#include "util/string_util.h" #include "util/string_util.h"
#include "util/sync_point.h"
#include "util/testharness.h" #include "util/testharness.h"
#include "util/testutil.h" #include "util/testutil.h"
#include "util/coding.h"
#include "util/sync_point.h"
#include "utilities/merge_operators.h" #include "utilities/merge_operators.h"
namespace rocksdb { namespace rocksdb {
@ -146,10 +147,18 @@ class ColumnFamilyTest : public testing::Test {
handles_.resize(cfi + cfs.size()); handles_.resize(cfi + cfs.size());
names_.resize(cfi + cfs.size()); names_.resize(cfi + cfs.size());
for (size_t i = 0; i < cfs.size(); ++i) { for (size_t i = 0; i < cfs.size(); ++i) {
ASSERT_OK(db_->CreateColumnFamily( const auto& current_cf_opt =
options.size() == 0 ? column_family_options_ : options[i], cfs[i], options.size() == 0 ? column_family_options_ : options[i];
&handles_[cfi])); ASSERT_OK(
db_->CreateColumnFamily(current_cf_opt, cfs[i], &handles_[cfi]));
names_[cfi] = cfs[i]; names_[cfi] = cfs[i];
#ifndef ROCKSDB_LITE // RocksDBLite does not support GetDescriptor
// Verify the CF options of the returned CF handle.
ColumnFamilyDescriptor desc;
ASSERT_OK(handles_[cfi]->GetDescriptor(&desc));
RocksDBOptionsParser::VerifyCFOptions(desc.options, current_cf_opt);
#endif // !ROCKSDB_LITE
cfi++; cfi++;
} }
} }

View File

@ -50,14 +50,7 @@ class EventListener;
using std::unique_ptr; using std::unique_ptr;
class ColumnFamilyHandle {
public:
virtual ~ColumnFamilyHandle() {}
virtual const std::string& GetName() const = 0;
virtual uint32_t GetID() const = 0;
};
extern const std::string kDefaultColumnFamilyName; extern const std::string kDefaultColumnFamilyName;
struct ColumnFamilyDescriptor { struct ColumnFamilyDescriptor {
std::string name; std::string name;
ColumnFamilyOptions options; ColumnFamilyOptions options;
@ -68,6 +61,23 @@ struct ColumnFamilyDescriptor {
: name(_name), options(_options) {} : name(_name), options(_options) {}
}; };
class ColumnFamilyHandle {
public:
virtual ~ColumnFamilyHandle() {}
// Returns the name of the column family associated with the current handle.
virtual const std::string& GetName() const = 0;
// Returns the ID of the column family associated with the current handle.
virtual uint32_t GetID() const = 0;
// Fills "*desc" with the up-to-date descriptor of the column family
// associated with this handle. Since it fills "*desc" with the up-to-date
// information, this call might internally lock and release DB mutex to
// access the up-to-date CF options. In addition, all the pointer-typed
// options cannot be referenced any longer than the original options exist.
//
// Note that this function is not supported in RocksDBLite.
virtual Status GetDescriptor(ColumnFamilyDescriptor* desc) = 0;
};
static const int kMajorVersion = __ROCKSDB_MAJOR__; static const int kMajorVersion = __ROCKSDB_MAJOR__;
static const int kMinorVersion = __ROCKSDB_MINOR__; static const int kMinorVersion = __ROCKSDB_MINOR__;