ack->put();
}
+int MonClient::_cancel_mon_command(uint64_t tid, int r)
+{
+ assert(monc_lock.is_locked());
+
+ map<tid_t, MonCommand*>::iterator it = mon_commands.find(tid);
+ if (it == mon_commands.end()) {
+ ldout(cct, 10) << __func__ << " tid " << tid << " dne" << dendl;
+ return -ENOENT;
+ }
+
+ ldout(cct, 10) << __func__ << " tid " << tid << dendl;
+
+ MonCommand *cmd = it->second;
+ _finish_command(cmd, -ETIMEDOUT, "");
+ return 0;
+}
+
void MonClient::_finish_command(MonCommand *r, int ret, string rs)
{
ldout(cct, 10) << "_finish_command " << r->tid << " = " << ret << " " << rs << dendl;
r->poutbl = outbl;
r->prs = outs;
r->onfinish = onfinish;
+ if (cct->_conf->rados_mon_op_timeout > 0) {
+ r->ontimeout = new C_CancelMonCommand(r->tid, this);
+ timer.add_event_after(cct->_conf->rados_mon_op_timeout, r->ontimeout);
+ }
mon_commands[r->tid] = r;
_send_command(r);
// can't fail
bufferlist *poutbl;
string *prs;
int *prval;
- Context *onfinish;
+ Context *onfinish, *ontimeout;
MonCommand(uint64_t t)
: target_rank(-1),
tid(t),
- poutbl(NULL), prs(NULL), prval(NULL), onfinish(NULL)
+ poutbl(NULL), prs(NULL), prval(NULL), onfinish(NULL), ontimeout(NULL)
{}
};
map<uint64_t,MonCommand*> mon_commands;
+ class C_CancelMonCommand : public Context
+ {
+ uint64_t tid;
+ MonClient *monc;
+ public:
+ C_CancelMonCommand(uint64_t tid, MonClient *monc) : tid(tid), monc(monc) {}
+ void finish(int r) {
+ monc->_cancel_mon_command(tid, -ETIMEDOUT);
+ }
+ };
+
void _send_command(MonCommand *r);
void _resend_mon_commands();
+ int _cancel_mon_command(uint64_t tid, int r);
void _finish_command(MonCommand *r, int ret, string rs);
void handle_mon_command_ack(MMonCommandAck *ack);