X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=lib%2Fjsonrpc.c;h=27b46c6dcf7054e093e3496abe2993477228a926;hb=f97cae29996cf17190f4ba5cdc62e9abf4386cb6;hp=5c3359cb241d929ee1c1f1b5f03237d34d8bc3ff;hpb=59efa47adf3234ec51541405726d033173851285;p=openvswitch diff --git a/lib/jsonrpc.c b/lib/jsonrpc.c index 5c3359cb..27b46c6d 100644 --- a/lib/jsonrpc.c +++ b/lib/jsonrpc.c @@ -793,6 +793,7 @@ jsonrpc_session_open_unreliably(struct jsonrpc *jsonrpc) reconnect_set_name(s->reconnect, jsonrpc_get_name(jsonrpc)); reconnect_set_max_tries(s->reconnect, 0); reconnect_connected(s->reconnect, time_msec()); + s->dscp = 0; s->rpc = jsonrpc; s->stream = NULL; s->pstream = NULL; @@ -879,9 +880,23 @@ jsonrpc_session_run(struct jsonrpc_session *s) } if (s->rpc) { + size_t backlog; int error; + backlog = jsonrpc_get_backlog(s->rpc); jsonrpc_run(s->rpc); + if (jsonrpc_get_backlog(s->rpc) < backlog) { + /* Data previously caught in a queue was successfully sent (or + * there's an error, which we'll catch below.) + * + * We don't count data that is successfully sent immediately as + * activity, because there's a lot of queuing downstream from us, + * which means that we can push a lot of data into a connection + * that has stalled and won't ever recover. + */ + reconnect_activity(s->reconnect, time_msec()); + } + error = jsonrpc_get_status(s->rpc); if (error) { reconnect_disconnected(s->reconnect, time_msec(), error); @@ -976,7 +991,7 @@ jsonrpc_session_recv(struct jsonrpc_session *s) struct jsonrpc_msg *msg; jsonrpc_recv(s->rpc, &msg); if (msg) { - reconnect_received(s->reconnect, time_msec()); + reconnect_activity(s->reconnect, time_msec()); if (msg->type == JSONRPC_REQUEST && !strcmp(msg->method, "echo")) { /* Echo request. Send reply. */ struct jsonrpc_msg *reply; @@ -1058,5 +1073,8 @@ void jsonrpc_session_set_dscp(struct jsonrpc_session *s, uint8_t dscp) { - s->dscp = dscp; + if (s->dscp != dscp) { + s->dscp = dscp; + jsonrpc_session_force_reconnect(s); + } }