void MonClient::_send_command(MonCommand *r)
{
+ ++r->send_attempts;
+
entity_addr_t peer;
if (active_con) {
peer = active_con->get_con()->get_peer_addr();
if (r->target_rank >= 0 &&
r->target_rank != monmap.get_rank(peer)) {
+ if (r->send_attempts > cct->_conf->mon_client_directed_command_retry) {
+ _finish_command(r, -ENXIO, "mon unavailable");
+ return;
+ }
ldout(cct, 10) << __func__ << " " << r->tid << " " << r->cmd
<< " wants rank " << r->target_rank
<< ", reopening session"
if (r->target_name.length() &&
r->target_name != monmap.get_name(peer)) {
+ if (r->send_attempts > cct->_conf->mon_client_directed_command_retry) {
+ _finish_command(r, -ENXIO, "mon unavailable");
+ return;
+ }
ldout(cct, 10) << __func__ << " " << r->tid << " " << r->cmd
<< " wants mon " << r->target_name
<< ", reopening session"
void MonClient::_resend_mon_commands()
{
// resend any requests
- for (map<uint64_t,MonCommand*>::iterator p = mon_commands.begin();
- p != mon_commands.end();
- ++p) {
- _send_command(p->second);
+ map<uint64_t,MonCommand*>::iterator p = mon_commands.begin();
+ while (p != mon_commands.end()) {
+ auto cmd = p->second;
+ ++p;
+ _send_command(cmd); // might remove cmd from mon_commands
}
}
bufferlist *outbl, string *outs,
Context *onfinish)
{
+ ldout(cct,10) << __func__ << " cmd=" << cmd << dendl;
std::lock_guard l(monc_lock);
if (!initialized || stopping) {
- onfinish->complete(-ECANCELED);
+ if (onfinish) {
+ onfinish->complete(-ECANCELED);
+ }
return;
}
MonCommand *r = new MonCommand(++last_mon_command_tid);
bufferlist *outbl, string *outs,
Context *onfinish)
{
+ ldout(cct,10) << __func__ << " mon." << mon_name << " cmd=" << cmd << dendl;
std::lock_guard l(monc_lock);
if (!initialized || stopping) {
- onfinish->complete(-ECANCELED);
+ if (onfinish) {
+ onfinish->complete(-ECANCELED);
+ }
return;
}
MonCommand *r = new MonCommand(++last_mon_command_tid);
bufferlist *outbl, string *outs,
Context *onfinish)
{
+ ldout(cct,10) << __func__ << " rank " << rank << " cmd=" << cmd << dendl;
std::lock_guard l(monc_lock);
if (!initialized || stopping) {
- onfinish->complete(-ECANCELED);
+ if (onfinish) {
+ onfinish->complete(-ECANCELED);
+ }
return;
}
MonCommand *r = new MonCommand(++last_mon_command_tid);
<< auth_method << dendl;
return -EOPNOTSUPP;
}
+
+ auto ac = &auth_meta->authorizer_challenge;
+ if (!HAVE_FEATURE(con->get_features(), CEPHX_V2)) {
+ if (cct->_conf->cephx_service_require_version >= 2) {
+ ldout(cct,10) << __func__ << " client missing CEPHX_V2 ("
+ << "cephx_service_requre_version = "
+ << cct->_conf->cephx_service_require_version << ")" << dendl;
+ return -EACCES;
+ }
+ ac = nullptr;
+ }
+
bool was_challenge = (bool)auth_meta->authorizer_challenge;
bool isvalid = ah->verify_authorizer(
cct,
&con->peer_caps_info,
&auth_meta->session_key,
&auth_meta->connection_secret,
- &auth_meta->authorizer_challenge);
+ ac);
if (isvalid) {
handle_authentication_dispatcher->ms_handle_authentication(con);
return 1;