// Did I previously not hold a rank? Initialize!
if (mds_rank == NULL) {
- mds_rank = new MDSRank(mds_lock, clog, timer, beacon, mdsmap, messenger,
- monc, objecter,
+ mds_rank = new MDSRankDispatcher(mds_lock, clog, timer, beacon, mdsmap,
+ messenger, monc, objecter,
new C_VoidFn(this, &MDS::respawn),
new C_VoidFn(this, &MDS::suicide));
mds_rank->init(whoami, incarnation);
LogClient log_client;
LogChannelRef clog;
- MDSRank *mds_rank;
+ MDSRankDispatcher *mds_rank;
public:
MDS(const std::string &n, Messenger *m, MonClient *mc);
respawn_hook = NULL;
}
-void MDSRank::init(mds_rank_t rank_, int incarnation_)
+void MDSRankDispatcher::init(mds_rank_t rank_, int incarnation_)
{
update_log_config();
create_logger();
finisher->start();
}
-void MDSRank::tick()
+void MDSRankDispatcher::tick()
{
heartbeat_reset();
}
}
-void MDSRank::shutdown()
+void MDSRankDispatcher::shutdown()
{
// It should never be possible for shutdown to get called twice, because
// anyone picking up mds_lock checks if stopping is true and drops
}
}
-bool MDSRank::ms_dispatch(Message *m)
+bool MDSRankDispatcher::ms_dispatch(Message *m)
{
bool ret;
inc_dispatch_depth();
// <<<<<<<<
-void MDSRank::handle_mds_map(
+void MDSRankDispatcher::handle_mds_map(
MMDSMap *m,
MDSMap *oldmap)
{
snapclient->handle_mds_failure(who);
}
-bool MDSRank::handle_asok_command(
+bool MDSRankDispatcher::handle_asok_command(
std::string command, cmdmap_t& cmdmap, Formatter *f,
std::ostream& ss)
{
return true;
}
-void MDSRank::update_log_config()
+void MDSRankDispatcher::update_log_config()
{
map<string,string> log_to_monitors;
map<string,string> log_to_syslog;
return;
}
-void MDSRank::handle_osd_map()
+void MDSRankDispatcher::handle_osd_map()
{
if (is_active() && snapserver) {
snapserver->check_osd_map(true);
objecter->maybe_request_map();
}
-bool MDSRank::kill_session(int64_t session_id)
+bool MDSRankDispatcher::kill_session(int64_t session_id)
{
Session *session = sessionmap.get_session(entity_name_t(CEPH_ENTITY_TYPE_CLIENT, session_id));
}
-bool MDSRank::handle_command_legacy(std::vector<std::string> args)
+bool MDSRankDispatcher::handle_command_legacy(std::vector<std::string> args)
{
if (args[0] == "dumpcache") {
if (args.size() > 1)
return true;
}
+MDSRankDispatcher::MDSRankDispatcher(
+ Mutex &mds_lock_,
+ LogChannelRef &clog_,
+ SafeTimer &timer_,
+ Beacon &beacon_,
+ MDSMap *& mdsmap_,
+ Messenger *msgr,
+ MonClient *monc_,
+ Objecter *objecter_,
+ Context *respawn_hook_,
+ Context *suicide_hook_)
+ : MDSRank(mds_lock_, clog_, timer_, beacon_, mdsmap_, msgr, monc_, objecter_,
+ respawn_hook_, suicide_hook_)
+{}
+
* The public part of this class's interface is what's exposed to all
* the various subsystems (server, mdcache, etc), such as pointers
* to the other subsystems, and message-sending calls.
- *
- * FIXME This isn't quite pure, because we also contain all the dispatch
- * mechanisms that operate on the subsystems. Perhaps we should
- * have an MDSRank parent that contains everything for the subsystems,
- * and an MDSRankDispatcher that contains all the dispatch logic. That's
- * awkward right because advance_queues etc need to know how to do dispatch
- * on the queues, and the queues need to be exposed to the subsystems so that
- * they can enqueue things. Perhaps the MDSRank base should have some pure
- * virtual functions for things like enqueuing messages for retry.
*/
class MDSRank {
public:
int get_req_rate() { return logger->get(l_mds_request); }
- // FIXME: interface for MDSDaemon to call, don't really want to expose
- // this to every subsystem that carries an MDSRank reference though
- // >>>
- void init(mds_rank_t rank, int incarnation);
- void tick();
- void shutdown();
- bool handle_asok_command(std::string command, cmdmap_t& cmdmap,
- Formatter *f, std::ostream& ss);
- void handle_mds_map(MMDSMap *m, MDSMap *oldmap);
- void handle_osd_map();
- bool kill_session(int64_t session_id);
- void update_log_config();
- bool handle_command_legacy(std::vector<std::string> args);
-
- // Call into me from MDS::ms_dispatch
- bool ms_dispatch(Message *m);
-
protected:
void command_scrub_path(Formatter *f, const string& path);
void command_flush_path(Formatter *f, const string& path);
}
};
+/**
+ * The aspect of MDSRank exposed to MDSDaemon but not subsystems: i.e.
+ * the service/dispatcher stuff like init/shutdown that subsystems should
+ * never touch.
+ */
+class MDSRankDispatcher : public MDSRank
+{
+public:
+ void init(mds_rank_t rank, int incarnation);
+ void tick();
+ void shutdown();
+ bool handle_asok_command(std::string command, cmdmap_t& cmdmap,
+ Formatter *f, std::ostream& ss);
+ void handle_mds_map(MMDSMap *m, MDSMap *oldmap);
+ void handle_osd_map();
+ bool kill_session(int64_t session_id);
+ void update_log_config();
+ bool handle_command_legacy(std::vector<std::string> args);
+
+ // Call into me from MDS::ms_dispatch
+ bool ms_dispatch(Message *m);
+
+ MDSRankDispatcher(
+ Mutex &mds_lock_,
+ LogChannelRef &clog_,
+ SafeTimer &timer_,
+ Beacon &beacon_,
+ MDSMap *& mdsmap_,
+ Messenger *msgr,
+ MonClient *monc_,
+ Objecter *objecter_,
+ Context *respawn_hook_,
+ Context *suicide_hook_);
+};
+
// This utility for MDS and MDSRank dispatchers.
#define ALLOW_MESSAGES_FROM(peers) \
do { \