int cli_cmd_peer_probe_cbk (struct cli_state *state, struct cli_cmd_word *word, const char **words, int wordcount) { int ret = -1; rpc_clnt_procedure_t *proc = NULL; call_frame_t *frame = NULL; dict_t *dict = NULL; int sent = 0; int parse_error = 0; if (!(wordcount == 3)) { cli_usage_out (word->pattern); parse_error = 1; goto out; } proc = &cli_rpc_prog->proctable[GLUSTER_CLI_PROBE]; frame = create_frame (THIS, THIS->ctx->pool); if (!frame) goto out; dict = dict_new (); if (!dict) goto out; ret = dict_set_str (dict, "hostname", (char *)words[2]); if (ret) goto out; ret = valid_internet_address ((char *) words[2], _gf_false); if (ret == 1) { ret = 0; } else { cli_usage_out (word->pattern); parse_error = 1; goto out; } /* if (words[3]) { ret = dict_set_str (dict, "port", (char *)words[3]); if (ret) goto out; } */ if (proc->fn) { ret = proc->fn (frame, THIS, dict); } out: if (ret) { cli_cmd_sent_status_get (&sent); if ((sent == 0) && (parse_error == 0)) cli_out ("Peer probe failed"); } if (frame) STACK_DESTROY (frame->root); return ret; }
int rpc_clnt_ping (struct rpc_clnt *rpc) { call_frame_t *frame = NULL; int32_t ret = -1; frame = create_frame (THIS, THIS->ctx->pool); if (!frame) goto fail; frame->local = rpc; ret = rpc_clnt_submit (rpc, &clnt_ping_prog, GF_DUMP_PING, rpc_clnt_ping_cbk, NULL, 0, NULL, 0, NULL, frame, NULL, 0, NULL, 0, NULL); if (ret) { gf_log (THIS->name, GF_LOG_ERROR, "failed to start ping timer"); } return ret; fail: if (frame) { STACK_DESTROY (frame->root); } return ret; }
int rpc_clnt_ping_cbk (struct rpc_req *req, struct iovec *iov, int count, void *myframe) { struct rpc_clnt *rpc = NULL; xlator_t *this = NULL; rpc_clnt_connection_t *conn = NULL; call_frame_t *frame = NULL; struct timespec timeout = {0, }; int unref = 0; if (!myframe) { gf_log (THIS->name, GF_LOG_WARNING, "frame with the request is NULL"); goto out; } frame = myframe; this = frame->this; rpc = frame->local; frame->local = NULL; /* Prevent STACK_DESTROY from segfaulting */ conn = &rpc->conn; pthread_mutex_lock (&conn->lock); { if (req->rpc_status == -1) { unref = rpc_clnt_remove_ping_timer_locked (rpc); if (unref) { gf_log (this->name, GF_LOG_WARNING, "socket or ib related error"); } else { /* timer expired and transport bailed out */ gf_log (this->name, GF_LOG_WARNING, "socket disconnected"); } conn->ping_started = 0; goto unlock; } unref = rpc_clnt_remove_ping_timer_locked (rpc); if (__rpc_clnt_rearm_ping_timer (rpc, rpc_clnt_start_ping) == -1) { gf_log (this->name, GF_LOG_WARNING, "failed to set the ping timer"); } } unlock: pthread_mutex_unlock (&conn->lock); out: if (unref) rpc_clnt_unref (rpc); if (frame) STACK_DESTROY (frame->root); return 0; }
int quotad_aggregator_submit_reply (call_frame_t *frame, rpcsvc_request_t *req, void *arg, struct iovec *payload, int payloadcount, struct iobref *iobref, xdrproc_t xdrproc) { struct iobuf *iob = NULL; int ret = -1; struct iovec rsp = {0,}; quotad_aggregator_state_t *state = NULL; char new_iobref = 0; GF_VALIDATE_OR_GOTO ("server", req, ret); if (frame) { state = frame->root->state; frame->local = NULL; } if (!iobref) { iobref = iobref_new (); if (!iobref) { goto ret; } new_iobref = 1; } iob = quotad_serialize_reply (req, arg, &rsp, xdrproc); if (!iob) { gf_msg ("", GF_LOG_ERROR, 0, Q_MSG_DICT_SERIALIZE_FAIL, "Failed to serialize reply"); goto ret; } iobref_add (iobref, iob); ret = rpcsvc_submit_generic (req, &rsp, 1, payload, payloadcount, iobref); iobuf_unref (iob); ret = 0; ret: if (state) { quotad_aggregator_free_state (state); } if (frame) STACK_DESTROY (frame->root); if (new_iobref) { iobref_unref (iobref); } return ret; }
int cli_cmd_peer_status_cbk (struct cli_state *state, struct cli_cmd_word *word, const char **words, int wordcount) { int ret = -1; rpc_clnt_procedure_t *proc = NULL; call_frame_t *frame = NULL; int sent = 0; int parse_error = 0; if (wordcount != 2) { cli_usage_out (word->pattern); parse_error = 1; goto out; } proc = &cli_rpc_prog->proctable[GLUSTER_CLI_LIST_FRIENDS]; frame = create_frame (THIS, THIS->ctx->pool); if (!frame) goto out; if (proc->fn) { ret = proc->fn (frame, THIS, (char *)words[1] ); } out: if (ret) { cli_cmd_sent_status_get (&sent); if ((sent == 0) && (parse_error == 0)) cli_out ("Peer status failed"); } if (frame) STACK_DESTROY (frame->root); return ret; }
int cli_cmd_peer_deprobe_cbk (struct cli_state *state, struct cli_cmd_word *word, const char **words, int wordcount) { int ret = -1; rpc_clnt_procedure_t *proc = NULL; call_frame_t *frame = NULL; dict_t *dict = NULL; int flags = 0; int sent = 0; int parse_error = 0; if ((wordcount < 3) || (wordcount > 4)) { cli_usage_out (word->pattern); parse_error = 1; goto out; } proc = &cli_rpc_prog->proctable[GLUSTER_CLI_DEPROBE]; frame = create_frame (THIS, THIS->ctx->pool); if (!frame) goto out; dict = dict_new (); ret = dict_set_str (dict, "hostname", (char *)words[2]); if (ret) goto out; /* if (words[3]) { ret = dict_set_str (dict, "port", (char *)words[3]); if (ret) goto out; } */ if (wordcount == 4) { if (!strcmp("force", words[3])) flags |= GF_CLI_FLAG_OP_FORCE; else { ret = -1; cli_usage_out (word->pattern); parse_error = 1; goto out; } } ret = dict_set_int32 (dict, "flags", flags); if (ret) goto out; if (proc->fn) { ret = proc->fn (frame, THIS, dict); } out: if (ret) { cli_cmd_sent_status_get (&sent); if ((sent == 0) && (parse_error == 0)) cli_out ("Peer detach failed"); } if (frame) STACK_DESTROY (frame->root); return ret; }
int rpc_clnt_ping_cbk (struct rpc_req *req, struct iovec *iov, int count, void *myframe) { struct rpc_clnt *rpc = NULL; xlator_t *this = NULL; rpc_clnt_connection_t *conn = NULL; call_frame_t *frame = NULL; struct timespec timeout = {0, }; if (!myframe) { gf_log (THIS->name, GF_LOG_WARNING, "frame with the request is NULL"); goto out; } frame = myframe; this = frame->this; rpc = frame->local; frame->local = NULL; /* Prevent STACK_DESTROY from segfaulting */ conn = &rpc->conn; pthread_mutex_lock (&conn->lock); { if (req->rpc_status == -1) { if (conn->ping_timer != NULL) { gf_log (this->name, GF_LOG_WARNING, "socket or ib related error"); gf_timer_call_cancel (rpc->ctx, conn->ping_timer); conn->ping_timer = NULL; rpc_clnt_unref (rpc); } else { /* timer expired and transport bailed out */ gf_log (this->name, GF_LOG_WARNING, "socket disconnected"); } conn->ping_started = 0; goto unlock; } /*This allows other RPCs to be able to start the ping timer * if they come by before the following start ping routine * is executed by the timer thread.*/ conn->ping_started = 0; gf_timer_call_cancel (this->ctx, conn->ping_timer); timeout.tv_sec = conn->ping_timeout; timeout.tv_nsec = 0; rpc_clnt_ref (rpc); conn->ping_timer = gf_timer_call_after (this->ctx, timeout, rpc_clnt_start_ping, (void *)rpc); if (conn->ping_timer == NULL) { gf_log (this->name, GF_LOG_WARNING, "failed to set the ping timer"); rpc_clnt_unref (rpc); } } unlock: pthread_mutex_unlock (&conn->lock); out: if (frame) STACK_DESTROY (frame->root); return 0; }