Skip to content

Commit

Permalink
osdc/Objecter: fix recursive locking in _finish_command
Browse files Browse the repository at this point in the history
The path

#9  Objecter::_finish_command (this=this@entry=0x7f76c00aeb30, c=c@entry=0x7f76b0000b10, r=<optimized out>, rs="osd down") at /build/ceph-13.0.2-1932-g458b4fb/src/osdc/Objecter.cc:4950
#10 0x00007f76d26de106 in Objecter::_check_command_map_dne (this=this@entry=0x7f76c00aeb30, c=c@entry=0x7f76b0000b10) at /build/ceph-13.0.2-1932-g458b4fb/src/osdc/Objecter.cc:1726
#11 0x00007f76d26e52e4 in Objecter::_scan_requests (this=this@entry=0x7f76c00aeb30, s=0x7f76c00af8a0, skipped_map=skipped_map@entry=false, cluster_full=cluster_full@entry=false, pool_full_map=0x7f76be7fb330, need_resend=..., need_resend_linger=..., need_resend_command=std::map with 0 elements, sul=...,
    gap_removed_snaps=0x7f76ac0016f8) at /build/ceph-13.0.2-1932-g458b4fb/src/osdc/Objecter.cc:1120
#12 0x00007f76d26eded5 in Objecter::handle_osd_map (this=this@entry=0x7f76c00aeb30, m=m@entry=0x7f76ac0014a0) at /build/ceph-13.0.2-1932-g458b4fb/src/osdc/Objecter.cc:1228

led to recursive lock of the session mutex (locked in _scan_requests,
and again in _finish_command).

Fix by making the callers for _finish_command (and
_check_command_map_dne) take the session lock.

Fixes: http://tracker.ceph.com/issues/23940
Signed-off-by: Sage Weil <sage@redhat.com>
  • Loading branch information
liewegas committed Apr 30, 2018
1 parent 049e909 commit 891f519
Showing 1 changed file with 10 additions and 3 deletions.
13 changes: 10 additions & 3 deletions src/osdc/Objecter.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1708,14 +1708,17 @@ void Objecter::C_Command_Map_Latest::finish(int r)
if (c->map_dne_bound == 0)
c->map_dne_bound = latest;

OSDSession::unique_lock sul(c->session->lock);
objecter->_check_command_map_dne(c);
sul.unlock();

c->put();
}

void Objecter::_check_command_map_dne(CommandOp *c)
{
// rwlock is locked unique
// session is locked unique

ldout(cct, 10) << "_check_command_map_dne tid " << c->tid
<< " current " << osdmap->get_epoch()
Expand All @@ -1733,6 +1736,7 @@ void Objecter::_check_command_map_dne(CommandOp *c)
void Objecter::_send_command_map_check(CommandOp *c)
{
// rwlock is locked unique
// session is locked unique

// ask the monitor
if (check_latest_map_commands.count(c->tid) == 0) {
Expand Down Expand Up @@ -4781,8 +4785,10 @@ void Objecter::handle_command_reply(MCommandReply *m)

sl.unlock();


OSDSession::unique_lock sul(s->lock);
_finish_command(c, m->r, m->rs);
sul.unlock();

m->put();
s->put();
}
Expand Down Expand Up @@ -4928,13 +4934,16 @@ int Objecter::command_op_cancel(OSDSession *s, ceph_tid_t tid, int r)

CommandOp *op = it->second;
_command_cancel_map_check(op);
OSDSession::unique_lock sl(op->session->lock);
_finish_command(op, r, "");
sl.unlock();
return 0;
}

void Objecter::_finish_command(CommandOp *c, int r, string rs)
{
// rwlock is locked unique
// session lock is locked

ldout(cct, 10) << "_finish_command " << c->tid << " = " << r << " "
<< rs << dendl;
Expand All @@ -4947,9 +4956,7 @@ void Objecter::_finish_command(CommandOp *c, int r, string rs)
timer.cancel_event(c->ontimeout);

OSDSession *s = c->session;
OSDSession::unique_lock sl(s->lock);
_session_command_op_remove(c->session, c);
sl.unlock();

c->put();

Expand Down

0 comments on commit 891f519

Please sign in to comment.