diff options
author | Alex Elder <elder@inktank.com> | 2013-02-19 13:25:57 -0500 |
---|---|---|
committer | Alex Elder <elder@inktank.com> | 2013-02-25 16:37:24 -0500 |
commit | f20a39fd6e6356b4cf3c1650c4dc6c66c99d8bae (patch) | |
tree | 200084eee31132641d4402a4cf115f4378d5f586 /net/ceph | |
parent | 154171678989950f6c392e126fa8006a145ed1cc (diff) |
libceph: encapsulate connection backoff
Collect the code that tests for and implements a backoff delay for a
ceph connection into a new function, ceph_backoff().
Make the debug output messages in that part of the code report
things consistently by reporting a message in the socket closed
case, and by making the one for PREOPEN state report the connection
pointer like the rest.
Signed-off-by: Alex Elder <elder@inktank.com>
Reviewed-by: Josh Durgin <josh.durgin@inktank.com>
Diffstat (limited to 'net/ceph')
-rw-r--r-- | net/ceph/messenger.c | 37 |
1 files changed, 24 insertions, 13 deletions
diff --git a/net/ceph/messenger.c b/net/ceph/messenger.c index ed9e237d967c..9a29d8a4bad7 100644 --- a/net/ceph/messenger.c +++ b/net/ceph/messenger.c | |||
@@ -2345,6 +2345,24 @@ static bool con_sock_closed(struct ceph_connection *con) | |||
2345 | return true; | 2345 | return true; |
2346 | } | 2346 | } |
2347 | 2347 | ||
2348 | static bool con_backoff(struct ceph_connection *con) | ||
2349 | { | ||
2350 | int ret; | ||
2351 | |||
2352 | if (!con_flag_test_and_clear(con, CON_FLAG_BACKOFF)) | ||
2353 | return false; | ||
2354 | |||
2355 | ret = queue_con_delay(con, round_jiffies_relative(con->delay)); | ||
2356 | if (ret) { | ||
2357 | dout("%s: con %p FAILED to back off %lu\n", __func__, | ||
2358 | con, con->delay); | ||
2359 | BUG_ON(ret == -ENOENT); | ||
2360 | con_flag_set(con, CON_FLAG_BACKOFF); | ||
2361 | } | ||
2362 | |||
2363 | return true; | ||
2364 | } | ||
2365 | |||
2348 | /* | 2366 | /* |
2349 | * Do some work on a connection. Drop a connection ref when we're done. | 2367 | * Do some work on a connection. Drop a connection ref when we're done. |
2350 | */ | 2368 | */ |
@@ -2356,21 +2374,14 @@ static void con_work(struct work_struct *work) | |||
2356 | 2374 | ||
2357 | mutex_lock(&con->mutex); | 2375 | mutex_lock(&con->mutex); |
2358 | restart: | 2376 | restart: |
2359 | if (con_sock_closed(con)) | 2377 | if (con_sock_closed(con)) { |
2378 | dout("%s: con %p SOCK_CLOSED\n", __func__, con); | ||
2360 | goto fault; | 2379 | goto fault; |
2361 | 2380 | } | |
2362 | if (con_flag_test_and_clear(con, CON_FLAG_BACKOFF)) { | 2381 | if (con_backoff(con)) { |
2363 | dout("con_work %p backing off\n", con); | 2382 | dout("%s: con %p BACKOFF\n", __func__, con); |
2364 | ret = queue_con_delay(con, round_jiffies_relative(con->delay)); | ||
2365 | if (ret) { | ||
2366 | dout("con_work %p FAILED to back off %lu\n", con, | ||
2367 | con->delay); | ||
2368 | BUG_ON(ret == -ENOENT); | ||
2369 | con_flag_set(con, CON_FLAG_BACKOFF); | ||
2370 | } | ||
2371 | goto done; | 2383 | goto done; |
2372 | } | 2384 | } |
2373 | |||
2374 | if (con->state == CON_STATE_STANDBY) { | 2385 | if (con->state == CON_STATE_STANDBY) { |
2375 | dout("con_work %p STANDBY\n", con); | 2386 | dout("con_work %p STANDBY\n", con); |
2376 | goto done; | 2387 | goto done; |
@@ -2381,7 +2392,7 @@ restart: | |||
2381 | goto done; | 2392 | goto done; |
2382 | } | 2393 | } |
2383 | if (con->state == CON_STATE_PREOPEN) { | 2394 | if (con->state == CON_STATE_PREOPEN) { |
2384 | dout("con_work OPENING\n"); | 2395 | dout("%s: con %p OPENING\n", __func__, con); |
2385 | BUG_ON(con->sock); | 2396 | BUG_ON(con->sock); |
2386 | } | 2397 | } |
2387 | 2398 | ||