# osd
ceph_osd_SOURCES = ceph_osd.cc
-ceph_osd_LDADD = libosd.a $(LIBOS_LDA) $(LIBGLOBAL_LDA)
+ceph_osd_LDADD = libosd.a libosdc.la $(LIBOS_LDA) $(LIBGLOBAL_LDA)
ceph_osd_CXXFLAGS = ${AM_CXXFLAGS}
bin_PROGRAMS += ceph-osd
ceph_authtool_LDADD = $(LIBGLOBAL_LDA)
ceph_filestore_dump_SOURCES = tools/ceph-filestore-dump.cc
ceph_filestore_dump_SOURCES += perfglue/disabled_heap_profiler.cc
-ceph_filestore_dump_LDADD = libosd.a $(LIBOS_LDA) $(LIBGLOBAL_LDA) -lboost_program_options
+ceph_filestore_dump_LDADD = libosd.a libosdc.la $(LIBOS_LDA) $(LIBGLOBAL_LDA) -lboost_program_options
if LINUX
ceph_filestore_dump_LDADD += -ldl
endif
unittest_pglog_SOURCES = test/osd/TestPGLog.cc perfglue/disabled_heap_profiler.cc
unittest_pglog_CXXFLAGS = ${AM_CXXFLAGS} ${UNITTEST_CXXFLAGS}
-unittest_pglog_LDADD = libosd.a $(LIBOS_LDA) $(LIBGLOBAL_LDA) ${UNITTEST_LDADD}
+unittest_pglog_LDADD = libosd.a libosdc.la $(LIBOS_LDA) $(LIBGLOBAL_LDA) ${UNITTEST_LDADD}
check_PROGRAMS += unittest_pglog
if LINUX
osd/OpRequest.cc \
osd/SnapMapper.cc \
objclass/class_api.cc
-libosd_a_CXXFLAGS= ${AM_CXXFLAGS}
+libosd_a_CXXFLAGS = ${AM_CXXFLAGS}
noinst_LIBRARIES += libosd.a
libosdc_la_SOURCES = \
#include "OSD.h"
#include "OSDMap.h"
#include "Watch.h"
+#include "osdc/Objecter.h"
#include "common/ceph_argparse.h"
#include "common/version.h"
pre_publish_lock("OSDService::pre_publish_lock"),
sched_scrub_lock("OSDService::sched_scrub_lock"), scrubs_pending(0),
scrubs_active(0),
+ objecter_lock("OSD::objecter_lock"),
+ objecter_timer(osd->client_messenger->cct, objecter_lock),
+ objecter(new Objecter(osd->client_messenger->cct, osd->objecter_messenger, osd->monc, &objecter_osdmap,
+ objecter_lock, objecter_timer)),
+ objecter_finisher(osd->client_messenger->cct),
+ objecter_dispatcher(this),
watch_lock("OSD::watch_lock"),
watch_timer(osd->client_messenger->cct, watch_lock),
next_notif_id(0),
#endif
{}
+OSDService::~OSDService()
+{
+ delete objecter;
+}
+
void OSDService::_start_split(pg_t parent, const set<pg_t> &children)
{
for (set<pg_t>::const_iterator i = children.begin();
Mutex::Locker l(watch_lock);
watch_timer.shutdown();
}
+
+ {
+ Mutex::Locker l(objecter_lock);
+ objecter_timer.shutdown();
+ objecter->shutdown_locked();
+ }
+ objecter->shutdown_unlocked();
+ objecter_finisher.stop();
+
{
Mutex::Locker l(backfill_request_lock);
backfill_request_timer.shutdown();
void OSDService::init()
{
reserver_finisher.start();
+ {
+ objecter_finisher.start();
+ objecter->init_unlocked();
+ Mutex::Locker l(objecter_lock);
+ objecter_timer.init();
+ objecter->set_client_incarnation(0);
+ objecter->init_locked();
+ }
watch_timer.init();
}
hb_front_server_messenger->add_dispatcher_head(&heartbeat_dispatcher);
hb_back_server_messenger->add_dispatcher_head(&heartbeat_dispatcher);
+ objecter_messenger->add_dispatcher_head(&service.objecter_dispatcher);
+
monc->set_want_keys(CEPH_ENTITY_TYPE_MON | CEPH_ENTITY_TYPE_OSD);
r = monc->init();
if (r < 0)
return true;
}
+bool OSDService::ObjecterDispatcher::ms_dispatch(Message *m)
+{
+ Mutex::Locker l(osd->objecter_lock);
+ osd->objecter->dispatch(m);
+ return true;
+}
+
+bool OSDService::ObjecterDispatcher::ms_handle_reset(Connection *con)
+{
+ Mutex::Locker l(osd->objecter_lock);
+ osd->objecter->ms_handle_reset(con);
+ return true;
+}
+
+void OSDService::ObjecterDispatcher::ms_handle_connect(Connection *con)
+{
+ Mutex::Locker l(osd->objecter_lock);
+ return osd->objecter->ms_handle_connect(con);
+}
+
+bool OSDService::ObjecterDispatcher::ms_get_authorizer(int dest_type,
+ AuthAuthorizer **authorizer,
+ bool force_new)
+{
+ if (dest_type == CEPH_ENTITY_TYPE_MON)
+ return true;
+ *authorizer = osd->monc->auth->build_authorizer(dest_type);
+ return *authorizer != NULL;
+}
+
+
bool OSD::ms_dispatch(Message *m)
{
if (m->get_type() == MSG_OSD_MARK_ME_DOWN) {
class MLog;
class MClass;
class MOSDPGMissing;
+class Objecter;
class Watch;
class Notification;
void reply_op_error(OpRequestRef op, int err, eversion_t v, version_t uv);
void handle_misdirected_op(PG *pg, OpRequestRef op);
+ // -- Objecter, for teiring reads/writes from/to other OSDs --
+ Mutex objecter_lock;
+ SafeTimer objecter_timer;
+ OSDMap objecter_osdmap;
+ Objecter *objecter;
+ Finisher objecter_finisher;
+ struct ObjecterDispatcher : public Dispatcher {
+ OSDService *osd;
+ bool ms_dispatch(Message *m);
+ bool ms_handle_reset(Connection *con);
+ void ms_handle_remote_reset(Connection *con) {}
+ void ms_handle_connect(Connection *con);
+ bool ms_get_authorizer(int dest_type,
+ AuthAuthorizer **authorizer,
+ bool force_new);
+ ObjecterDispatcher(OSDService *o) : Dispatcher(g_ceph_context), osd(o) {}
+ } objecter_dispatcher;
+ friend class ObjecterDispatcher;
+
+
// -- Watch --
Mutex watch_lock;
SafeTimer watch_timer;
#endif
OSDService(OSD *osd);
+ ~OSDService();
};
class OSD : public Dispatcher,
public md_config_obs_t {