X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=lib%2Fjsonrpc.c;h=a83dde9b5ae2b35f9ebc8b2a4bfa6f1940cf1f10;hb=d76f09ea77e03ee5a3a7bb67bcab1ac4bb54172b;hp=72590a2f41da2d73c1b1c35da361e89a54cc8590;hpb=0d11f523a371910cb0ed5549a85836f83a7552c2;p=sliver-openvswitch.git diff --git a/lib/jsonrpc.c b/lib/jsonrpc.c index 72590a2f4..a83dde9b5 100644 --- a/lib/jsonrpc.c +++ b/lib/jsonrpc.c @@ -23,6 +23,7 @@ #include "byteq.h" #include "dynamic-string.h" +#include "fatal-signal.h" #include "json.h" #include "list.h" #include "ofpbuf.h" @@ -31,9 +32,9 @@ #include "reconnect.h" #include "stream.h" #include "timeval.h" - -#define THIS_MODULE VLM_jsonrpc #include "vlog.h" + +VLOG_DEFINE_THIS_MODULE(jsonrpc); struct jsonrpc { struct stream *stream; @@ -248,7 +249,6 @@ jsonrpc_recv(struct jsonrpc *rpc, struct jsonrpc_msg **msgp) return rpc->status; } } else if (retval == 0) { - VLOG_INFO_RL(&rl, "%s: connection closed", rpc->name); jsonrpc_error(rpc, EOF); return EOF; } @@ -266,6 +266,12 @@ jsonrpc_recv(struct jsonrpc *rpc, struct jsonrpc_msg **msgp) if (json_parser_is_done(rpc->parser)) { jsonrpc_received(rpc); if (rpc->status) { + const struct byteq *q = &rpc->input; + if (q->head <= BYTEQ_SIZE) { + stream_report_content(q->buffer, q->head, + STREAM_JSONRPC, + THIS_MODULE, rpc->name); + } return rpc->status; } } @@ -293,6 +299,8 @@ jsonrpc_send_block(struct jsonrpc *rpc, struct jsonrpc_msg *msg) { int error; + fatal_signal_run(); + error = jsonrpc_send(rpc, msg); if (error) { return error; @@ -314,6 +322,7 @@ jsonrpc_recv_block(struct jsonrpc *rpc, struct jsonrpc_msg **msgp) for (;;) { int error = jsonrpc_recv(rpc, msgp); if (error != EAGAIN) { + fatal_signal_run(); return error; } @@ -691,7 +700,10 @@ jsonrpc_session_open(const char *name) } /* Creates and returns a jsonrpc_session that is initially connected to - * 'jsonrpc'. If the connection is dropped, it will not be reconnected. */ + * 'jsonrpc'. If the connection is dropped, it will not be reconnected. + * + * On the assumption that such connections are likely to be short-lived + * (e.g. from ovs-vsctl), informational logging for them is suppressed. */ struct jsonrpc_session * jsonrpc_session_open_unreliably(struct jsonrpc *jsonrpc) { @@ -699,6 +711,7 @@ jsonrpc_session_open_unreliably(struct jsonrpc *jsonrpc) s = xmalloc(sizeof *s); s->reconnect = reconnect_create(time_msec()); + reconnect_set_quiet(s->reconnect, true); reconnect_set_name(s->reconnect, jsonrpc_get_name(jsonrpc)); reconnect_set_max_tries(s->reconnect, 0); reconnect_connected(s->reconnect, time_msec()); @@ -792,7 +805,7 @@ jsonrpc_session_run(struct jsonrpc_session *s) jsonrpc_run(s->rpc); error = jsonrpc_get_status(s->rpc); if (error) { - reconnect_disconnected(s->reconnect, time_msec(), 0); + reconnect_disconnected(s->reconnect, time_msec(), error); jsonrpc_session_disconnect(s); } } else if (s->stream) { @@ -890,8 +903,8 @@ jsonrpc_session_recv(struct jsonrpc_session *s) reply = jsonrpc_create_reply(json_clone(msg->params), msg->id); jsonrpc_session_send(s, reply); } else if (msg->type == JSONRPC_REPLY - && msg->id && msg->id->type == JSON_STRING - && !strcmp(msg->id->u.string, "echo")) { + && msg->id && msg->id->type == JSON_STRING + && !strcmp(msg->id->u.string, "echo")) { /* It's a reply to our echo request. Suppress it. */ } else { return msg; @@ -933,3 +946,16 @@ jsonrpc_session_force_reconnect(struct jsonrpc_session *s) { reconnect_force_reconnect(s->reconnect, time_msec()); } + +void +jsonrpc_session_set_max_backoff(struct jsonrpc_session *s, int max_backoff) +{ + reconnect_set_backoff(s->reconnect, 0, max_backoff); +} + +void +jsonrpc_session_set_probe_interval(struct jsonrpc_session *s, + int probe_interval) +{ + reconnect_set_probe_interval(s->reconnect, probe_interval); +}