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)
#include "auth/Crypto.h"
#include "common/armor.h"
-static constexpr int dout_subsys = ceph_subsys_objclass;
-
-static ClassHandler *ch;
-
-void cls_initialize(ClassHandler *h)
-{
- ch = h;
-}
+#define dout_context ClassHandler::get_instance().cct
+static constexpr int dout_subsys = ceph_subsys_objclass;
void *cls_alloc(size_t size)
{
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);
}
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;
}
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;
}
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';
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;
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})
return ret;
}
+ClassHandler& ClassHandler::get_instance()
+{
+ static ClassHandler single(g_ceph_context);
+ return single;
+}
void unregister_class(ClassData *cls);
void shutdown();
+
+ static ClassHandler& get_instance();
};
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")},
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;
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);
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;
}
op_tracker.on_shutdown();
- class_handler->shutdown();
+ ClassHandler::get_instance().shutdown();
client_messenger->shutdown();
cluster_messenger->shutdown();
hb_front_client_messenger->shutdown();
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)
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;
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) {
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;
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());