summaryrefslogtreecommitdiffstats
path: root/cli
diff options
context:
space:
mode:
authorVijay Bellur <vijay@gluster.com>2010-08-10 01:57:45 +0000
committerAnand V. Avati <avati@dev.gluster.com>2010-08-11 22:24:47 -0700
commitb0f54a49164a1c618b9e207349bd96705b44dfa6 (patch)
tree464a4026e786d6791a0ea2c92a6137dcd5e066b3 /cli
parent5f7018275bf8006ff758817037d03936b8a95d43 (diff)
cli: Introduce timeouts for command response and connection
Signed-off-by: Vijay Bellur <vijay@gluster.com> Signed-off-by: Anand V. Avati <avati@dev.gluster.com> BUG: 1262 () URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=1262
Diffstat (limited to 'cli')
-rw-r--r--cli/src/cli-cmd.c47
-rw-r--r--cli/src/cli.h2
-rw-r--r--cli/src/cli3_1-cops.c2
-rw-r--r--cli/src/input.c1
4 files changed, 43 insertions, 9 deletions
diff --git a/cli/src/cli-cmd.c b/cli/src/cli-cmd.c
index f7c04443c05..b61fc819f37 100644
--- a/cli/src/cli-cmd.c
+++ b/cli/src/cli-cmd.c
@@ -35,6 +35,7 @@
#include <fnmatch.h>
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 36ac7214bfd..854c609d2ca 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 de3aa6ed2dd..d9dd3f6feb8 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 25a7cb62dd9..a577a0f4c13 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);