From b0f54a49164a1c618b9e207349bd96705b44dfa6 Mon Sep 17 00:00:00 2001 From: Vijay Bellur Date: Tue, 10 Aug 2010 01:57:45 +0000 Subject: cli: Introduce timeouts for command response and connection Signed-off-by: Vijay Bellur Signed-off-by: Anand V. Avati BUG: 1262 () URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=1262 --- cli/src/cli-cmd.c | 47 +++++++++++++++++++++++++++++++++++++++-------- cli/src/cli.h | 2 ++ cli/src/cli3_1-cops.c | 2 ++ cli/src/input.c | 1 - 4 files changed, 43 insertions(+), 9 deletions(-) diff --git a/cli/src/cli-cmd.c b/cli/src/cli-cmd.c index f7c04443c..b61fc819f 100644 --- a/cli/src/cli-cmd.c +++ b/cli/src/cli-cmd.c @@ -35,6 +35,7 @@ #include static int cmd_done; +static int cmd_sent; static pthread_cond_t cond = PTHREAD_COND_INITIALIZER; static pthread_mutex_t cond_mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_cond_t conn = PTHREAD_COND_INITIALIZER; @@ -78,6 +79,15 @@ cli_cmd_process (struct cli_state *state, int argc, char **argv) return -1; } + ret = cli_cmd_await_connected (); + if (ret) { + cli_out ("Connection failed. Please check if gluster daemon" + " is operational."); + gf_log ("", GF_LOG_NORMAL, "Exiting with: %d", ret); + exit (ret); + } + + ret = word->cbkfn (state, word, (const char **)argv, argc); return ret; @@ -208,19 +218,32 @@ cli_cmd_unlock () int cli_cmd_await_response () { + struct timespec ts = {0,}; + int ret = 0; + cli_op_ret = -1; cmd_done = 0; - while (!cmd_done) - pthread_cond_wait (&cond, &cond_mutex); + time (&ts.tv_sec); + ts.tv_sec += CLI_DEFAULT_CMD_TIMEOUT; + while (!cmd_done && !ret) { + ret = pthread_cond_timedwait (&cond, &cond_mutex, + &ts); + } cli_cmd_unlock (); + if (ret) + return ret; + return cli_op_ret; } int cli_cmd_broadcast_response (int32_t status) { + if (!cmd_sent) + goto out; + pthread_mutex_lock (&cond_mutex); { cmd_done = 1; @@ -230,23 +253,29 @@ cli_cmd_broadcast_response (int32_t status) pthread_mutex_unlock (&cond_mutex); +out: return 0; } int32_t cli_cmd_await_connected () { + int32_t ret = 0; + struct timespec ts = {0,}; - pthread_mutex_lock (&conn_mutex); + pthread_mutex_lock (&conn_mutex); { - while (!connected) { - pthread_cond_wait (&conn, &conn_mutex); + time (&ts.tv_sec); + ts.tv_sec += CLI_DEFAULT_CONN_TIMEOUT; + while (!connected && !ret) { + ret = pthread_cond_timedwait (&conn, &conn_mutex, + &ts); } } pthread_mutex_unlock (&conn_mutex); - return 0; + return ret; } int32_t @@ -273,13 +302,15 @@ cli_cmd_submit (void *req, call_frame_t *frame, int ret = -1; cli_cmd_lock (); + cmd_sent = 0; ret = cli_submit_request (req, frame, prog, procnum, NULL, sfunc, this, cbkfn); - if (!ret) + if (!ret) { + cmd_sent = 1; ret = cli_cmd_await_response (); - else + } else cli_cmd_unlock (); gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); diff --git a/cli/src/cli.h b/cli/src/cli.h index 36ac7214b..854c609d2 100644 --- a/cli/src/cli.h +++ b/cli/src/cli.h @@ -31,6 +31,8 @@ #define DEFAULT_EVENT_POOL_SIZE 16384 #define CLI_GLUSTERD_PORT 6969 +#define CLI_DEFAULT_CONN_TIMEOUT 120 +#define CLI_DEFAULT_CMD_TIMEOUT 120 enum argp_option_keys { ARGP_DEBUG_KEY = 133, diff --git a/cli/src/cli3_1-cops.c b/cli/src/cli3_1-cops.c index de3aa6ed2..d9dd3f6fe 100644 --- a/cli/src/cli3_1-cops.c +++ b/cli/src/cli3_1-cops.c @@ -138,6 +138,8 @@ gf_cli3_1_list_friends_cbk (struct rpc_req *req, struct iovec *iov, gf_log ("cli", GF_LOG_NORMAL, "Received resp to list: %d", rsp.op_ret); + ret = rsp.op_ret; + if (!rsp.op_ret) { if (!rsp.friends.friends_len) { diff --git a/cli/src/input.c b/cli/src/input.c index 25a7cb62d..a577a0f4c 100644 --- a/cli/src/input.c +++ b/cli/src/input.c @@ -41,7 +41,6 @@ cli_batch (void *d) state = d; - cli_cmd_await_connected (); ret = cli_cmd_process (state, state->argc, state->argv); gf_log ("", GF_LOG_NORMAL, "Exiting with: %d", ret); exit (ret); -- cgit