aboutsummaryrefslogtreecommitdiffstats
path: root/net/ceph
diff options
context:
space:
mode:
authorAlex Elder <elder@inktank.com>2013-02-19 13:25:57 -0500
committerAlex Elder <elder@inktank.com>2013-02-25 16:37:24 -0500
commitf20a39fd6e6356b4cf3c1650c4dc6c66c99d8bae (patch)
tree200084eee31132641d4402a4cf115f4378d5f586 /net/ceph
parent154171678989950f6c392e126fa8006a145ed1cc (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.c37
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
2348static 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);
2358restart: 2376restart:
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