aboutsummaryrefslogtreecommitdiff
path: root/lib/jsonrpc.c
diff options
context:
space:
mode:
authorMehak Mahajan <mmahajan@nicira.com>2012-10-04 12:33:05 -0700
committerMehak Mahajan <mmahajan@nicira.com>2012-10-04 16:49:29 -0700
commite879d33e8398219d5c9af8fd565c97303f126809 (patch)
tree50d0b813cf2b96c6c1f4e08adea69350ea90cc2c /lib/jsonrpc.c
parent4210c33bdbf4c05bf38e1eebd930c88eca203412 (diff)
ovsdb/jsonrpc-server: ovsdb-server closes accepted connections immediately.
2012-09-14T05:38:26Z|00001|jsonrpc|WARN|tcp:127.0.0.1:6634: receive error: Con ovsdb-client: transaction failed (Connection reset by peer) NOTE: This occurs intermittently depending on how ovsdb-server runs. Running ovsdb-client on a remote machine increases the possibility. This is because ovsdb-server closes newly accepted tcp connection. The following changesets caused it. struct jsonrpc_session::dscp isn't set based on listening socket's dscp value. - ovsdb-server creates passive connection and listens on it. - ovsdb-server accepts connection by ovsdb_jsonrpc_server_run(). The accepted socket inherits from the listening sockets. ovsdb_jsonrpc_server_run() creates json session, but leaves dscp of struct jsonrpc_session zero. - On calling reconfigure_from_db(), it resets dscp value to all jsonrpc sessions. Eventually jsonrpc_session_set_dscp() is called. Then jsonrpc_session_force_reconnect() closes the connection. With this patch, - struct jsonrpc_session::dscp is correctly set based on listening sockets dscp value. - dscp of listening socket is changed dynamically by setsockopt. This leaves a window where accepted socket may have old dscp. But it is ignored for now because it would complicates codes too much. The related change sets: - 0442efd9b1a88d923b56eab6b72b6be8231a49f7 Reapplying the dscp changes: No need to restart DB/OVS on changing dscp value. - 59efa47adf3234ec51541405726d033173851285 Revert DSCP update changes. - b2e18db292cd4962af3248f11e9f17e6eaf9c033 No need to restart DB / OVS on changing dscp value. - f125905cdd3dc0339ad968c0a70128807884b400 Allow configuring DSCP on controller and manager connections. Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp> Signed-off-by: Mehak Mahajan <mmahajan@nicira.com>
Diffstat (limited to 'lib/jsonrpc.c')
-rw-r--r--lib/jsonrpc.c18
1 files changed, 16 insertions, 2 deletions
diff --git a/lib/jsonrpc.c b/lib/jsonrpc.c
index 0e1788ca..552de04c 100644
--- a/lib/jsonrpc.c
+++ b/lib/jsonrpc.c
@@ -791,7 +791,7 @@ jsonrpc_session_open(const char *name)
* 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)
+jsonrpc_session_open_unreliably(struct jsonrpc *jsonrpc, uint8_t dscp)
{
struct jsonrpc_session *s;
@@ -801,7 +801,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->dscp = dscp;
s->rpc = jsonrpc;
s->stream = NULL;
s->pstream = NULL;
@@ -1093,6 +1093,20 @@ jsonrpc_session_set_dscp(struct jsonrpc_session *s,
uint8_t dscp)
{
if (s->dscp != dscp) {
+ if (s->pstream) {
+ int error;
+
+ error = pstream_set_dscp(s->pstream, dscp);
+ if (error) {
+ VLOG_ERR("%s: failed set_dscp %s",
+ reconnect_get_name(s->reconnect), strerror(error));
+ }
+ /*
+ * TODO:XXX race window between setting dscp to listening socket
+ * and accepting socket. accepted socket may have old dscp value.
+ * Ignore this race window for now.
+ */
+ }
s->dscp = dscp;
jsonrpc_session_force_reconnect(s);
}