Skip to content

Commit

Permalink
libceph: WARN, don't BUG on unexpected connection states
Browse files Browse the repository at this point in the history
A number of assertions in the ceph messenger are implemented with
BUG_ON(), killing the system if connection's state doesn't match
what's expected.  At this point our state model is (evidently) not
well understood enough for these assertions to trigger a BUG().
Convert all BUG_ON(con->state...) calls to be WARN_ON(con->state...)
so we learn about these issues without killing the machine.

We now recognize that a connection fault can occur due to a socket
closure at any time, regardless of the state of the connection.  So
there is really nothing we can assert about the state of the
connection at that point so eliminate that assertion.

Reported-by: Ugis <ugis22@gmail.com>
Tested-by: Ugis <ugis22@gmail.com>
Signed-off-by: Alex Elder <elder@inktank.com>
Reviewed-by: Sage Weil <sage@inktank.com>
  • Loading branch information
Alex Elder committed Dec 28, 2012
1 parent e6d50f6 commit 122070a
Showing 1 changed file with 5 additions and 6 deletions.
11 changes: 5 additions & 6 deletions net/ceph/messenger.c
Original file line number Diff line number Diff line change
Expand Up @@ -561,7 +561,7 @@ void ceph_con_open(struct ceph_connection *con,
mutex_lock(&con->mutex);
dout("con_open %p %s\n", con, ceph_pr_addr(&addr->in_addr));

BUG_ON(con->state != CON_STATE_CLOSED);
WARN_ON(con->state != CON_STATE_CLOSED);
con->state = CON_STATE_PREOPEN;

con->peer_name.type = (__u8) entity_type;
Expand Down Expand Up @@ -1509,7 +1509,7 @@ static int process_banner(struct ceph_connection *con)
static void fail_protocol(struct ceph_connection *con)
{
reset_connection(con);
BUG_ON(con->state != CON_STATE_NEGOTIATING);
WARN_ON(con->state != CON_STATE_NEGOTIATING);
con->state = CON_STATE_CLOSED;
}

Expand Down Expand Up @@ -1635,7 +1635,7 @@ static int process_connect(struct ceph_connection *con)
return -1;
}

BUG_ON(con->state != CON_STATE_NEGOTIATING);
WARN_ON(con->state != CON_STATE_NEGOTIATING);
con->state = CON_STATE_OPEN;

con->peer_global_seq = le32_to_cpu(con->in_reply.global_seq);
Expand Down Expand Up @@ -2132,7 +2132,6 @@ static int try_read(struct ceph_connection *con)
if (ret < 0)
goto out;

BUG_ON(con->state != CON_STATE_CONNECTING);
con->state = CON_STATE_NEGOTIATING;

/*
Expand Down Expand Up @@ -2160,7 +2159,7 @@ static int try_read(struct ceph_connection *con)
goto more;
}

BUG_ON(con->state != CON_STATE_OPEN);
WARN_ON(con->state != CON_STATE_OPEN);

if (con->in_base_pos < 0) {
/*
Expand Down Expand Up @@ -2382,7 +2381,7 @@ static void ceph_fault(struct ceph_connection *con)
dout("fault %p state %lu to peer %s\n",
con, con->state, ceph_pr_addr(&con->peer_addr.in_addr));

BUG_ON(con->state != CON_STATE_CONNECTING &&
WARN_ON(con->state != CON_STATE_CONNECTING &&
con->state != CON_STATE_NEGOTIATING &&
con->state != CON_STATE_OPEN);

Expand Down

0 comments on commit 122070a

Please sign in to comment.