Plugin Registry (#7949)
Summary: Added a Plugin class to the ObjectRegistry. Enabled compile-time and program-time addition of plugins to the Registry. Pull Request resolved: https://github.com/facebook/rocksdb/pull/7949 Reviewed By: mrambacher Differential Revision: D33517674 Pulled By: pdillinger fbshipit-source-id: c3e3270aab76a489bfa9e85d78cdfca951912557
This commit is contained in:
parent
f241d082b6
commit
b7db7eae26
@ -182,26 +182,6 @@ else()
|
|||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
string(TIMESTAMP TS "%Y-%m-%d %H:%M:%S" UTC)
|
|
||||||
set(BUILD_DATE "${TS}" CACHE STRING "the time we first built rocksdb")
|
|
||||||
|
|
||||||
find_package(Git)
|
|
||||||
|
|
||||||
if(GIT_FOUND AND EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/.git")
|
|
||||||
execute_process(WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" OUTPUT_VARIABLE GIT_SHA COMMAND "${GIT_EXECUTABLE}" rev-parse HEAD )
|
|
||||||
execute_process(WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" RESULT_VARIABLE GIT_MOD COMMAND "${GIT_EXECUTABLE}" diff-index HEAD --quiet)
|
|
||||||
execute_process(WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" OUTPUT_VARIABLE GIT_DATE COMMAND "${GIT_EXECUTABLE}" log -1 --date=format:"%Y-%m-%d %T" --format="%ad")
|
|
||||||
execute_process(WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" OUTPUT_VARIABLE GIT_TAG RESULT_VARIABLE rv COMMAND "${GIT_EXECUTABLE}" symbolic-ref -q --short HEAD OUTPUT_STRIP_TRAILING_WHITESPACE)
|
|
||||||
if (rv AND NOT rv EQUAL 0)
|
|
||||||
execute_process(WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" OUTPUT_VARIABLE GIT_TAG COMMAND "${GIT_EXECUTABLE}" describe --tags --exact-match OUTPUT_STRIP_TRAILING_WHITESPACE)
|
|
||||||
endif()
|
|
||||||
else()
|
|
||||||
set(GIT_SHA 0)
|
|
||||||
set(GIT_MOD 1)
|
|
||||||
endif()
|
|
||||||
string(REGEX REPLACE "[^0-9a-fA-F]+" "" GIT_SHA "${GIT_SHA}")
|
|
||||||
string(REGEX REPLACE "[^0-9: /-]+" "" GIT_DATE "${GIT_DATE}")
|
|
||||||
|
|
||||||
option(WITH_MD_LIBRARY "build with MD" ON)
|
option(WITH_MD_LIBRARY "build with MD" ON)
|
||||||
if(WIN32 AND MSVC)
|
if(WIN32 AND MSVC)
|
||||||
if(WITH_MD_LIBRARY)
|
if(WITH_MD_LIBRARY)
|
||||||
@ -211,9 +191,6 @@ if(WIN32 AND MSVC)
|
|||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
set(BUILD_VERSION_CC ${CMAKE_BINARY_DIR}/build_version.cc)
|
|
||||||
configure_file(util/build_version.cc.in ${BUILD_VERSION_CC} @ONLY)
|
|
||||||
|
|
||||||
if(MSVC)
|
if(MSVC)
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Zi /nologo /EHsc /GS /Gd /GR /GF /fp:precise /Zc:wchar_t /Zc:forScope /errorReport:queue")
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Zi /nologo /EHsc /GS /Gd /GR /GF /fp:precise /Zc:wchar_t /Zc:forScope /errorReport:queue")
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /FC /d2Zi+ /W4 /wd4127 /wd4800 /wd4996 /wd4351 /wd4100 /wd4204 /wd4324")
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /FC /d2Zi+ /W4 /wd4127 /wd4800 /wd4996 /wd4351 /wd4100 /wd4204 /wd4324")
|
||||||
@ -1019,6 +996,60 @@ else()
|
|||||||
set(SYSTEM_LIBS ${CMAKE_THREAD_LIBS_INIT})
|
set(SYSTEM_LIBS ${CMAKE_THREAD_LIBS_INIT})
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
set(ROCKSDB_PLUGIN_EXTERNS "")
|
||||||
|
set(ROCKSDB_PLUGIN_BUILTINS "")
|
||||||
|
message(STATUS "ROCKSDB PLUGINS TO BUILD ${ROCKSDB_PLUGINS}")
|
||||||
|
list(APPEND PLUGINS ${ROCKSDB_PLUGINS})
|
||||||
|
foreach(PLUGIN IN LISTS PLUGINS)
|
||||||
|
set(PLUGIN_ROOT "${CMAKE_SOURCE_DIR}/plugin/${PLUGIN}/")
|
||||||
|
message("including rocksb plugin ${PLUGIN_ROOT}")
|
||||||
|
set(PLUGINMKFILE "${PLUGIN_ROOT}${PLUGIN}.mk")
|
||||||
|
if (NOT EXISTS ${PLUGINMKFILE})
|
||||||
|
message(FATAL_ERROR "Missing plugin makefile: ${PLUGINMKFILE}")
|
||||||
|
endif()
|
||||||
|
file(READ ${PLUGINMKFILE} PLUGINMK)
|
||||||
|
string(REGEX MATCH "SOURCES = ([^\n]*)" FOO ${PLUGINMK})
|
||||||
|
set(MK_SOURCES ${CMAKE_MATCH_1})
|
||||||
|
separate_arguments(MK_SOURCES)
|
||||||
|
foreach(MK_FILE IN LISTS MK_SOURCES)
|
||||||
|
list(APPEND SOURCES "${PLUGIN_ROOT}${MK_FILE}")
|
||||||
|
endforeach()
|
||||||
|
string(REGEX MATCH "_FUNC = ([^\n]*)" FOO ${PLUGINMK})
|
||||||
|
if (NOT ${CMAKE_MATCH_1} STREQUAL "")
|
||||||
|
string(APPEND ROCKSDB_PLUGIN_BUILTINS "{\"${PLUGIN}\", " ${CMAKE_MATCH_1} "},")
|
||||||
|
string(APPEND ROCKSDB_PLUGIN_EXTERNS "int " ${CMAKE_MATCH_1} "(ROCKSDB_NAMESPACE::ObjectLibrary&, const std::string&); ")
|
||||||
|
endif()
|
||||||
|
string(REGEX MATCH "_LIBS = ([^\n]*)" FOO ${PLUGINMK})
|
||||||
|
if (NOT ${CMAKE_MATCH_1} STREQUAL "")
|
||||||
|
list(APPEND THIRDPARTY_LIBS "${CMAKE_MATCH_1}")
|
||||||
|
endif()
|
||||||
|
message("THIRDPARTY_LIBS=${THIRDPARTY_LIBS}")
|
||||||
|
#TODO: We need to set any compile/link-time flags and add any link libraries
|
||||||
|
endforeach()
|
||||||
|
|
||||||
|
string(TIMESTAMP TS "%Y-%m-%d %H:%M:%S" UTC)
|
||||||
|
set(BUILD_DATE "${TS}" CACHE STRING "the time we first built rocksdb")
|
||||||
|
|
||||||
|
find_package(Git)
|
||||||
|
|
||||||
|
if(GIT_FOUND AND EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/.git")
|
||||||
|
execute_process(WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" OUTPUT_VARIABLE GIT_SHA COMMAND "${GIT_EXECUTABLE}" rev-parse HEAD )
|
||||||
|
execute_process(WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" RESULT_VARIABLE GIT_MOD COMMAND "${GIT_EXECUTABLE}" diff-index HEAD --quiet)
|
||||||
|
execute_process(WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" OUTPUT_VARIABLE GIT_DATE COMMAND "${GIT_EXECUTABLE}" log -1 --date=format:"%Y-%m-%d %T" --format="%ad")
|
||||||
|
execute_process(WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" OUTPUT_VARIABLE GIT_TAG RESULT_VARIABLE rv COMMAND "${GIT_EXECUTABLE}" symbolic-ref -q --short HEAD OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||||
|
if (rv AND NOT rv EQUAL 0)
|
||||||
|
execute_process(WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" OUTPUT_VARIABLE GIT_TAG COMMAND "${GIT_EXECUTABLE}" describe --tags --exact-match OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||||
|
endif()
|
||||||
|
else()
|
||||||
|
set(GIT_SHA 0)
|
||||||
|
set(GIT_MOD 1)
|
||||||
|
endif()
|
||||||
|
string(REGEX REPLACE "[^0-9a-fA-F]+" "" GIT_SHA "${GIT_SHA}")
|
||||||
|
string(REGEX REPLACE "[^0-9: /-]+" "" GIT_DATE "${GIT_DATE}")
|
||||||
|
|
||||||
|
set(BUILD_VERSION_CC ${CMAKE_BINARY_DIR}/build_version.cc)
|
||||||
|
configure_file(util/build_version.cc.in ${BUILD_VERSION_CC} @ONLY)
|
||||||
|
|
||||||
add_library(${ROCKSDB_STATIC_LIB} STATIC ${SOURCES} ${BUILD_VERSION_CC})
|
add_library(${ROCKSDB_STATIC_LIB} STATIC ${SOURCES} ${BUILD_VERSION_CC})
|
||||||
target_link_libraries(${ROCKSDB_STATIC_LIB} PRIVATE
|
target_link_libraries(${ROCKSDB_STATIC_LIB} PRIVATE
|
||||||
${THIRDPARTY_LIBS} ${SYSTEM_LIBS})
|
${THIRDPARTY_LIBS} ${SYSTEM_LIBS})
|
||||||
|
16
Makefile
16
Makefile
@ -232,14 +232,20 @@ include make_config.mk
|
|||||||
|
|
||||||
ROCKSDB_PLUGIN_MKS = $(foreach plugin, $(ROCKSDB_PLUGINS), plugin/$(plugin)/*.mk)
|
ROCKSDB_PLUGIN_MKS = $(foreach plugin, $(ROCKSDB_PLUGINS), plugin/$(plugin)/*.mk)
|
||||||
include $(ROCKSDB_PLUGIN_MKS)
|
include $(ROCKSDB_PLUGIN_MKS)
|
||||||
ROCKSDB_PLUGIN_SOURCES = $(foreach plugin, $(ROCKSDB_PLUGINS), $(foreach source, $($(plugin)_SOURCES), plugin/$(plugin)/$(source)))
|
ROCKSDB_PLUGIN_PROTO =ROCKSDB_NAMESPACE::ObjectLibrary\&, const std::string\&
|
||||||
ROCKSDB_PLUGIN_HEADERS = $(foreach plugin, $(ROCKSDB_PLUGINS), $(foreach header, $($(plugin)_HEADERS), plugin/$(plugin)/$(header)))
|
ROCKSDB_PLUGIN_SOURCES = $(foreach p, $(ROCKSDB_PLUGINS), $(foreach source, $($(p)_SOURCES), plugin/$(p)/$(source)))
|
||||||
|
ROCKSDB_PLUGIN_HEADERS = $(foreach p, $(ROCKSDB_PLUGINS), $(foreach header, $($(p)_HEADERS), plugin/$(p)/$(header)))
|
||||||
|
ROCKSDB_PLUGIN_LIBS = $(foreach p, $(ROCKSDB_PLUGINS), $(foreach lib, $($(p)_LIBS), -l$(lib)))
|
||||||
|
ROCKSDB_PLUGIN_W_FUNCS = $(foreach p, $(ROCKSDB_PLUGINS), $(if $($(p)_FUNC), $(p)))
|
||||||
|
ROCKSDB_PLUGIN_EXTERNS = $(foreach p, $(ROCKSDB_PLUGIN_W_FUNCS), int $($(p)_FUNC)($(ROCKSDB_PLUGIN_PROTO));)
|
||||||
|
ROCKSDB_PLUGIN_BUILTINS = $(foreach p, $(ROCKSDB_PLUGIN_W_FUNCS), {\"$(p)\"\, $($(p)_FUNC)}\,)
|
||||||
|
ROCKSDB_PLUGIN_LDFLAGS = $(foreach plugin, $(ROCKSDB_PLUGINS), $($(plugin)_LDFLAGS))
|
||||||
ROCKSDB_PLUGIN_PKGCONFIG_REQUIRES = $(foreach plugin, $(ROCKSDB_PLUGINS), $($(plugin)_PKGCONFIG_REQUIRES))
|
ROCKSDB_PLUGIN_PKGCONFIG_REQUIRES = $(foreach plugin, $(ROCKSDB_PLUGINS), $($(plugin)_PKGCONFIG_REQUIRES))
|
||||||
|
|
||||||
CXXFLAGS += $(foreach plugin, $(ROCKSDB_PLUGINS), $($(plugin)_CXXFLAGS))
|
CXXFLAGS += $(foreach plugin, $(ROCKSDB_PLUGINS), $($(plugin)_CXXFLAGS))
|
||||||
|
PLATFORM_LDFLAGS += $(ROCKSDB_PLUGIN_LDFLAGS)
|
||||||
|
|
||||||
# Patch up the link flags for JNI from the plugins
|
# Patch up the link flags for JNI from the plugins
|
||||||
ROCKSDB_PLUGIN_LDFLAGS = $(foreach plugin, $(ROCKSDB_PLUGINS), $($(plugin)_LDFLAGS))
|
|
||||||
PLATFORM_LDFLAGS += $(ROCKSDB_PLUGIN_LDFLAGS)
|
|
||||||
JAVA_LDFLAGS += $(ROCKSDB_PLUGIN_LDFLAGS)
|
JAVA_LDFLAGS += $(ROCKSDB_PLUGIN_LDFLAGS)
|
||||||
JAVA_STATIC_LDFLAGS += $(ROCKSDB_PLUGIN_LDFLAGS)
|
JAVA_STATIC_LDFLAGS += $(ROCKSDB_PLUGIN_LDFLAGS)
|
||||||
|
|
||||||
@ -728,7 +734,7 @@ else
|
|||||||
git_mod := $(shell git diff-index HEAD --quiet 2>/dev/null; echo $$?)
|
git_mod := $(shell git diff-index HEAD --quiet 2>/dev/null; echo $$?)
|
||||||
git_date := $(shell git log -1 --date=format:"%Y-%m-%d %T" --format="%ad" 2>/dev/null)
|
git_date := $(shell git log -1 --date=format:"%Y-%m-%d %T" --format="%ad" 2>/dev/null)
|
||||||
endif
|
endif
|
||||||
gen_build_version = sed -e s/@GIT_SHA@/$(git_sha)/ -e s:@GIT_TAG@:"$(git_tag)": -e s/@GIT_MOD@/"$(git_mod)"/ -e s/@BUILD_DATE@/"$(build_date)"/ -e s/@GIT_DATE@/"$(git_date)"/ util/build_version.cc.in
|
gen_build_version = sed -e s/@GIT_SHA@/$(git_sha)/ -e s:@GIT_TAG@:"$(git_tag)": -e s/@GIT_MOD@/"$(git_mod)"/ -e s/@BUILD_DATE@/"$(build_date)"/ -e s/@GIT_DATE@/"$(git_date)"/ -e s/@ROCKSDB_PLUGIN_BUILTINS@/'$(ROCKSDB_PLUGIN_BUILTINS)'/ -e s/@ROCKSDB_PLUGIN_EXTERNS@/"$(ROCKSDB_PLUGIN_EXTERNS)"/ util/build_version.cc.in
|
||||||
|
|
||||||
# Record the version of the source that we are compiling.
|
# Record the version of the source that we are compiling.
|
||||||
# We keep a record of the git revision in this file. It is then built
|
# We keep a record of the git revision in this file. It is then built
|
||||||
|
@ -280,9 +280,7 @@ class ObjectRegistry {
|
|||||||
static std::shared_ptr<ObjectRegistry> Default();
|
static std::shared_ptr<ObjectRegistry> Default();
|
||||||
explicit ObjectRegistry(const std::shared_ptr<ObjectRegistry>& parent)
|
explicit ObjectRegistry(const std::shared_ptr<ObjectRegistry>& parent)
|
||||||
: parent_(parent) {}
|
: parent_(parent) {}
|
||||||
explicit ObjectRegistry(const std::shared_ptr<ObjectLibrary>& library) {
|
explicit ObjectRegistry(const std::shared_ptr<ObjectLibrary>& library);
|
||||||
libraries_.push_back(library);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::shared_ptr<ObjectLibrary> AddLibrary(const std::string& id) {
|
std::shared_ptr<ObjectLibrary> AddLibrary(const std::string& id) {
|
||||||
auto library = std::make_shared<ObjectLibrary>(id);
|
auto library = std::make_shared<ObjectLibrary>(id);
|
||||||
@ -502,6 +500,9 @@ class ObjectRegistry {
|
|||||||
// Dump the contents of the registry to the logger
|
// Dump the contents of the registry to the logger
|
||||||
void Dump(Logger* logger) const;
|
void Dump(Logger* logger) const;
|
||||||
|
|
||||||
|
// Invokes the input function to retrieve the properties for this plugin.
|
||||||
|
int RegisterPlugin(const std::string& name, const RegistrarFunc& func);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static std::string ToManagedObjectKey(const std::string& type,
|
static std::string ToManagedObjectKey(const std::string& type,
|
||||||
const std::string& id) {
|
const std::string& id) {
|
||||||
@ -548,6 +549,8 @@ class ObjectRegistry {
|
|||||||
// The libraries are searched in reverse order (back to front) when
|
// The libraries are searched in reverse order (back to front) when
|
||||||
// searching for entries.
|
// searching for entries.
|
||||||
std::vector<std::shared_ptr<ObjectLibrary>> libraries_;
|
std::vector<std::shared_ptr<ObjectLibrary>> libraries_;
|
||||||
|
std::vector<std::string> plugins_;
|
||||||
|
static std::unordered_map<std::string, RegistrarFunc> builtins_;
|
||||||
std::map<std::string, std::weak_ptr<Customizable>> managed_objects_;
|
std::map<std::string, std::weak_ptr<Customizable>> managed_objects_;
|
||||||
std::shared_ptr<ObjectRegistry> parent_;
|
std::shared_ptr<ObjectRegistry> parent_;
|
||||||
mutable std::mutex objects_mutex_; // Mutex for managed objects
|
mutable std::mutex objects_mutex_; // Mutex for managed objects
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
#include "rocksdb/version.h"
|
#include "rocksdb/version.h"
|
||||||
|
#include "rocksdb/utilities/object_registry.h"
|
||||||
#include "util/string_util.h"
|
#include "util/string_util.h"
|
||||||
|
|
||||||
// The build script may replace these values with real values based
|
// The build script may replace these values with real values based
|
||||||
@ -20,6 +21,16 @@ static const std::string rocksdb_build_date = "rocksdb_build_date:@GIT_DATE@";
|
|||||||
static const std::string rocksdb_build_date = "rocksdb_build_date:@BUILD_DATE@";
|
static const std::string rocksdb_build_date = "rocksdb_build_date:@BUILD_DATE@";
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef ROCKSDB_LITE
|
||||||
|
extern "C" {
|
||||||
|
@ROCKSDB_PLUGIN_EXTERNS@
|
||||||
|
} // extern "C"
|
||||||
|
|
||||||
|
std::unordered_map<std::string, ROCKSDB_NAMESPACE::RegistrarFunc> ROCKSDB_NAMESPACE::ObjectRegistry::builtins_ = {
|
||||||
|
@ROCKSDB_PLUGIN_BUILTINS@
|
||||||
|
};
|
||||||
|
#endif //ROCKSDB_LITE
|
||||||
|
|
||||||
namespace ROCKSDB_NAMESPACE {
|
namespace ROCKSDB_NAMESPACE {
|
||||||
static void AddProperty(std::unordered_map<std::string, std::string> *props, const std::string& name) {
|
static void AddProperty(std::unordered_map<std::string, std::string> *props, const std::string& name) {
|
||||||
size_t colon = name.find(":");
|
size_t colon = name.find(":");
|
||||||
|
@ -159,6 +159,8 @@ size_t ObjectLibrary::GetFactoryCount(size_t *types) const {
|
|||||||
|
|
||||||
void ObjectLibrary::Dump(Logger *logger) const {
|
void ObjectLibrary::Dump(Logger *logger) const {
|
||||||
std::unique_lock<std::mutex> lock(mu_);
|
std::unique_lock<std::mutex> lock(mu_);
|
||||||
|
if (logger != nullptr && !factories_.empty()) {
|
||||||
|
ROCKS_LOG_HEADER(logger, " Registered Library: %s\n", id_.c_str());
|
||||||
for (const auto &iter : factories_) {
|
for (const auto &iter : factories_) {
|
||||||
ROCKS_LOG_HEADER(logger, " Registered factories for type[%s] ",
|
ROCKS_LOG_HEADER(logger, " Registered factories for type[%s] ",
|
||||||
iter.first.c_str());
|
iter.first.c_str());
|
||||||
@ -168,7 +170,7 @@ void ObjectLibrary::Dump(Logger *logger) const {
|
|||||||
printed_one = true;
|
printed_one = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ROCKS_LOG_HEADER(logger, "\n");
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Returns the Default singleton instance of the ObjectLibrary
|
// Returns the Default singleton instance of the ObjectLibrary
|
||||||
@ -181,6 +183,13 @@ std::shared_ptr<ObjectLibrary> &ObjectLibrary::Default() {
|
|||||||
return instance;
|
return instance;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ObjectRegistry::ObjectRegistry(const std::shared_ptr<ObjectLibrary> &library) {
|
||||||
|
libraries_.push_back(library);
|
||||||
|
for (const auto &b : builtins_) {
|
||||||
|
RegisterPlugin(b.first, b.second);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
std::shared_ptr<ObjectRegistry> ObjectRegistry::Default() {
|
std::shared_ptr<ObjectRegistry> ObjectRegistry::Default() {
|
||||||
// Use avoid destruction here so the default ObjectRegistry will not be
|
// Use avoid destruction here so the default ObjectRegistry will not be
|
||||||
// statically destroyed and long-lived.
|
// statically destroyed and long-lived.
|
||||||
@ -268,8 +277,18 @@ Status ObjectRegistry::ListManagedObjects(
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ObjectRegistry::Dump(Logger *logger) const {
|
void ObjectRegistry::Dump(Logger *logger) const {
|
||||||
{
|
if (logger != nullptr) {
|
||||||
std::unique_lock<std::mutex> lock(library_mutex_);
|
std::unique_lock<std::mutex> lock(library_mutex_);
|
||||||
|
if (!plugins_.empty()) {
|
||||||
|
ROCKS_LOG_HEADER(logger, " Registered Plugins:");
|
||||||
|
bool printed_one = false;
|
||||||
|
for (const auto &plugin : plugins_) {
|
||||||
|
ROCKS_LOG_HEADER(logger, "%s%s", (printed_one) ? ", " : " ",
|
||||||
|
plugin.c_str());
|
||||||
|
printed_one = true;
|
||||||
|
}
|
||||||
|
ROCKS_LOG_HEADER(logger, "\n");
|
||||||
|
}
|
||||||
for (auto iter = libraries_.crbegin(); iter != libraries_.crend(); ++iter) {
|
for (auto iter = libraries_.crbegin(); iter != libraries_.crend(); ++iter) {
|
||||||
iter->get()->Dump(logger);
|
iter->get()->Dump(logger);
|
||||||
}
|
}
|
||||||
@ -279,5 +298,15 @@ void ObjectRegistry::Dump(Logger *logger) const {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int ObjectRegistry::RegisterPlugin(const std::string &name,
|
||||||
|
const RegistrarFunc &func) {
|
||||||
|
if (!name.empty() && func != nullptr) {
|
||||||
|
plugins_.push_back(name);
|
||||||
|
return AddLibrary(name)->Register(func, name);
|
||||||
|
} else {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#endif // ROCKSDB_LITE
|
#endif // ROCKSDB_LITE
|
||||||
} // namespace ROCKSDB_NAMESPACE
|
} // namespace ROCKSDB_NAMESPACE
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
|
|
||||||
#include "rocksdb/utilities/object_registry.h"
|
#include "rocksdb/utilities/object_registry.h"
|
||||||
|
|
||||||
|
#include "rocksdb/convenience.h"
|
||||||
#include "rocksdb/customizable.h"
|
#include "rocksdb/customizable.h"
|
||||||
#include "test_util/testharness.h"
|
#include "test_util/testharness.h"
|
||||||
|
|
||||||
@ -117,23 +118,25 @@ TEST_F(ObjRegistryTest, LocalRegistry) {
|
|||||||
ASSERT_NE(env, nullptr);
|
ASSERT_NE(env, nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ObjRegistryTest, CheckShared) {
|
static int RegisterTestUnguarded(ObjectLibrary& library,
|
||||||
std::shared_ptr<Env> shared;
|
const std::string& /*arg*/) {
|
||||||
std::shared_ptr<ObjectRegistry> registry = ObjectRegistry::NewInstance();
|
library.AddFactory<Env>(
|
||||||
std::shared_ptr<ObjectLibrary> library =
|
|
||||||
std::make_shared<ObjectLibrary>("shared");
|
|
||||||
registry->AddLibrary(library);
|
|
||||||
library->AddFactory<Env>(
|
|
||||||
"unguarded",
|
"unguarded",
|
||||||
[](const std::string& /*uri*/, std::unique_ptr<Env>* /*guard */,
|
[](const std::string& /*uri*/, std::unique_ptr<Env>* /*guard */,
|
||||||
std::string* /* errmsg */) { return Env::Default(); });
|
std::string* /* errmsg */) { return Env::Default(); });
|
||||||
|
library.AddFactory<Env>(
|
||||||
library->AddFactory<Env>(
|
|
||||||
"guarded", [](const std::string& uri, std::unique_ptr<Env>* guard,
|
"guarded", [](const std::string& uri, std::unique_ptr<Env>* guard,
|
||||||
std::string* /* errmsg */) {
|
std::string* /* errmsg */) {
|
||||||
guard->reset(new WrappedEnv(Env::Default(), uri));
|
guard->reset(new WrappedEnv(Env::Default(), uri));
|
||||||
return guard->get();
|
return guard->get();
|
||||||
});
|
});
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(ObjRegistryTest, CheckShared) {
|
||||||
|
std::shared_ptr<Env> shared;
|
||||||
|
std::shared_ptr<ObjectRegistry> registry = ObjectRegistry::NewInstance();
|
||||||
|
registry->AddLibrary("shared", RegisterTestUnguarded, "");
|
||||||
|
|
||||||
ASSERT_OK(registry->NewSharedObject<Env>("guarded", &shared));
|
ASSERT_OK(registry->NewSharedObject<Env>("guarded", &shared));
|
||||||
ASSERT_NE(shared, nullptr);
|
ASSERT_NE(shared, nullptr);
|
||||||
@ -145,20 +148,7 @@ TEST_F(ObjRegistryTest, CheckShared) {
|
|||||||
TEST_F(ObjRegistryTest, CheckStatic) {
|
TEST_F(ObjRegistryTest, CheckStatic) {
|
||||||
Env* env = nullptr;
|
Env* env = nullptr;
|
||||||
std::shared_ptr<ObjectRegistry> registry = ObjectRegistry::NewInstance();
|
std::shared_ptr<ObjectRegistry> registry = ObjectRegistry::NewInstance();
|
||||||
std::shared_ptr<ObjectLibrary> library =
|
registry->AddLibrary("static", RegisterTestUnguarded, "");
|
||||||
std::make_shared<ObjectLibrary>("static");
|
|
||||||
registry->AddLibrary(library);
|
|
||||||
library->AddFactory<Env>(
|
|
||||||
"unguarded",
|
|
||||||
[](const std::string& /*uri*/, std::unique_ptr<Env>* /*guard */,
|
|
||||||
std::string* /* errmsg */) { return Env::Default(); });
|
|
||||||
|
|
||||||
library->AddFactory<Env>(
|
|
||||||
"guarded", [](const std::string& uri, std::unique_ptr<Env>* guard,
|
|
||||||
std::string* /* errmsg */) {
|
|
||||||
guard->reset(new WrappedEnv(Env::Default(), uri));
|
|
||||||
return guard->get();
|
|
||||||
});
|
|
||||||
|
|
||||||
ASSERT_NOK(registry->NewStaticObject<Env>("guarded", &env));
|
ASSERT_NOK(registry->NewStaticObject<Env>("guarded", &env));
|
||||||
ASSERT_EQ(env, nullptr);
|
ASSERT_EQ(env, nullptr);
|
||||||
@ -170,20 +160,7 @@ TEST_F(ObjRegistryTest, CheckStatic) {
|
|||||||
TEST_F(ObjRegistryTest, CheckUnique) {
|
TEST_F(ObjRegistryTest, CheckUnique) {
|
||||||
std::unique_ptr<Env> unique;
|
std::unique_ptr<Env> unique;
|
||||||
std::shared_ptr<ObjectRegistry> registry = ObjectRegistry::NewInstance();
|
std::shared_ptr<ObjectRegistry> registry = ObjectRegistry::NewInstance();
|
||||||
std::shared_ptr<ObjectLibrary> library =
|
registry->AddLibrary("unique", RegisterTestUnguarded, "");
|
||||||
std::make_shared<ObjectLibrary>("unique");
|
|
||||||
registry->AddLibrary(library);
|
|
||||||
library->AddFactory<Env>(
|
|
||||||
"unguarded",
|
|
||||||
[](const std::string& /*uri*/, std::unique_ptr<Env>* /*guard */,
|
|
||||||
std::string* /* errmsg */) { return Env::Default(); });
|
|
||||||
|
|
||||||
library->AddFactory<Env>(
|
|
||||||
"guarded", [](const std::string& uri, std::unique_ptr<Env>* guard,
|
|
||||||
std::string* /* errmsg */) {
|
|
||||||
guard->reset(new WrappedEnv(Env::Default(), uri));
|
|
||||||
return guard->get();
|
|
||||||
});
|
|
||||||
|
|
||||||
ASSERT_OK(registry->NewUniqueObject<Env>("guarded", &unique));
|
ASSERT_OK(registry->NewUniqueObject<Env>("guarded", &unique));
|
||||||
ASSERT_NE(unique, nullptr);
|
ASSERT_NE(unique, nullptr);
|
||||||
@ -268,6 +245,7 @@ TEST_F(ObjRegistryTest, TestRegistryParents) {
|
|||||||
ASSERT_NOK(child->NewUniqueObject<Env>("cousin", &guard));
|
ASSERT_NOK(child->NewUniqueObject<Env>("cousin", &guard));
|
||||||
ASSERT_NOK(uncle->NewUniqueObject<Env>("cousin", &guard));
|
ASSERT_NOK(uncle->NewUniqueObject<Env>("cousin", &guard));
|
||||||
}
|
}
|
||||||
|
|
||||||
class MyCustomizable : public Customizable {
|
class MyCustomizable : public Customizable {
|
||||||
public:
|
public:
|
||||||
static const char* Type() { return "MyCustomizable"; }
|
static const char* Type() { return "MyCustomizable"; }
|
||||||
@ -493,6 +471,18 @@ TEST_F(ObjRegistryTest, TestGetOrCreateManagedObject) {
|
|||||||
ASSERT_EQ(2, obj.use_count());
|
ASSERT_EQ(2, obj.use_count());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_F(ObjRegistryTest, RegisterPlugin) {
|
||||||
|
std::shared_ptr<ObjectRegistry> registry = ObjectRegistry::NewInstance();
|
||||||
|
std::unique_ptr<Env> guard;
|
||||||
|
Env* env = nullptr;
|
||||||
|
|
||||||
|
ASSERT_NOK(registry->NewObject<Env>("unguarded", &env, &guard));
|
||||||
|
ASSERT_EQ(registry->RegisterPlugin("Missing", nullptr), -1);
|
||||||
|
ASSERT_EQ(registry->RegisterPlugin("", RegisterTestUnguarded), -1);
|
||||||
|
ASSERT_GT(registry->RegisterPlugin("Valid", RegisterTestUnguarded), 0);
|
||||||
|
ASSERT_OK(registry->NewObject<Env>("unguarded", &env, &guard));
|
||||||
|
ASSERT_NE(env, nullptr);
|
||||||
|
}
|
||||||
class PatternEntryTest : public testing::Test {};
|
class PatternEntryTest : public testing::Test {};
|
||||||
|
|
||||||
TEST_F(PatternEntryTest, TestSimpleEntry) {
|
TEST_F(PatternEntryTest, TestSimpleEntry) {
|
||||||
|
Loading…
Reference in New Issue
Block a user