Merge pull request #29322 from rzarzynski/wip-objclass-cleanup

objclass, osd: clean up the cls-host interface. Turn ClassHandler into singleton

Reviewed-by: Neha Ojha <nojha@redhat.com>
Reviewed-by: Kefu Chai <kchai@redhat.com>
This commit is contained in:
Kefu Chai 2019-08-03 20:25:39 +08:00 committed by GitHub
commit 79b88eaf7c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 25 additions and 35 deletions

View File

@ -513,6 +513,9 @@ add_subdirectory(os)
add_subdirectory(osd)
set(ceph_osd_srcs
# Link the Object Class API implementation directly as intermediary
# static library (like libosd.a) nullifies the effect of `-rdynamic`.
objclass/class_api.cc
ceph_osd.cc)
add_executable(ceph-osd ${ceph_osd_srcs})
add_dependencies(ceph-osd erasure_code_plugins)

View File

@ -13,21 +13,10 @@
#include "auth/Crypto.h"
#include "common/armor.h"
#define dout_context ClassHandler::get_instance().cct
static constexpr int dout_subsys = ceph_subsys_objclass;
static ClassHandler *ch;
void cls_initialize(ClassHandler *h)
{
ch = h;
}
void cls_finalize()
{
ch = NULL;
}
void *cls_alloc(size_t size)
{
return malloc(size);
@ -40,7 +29,8 @@ void cls_free(void *p)
int cls_register(const char *name, cls_handle_t *handle)
{
ClassHandler::ClassData *cls = ch->register_class(name);
ClassHandler::ClassData *cls = \
ClassHandler::get_instance().register_class(name);
*handle = (cls_handle_t)cls;
return (cls != NULL);
}
@ -48,7 +38,7 @@ int cls_register(const char *name, cls_handle_t *handle)
int cls_unregister(cls_handle_t handle)
{
ClassHandler::ClassData *cls = (ClassHandler::ClassData *)handle;
ch->unregister_class(cls);
ClassHandler::get_instance().unregister_class(cls);
return 1;
}
@ -646,7 +636,7 @@ int cls_cxx_list_watchers(cls_method_context_t hctx,
int cls_gen_random_bytes(char *buf, int size)
{
ch->cct->random()->get_bytes(buf, size);
ClassHandler::get_instance().cct->random()->get_bytes(buf, size);
return 0;
}
@ -658,14 +648,14 @@ int cls_gen_rand_base64(char *dest, int size) /* size should be the required str
ret = cls_gen_random_bytes(buf, sizeof(buf));
if (ret < 0) {
lgeneric_derr(ch->cct) << "cannot get random bytes: " << ret << dendl;
derr << "cannot get random bytes: " << ret << dendl;
return -1;
}
ret = ceph_armor(tmp_dest, &tmp_dest[sizeof(tmp_dest)],
(const char *)buf, ((const char *)buf) + ((size - 1) * 3 + 4 - 1) / 4);
if (ret < 0) {
lgeneric_derr(ch->cct) << "ceph_armor failed" << dendl;
derr << "ceph_armor failed" << dendl;
return -1;
}
tmp_dest[ret] = '\0';
@ -748,7 +738,7 @@ int cls_log(int level, const char *format, ...)
va_end(ap);
#define MAX_SIZE 8196
if ((n > -1 && n < size) || size > MAX_SIZE) {
ldout(ch->cct, ceph::dout::need_dynamic(level)) << buf << dendl;
dout(ceph::dout::need_dynamic(level)) << buf << dendl;
return n;
}
size *= 2;

View File

@ -38,7 +38,6 @@ set(osd_srcs
MissingLoc.cc
osd_perf_counters.cc
${CMAKE_SOURCE_DIR}/src/common/TrackedOp.cc
${CMAKE_SOURCE_DIR}/src/objclass/class_api.cc
${CMAKE_SOURCE_DIR}/src/mgr/OSDPerfMetricTypes.cc
${osd_cyg_functions_src}
${osdc_osd_srcs})

View File

@ -327,3 +327,8 @@ int ClassHandler::ClassMethod::exec(cls_method_context_t ctx, bufferlist& indata
return ret;
}
ClassHandler& ClassHandler::get_instance()
{
static ClassHandler single(g_ceph_context);
return single;
}

View File

@ -115,9 +115,9 @@ private:
static bool in_class_list(const std::string& cname,
const std::string& list);
public:
ceph::mutex mutex = ceph::make_mutex("ClassHandler");
public:
explicit ClassHandler(CephContext *cct_) : cct(cct_) {}
int open_all_classes();
@ -127,6 +127,8 @@ public:
void unregister_class(ClassData *cls);
void shutdown();
static ClassHandler& get_instance();
};

View File

@ -226,7 +226,6 @@ OSDService::OSDService(OSD *osd) :
logger(osd->logger),
recoverystate_perf(osd->recoverystate_perf),
monc(osd->monc),
class_handler(osd->class_handler),
osd_max_object_size(cct->_conf, "osd_max_object_size"),
osd_skip_data_digest(cct->_conf, "osd_skip_data_digest"),
publish_lock{ceph::make_mutex("OSDService::publish_lock")},
@ -2152,7 +2151,6 @@ OSD::~OSD()
delete shards.back();
shards.pop_back();
}
delete class_handler;
cct->get_perfcounters_collection()->remove(recoverystate_perf);
cct->get_perfcounters_collection()->remove(logger);
delete recoverystate_perf;
@ -2168,8 +2166,6 @@ double OSD::get_tick_interval() const
ceph::util::generate_random_number(1.0 - delta, 1.0 + delta));
}
void cls_initialize(ClassHandler *ch);
void OSD::handle_signal(int signum)
{
ceph_assert(signum == SIGINT || signum == SIGTERM);
@ -2875,11 +2871,8 @@ int OSD::init()
goto out;
}
class_handler = new ClassHandler(cct);
cls_initialize(class_handler);
if (cct->_conf->osd_open_classes_on_start) {
int r = class_handler->open_all_classes();
int r = ClassHandler::get_instance().open_all_classes();
if (r)
dout(1) << "warning: got an error loading one or more classes: " << cpp_strerror(r) << dendl;
}
@ -3531,7 +3524,7 @@ int OSD::shutdown()
op_tracker.on_shutdown();
class_handler->shutdown();
ClassHandler::get_instance().shutdown();
client_messenger->shutdown();
cluster_messenger->shutdown();
hb_front_client_messenger->shutdown();
@ -9876,7 +9869,7 @@ int OSD::init_op_flags(OpRequestRef& op)
bp.copy(iter->op.cls.method_len, mname);
ClassHandler::ClassData *cls;
int r = class_handler->open_class(cname, &cls);
int r = ClassHandler::get_instance().open_class(cname, &cls);
if (r) {
derr << "class " << cname << " open got " << cpp_strerror(r) << dendl;
if (r == -ENOENT)

View File

@ -120,7 +120,6 @@ public:
PerfCounters *&logger;
PerfCounters *&recoverystate_perf;
MonClient *&monc;
ClassHandler *&class_handler;
md_config_cacher_t<Option::size_t> osd_max_object_size;
md_config_cacher_t<bool> osd_skip_data_digest;
@ -1164,7 +1163,6 @@ protected:
std::string_view format, std::ostream& ss);
public:
ClassHandler *class_handler = nullptr;
int get_nodeid() { return whoami; }
static ghobject_t get_osdmap_pobject_name(epoch_t epoch) {

View File

@ -887,7 +887,7 @@ int PrimaryLogPG::get_pgls_filter(bufferlist::const_iterator& iter, PGLSFilter *
const std::string class_name = type.substr(0, dot);
const std::string filter_name = type.substr(dot + 1);
ClassHandler::ClassData *cls = NULL;
int r = osd->class_handler->open_class(class_name, &cls);
int r = ClassHandler::get_instance().open_class(class_name, &cls);
if (r != 0) {
derr << "Error opening class '" << class_name << "': "
<< cpp_strerror(r) << dendl;
@ -5767,7 +5767,7 @@ int PrimaryLogPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops)
tracepoint(osd, do_osd_op_pre_call, soid.oid.name.c_str(), soid.snap.val, cname.c_str(), mname.c_str());
ClassHandler::ClassData *cls;
result = osd->class_handler->open_class(cname, &cls);
result = ClassHandler::get_instance().open_class(cname, &cls);
ceph_assert(result == 0); // init_op_flags() already verified this works.
ClassHandler::ClassMethod *method = cls->get_method(mname.c_str());