Hey Isaku, I am not sure I understand this patch completely. Your patch seems to suggest that we are not populating the "options" values from the database ? Are you suggesting that in case of passive connections we do not call ovsdb_jsonrpc_session_set_options() ?
On Fri, Sep 14, 2012 at 1:56 AM, Isaku Yamahata <yamah...@valinux.co.jp>wrote: > Thus ovsdb-client aborts as follows. > > > # ovs-vsctl set-manager ptcp:6634 > > # ovsdb-client get-schema tcp:127.0.0.1:6634 > > 2012-09-14T05:38:26Z|00001|jsonrpc|WARN|tcp:127.0.0.1:6634: receive > error: Connection reset by peer > > 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. > > 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. 5 > > Signed-off-by: Isaku Yamahata <yamah...@valinux.co.jp> > --- > There still remains an issue of ovsdb-server and vswitchd. When the > setting of dscp is dynamically changed, the setting of listening > sockets isn't updated. > What should we do with listening socket? > - close all listening sockets and re-creates them. > setsockopt(SO_REUSE) would be needed > - setsockopt(new dscp) for all listening sockets > This leaves a window where accepted socket may have old dscp. > To address it, > - ignore such window or > - setsockopt(accepted socket, new dscp) > - other way? > --- > lib/jsonrpc.c | 4 +- > lib/jsonrpc.h | 3 +- > ovsdb/jsonrpc-server.c | 7 +++++- > ovsdb/ovsdb-server.c | 1 - > tests/ovsdb-server.at | 49 > ++++++++++++++++++++++++++++++++++++++++++++++++ > 5 files changed, 59 insertions(+), 5 deletions(-) > > diff --git a/lib/jsonrpc.c b/lib/jsonrpc.c > index 0e1788c..4ada023 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; diff --git a/lib/jsonrpc.h b/lib/jsonrpc.h > index 44ae06f..b5acf89 100644 > --- a/lib/jsonrpc.h > +++ b/lib/jsonrpc.h > @@ -99,7 +99,8 @@ struct json *jsonrpc_msg_to_json(struct jsonrpc_msg *); > /* A JSON-RPC session with reconnection. */ > > struct jsonrpc_session *jsonrpc_session_open(const char *name); > -struct jsonrpc_session *jsonrpc_session_open_unreliably(struct jsonrpc *); > +struct jsonrpc_session *jsonrpc_session_open_unreliably(struct jsonrpc *, > + uint8_t); > void jsonrpc_session_close(struct jsonrpc_session *); > > void jsonrpc_session_run(struct jsonrpc_session *); > diff --git a/ovsdb/jsonrpc-server.c b/ovsdb/jsonrpc-server.c > index bb887d0..f6504e1 100644 > --- a/ovsdb/jsonrpc-server.c > +++ b/ovsdb/jsonrpc-server.c > @@ -98,6 +98,7 @@ struct ovsdb_jsonrpc_remote { > struct ovsdb_jsonrpc_server *server; > struct pstream *listener; /* Listener, if passive. */ > struct list sessions; /* List of "struct > ovsdb_jsonrpc_session"s. */ > + uint8_t dscp; > }; > > static struct ovsdb_jsonrpc_remote *ovsdb_jsonrpc_server_add_remote( > @@ -137,6 +138,7 @@ ovsdb_jsonrpc_default_options(const char *target) > options->probe_interval = (stream_or_pstream_needs_probes(target) > ? RECONNECT_DEFAULT_PROBE_INTERVAL > : 0); > + options->dscp = DSCP_DEFAULT; > return options; > } > > @@ -192,6 +194,7 @@ ovsdb_jsonrpc_server_add_remote(struct > ovsdb_jsonrpc_server *svr, > remote->server = svr; > remote->listener = listener; > list_init(&remote->sessions); > + remote->dscp = options->dscp; > shash_add(&svr->remotes, name, remote); > > Why are you adding this here ? ovsdb_jsonrpc_session_set_all_options() (called unconditionally after ovsdb_jsonrpc_server_add_remote() ) already reads the values from options and populates in the remote. > if (!listener) { > @@ -268,7 +271,8 @@ ovsdb_jsonrpc_server_run(struct ovsdb_jsonrpc_server > *svr) > error = pstream_accept(remote->listener, &stream); > if (!error) { > struct jsonrpc_session *js; > - js = > jsonrpc_session_open_unreliably(jsonrpc_open(stream)); > + js = jsonrpc_session_open_unreliably(jsonrpc_open(stream), > + remote->dscp); > ovsdb_jsonrpc_session_create(remote, js); > } else if (error != EAGAIN) { > VLOG_WARN_RL(&rl, "%s: accept failed: %s", > @@ -504,6 +508,7 @@ ovsdb_jsonrpc_session_set_all_options( > { > struct ovsdb_jsonrpc_session *s; > > + remote->dscp = options->dscp; /* TODO:XXX */ > LIST_FOR_EACH (s, node, &remote->sessions) { > ovsdb_jsonrpc_session_set_options(s, options); > } > ovsdb_jsonrpc_session_set_options() should already set the dscp value from options. > diff --git a/ovsdb/ovsdb-server.c b/ovsdb/ovsdb-server.c > index 1bf10d9..68f212f 100644 > --- a/ovsdb/ovsdb-server.c > +++ b/ovsdb/ovsdb-server.c > @@ -469,7 +469,6 @@ add_manager_options(struct shash *remotes, const > struct ovsdb_row *row) > options->probe_interval = probe_interval; > } > > - options->dscp = DSCP_DEFAULT; > I am unsure why you are taking this out ? > dscp_string = read_map_string_column(row, "other_config", "dscp"); > if (dscp_string) { > int dscp = atoi(dscp_string); > diff --git a/tests/ovsdb-server.at b/tests/ovsdb-server.at > index b0a3377..87046f6 100644 > --- a/tests/ovsdb-server.at > +++ b/tests/ovsdb-server.at > @@ -415,6 +415,55 @@ cat stdout >> output > > EXECUTION_EXAMPLES > > +AT_BANNER([OVSDB -- ovsdb-server transactions (TCP sockets)]) > + > +AT_SETUP([ovsdb-client get-schema-version - tcp socket]) > +AT_KEYWORDS([ovsdb server positive tcp]) > +ordinal_schema > schema > +AT_CHECK([perl $srcdir/choose-port.pl], [0], [stdout]) > +TCP_PORT=`cat stdout` > +AT_CHECK([ovsdb-tool create db schema], [0], [ignore], [ignore]) > +AT_CHECK([ovsdb-server --detach --no-chdir --pidfile="`pwd`"/pid > --unixctl="`pwd`"/unixctl --remote=ptcp:$TCP_PORT:127.0.0.1 db], [0], > [ignore], [ignore]) > +AT_CHECK([ovsdb-client get-schema-version tcp:127.0.0.1:$TCP_PORT > ordinals], [0], [5.1.3 > +]) > +OVSDB_SERVER_SHUTDOWN > +AT_CLEANUP]) > + > +# OVSDB_CHECK_EXECUTION(TITLE, SCHEMA, TRANSACTIONS, OUTPUT, [KEYWORDS]) > +# > +# Creates a database with the given SCHEMA, starts an ovsdb-server on > +# that database, and runs each of the TRANSACTIONS (which should be a > +# quoted list of quoted strings) against it with ovsdb-client one at a > +# time. > +# > +# Checks that the overall output is OUTPUT, but UUIDs in the output > +# are replaced by markers of the form <N> where N is a number. The > +# first unique UUID is replaced by <0>, the next by <1>, and so on. > +# If a given UUID appears more than once it is always replaced by the > +# same marker. > +# > +# TITLE is provided to AT_SETUP and KEYWORDS to AT_KEYWORDS. > +m4_define([OVSDB_CHECK_EXECUTION], > + [AT_SETUP([$1]) > + AT_KEYWORDS([ovsdb server positive tcp $5]) > + $2 > schema > + AT_CHECK([perl $srcdir/choose-port.pl], [0], [stdout]) > + TCP_PORT=`cat stdout` > + PKIDIR=$abs_top_builddir/tests > + AT_CHECK([ovsdb-tool create db schema], [0], [stdout], [ignore]) > + AT_CHECK([ovsdb-server --detach --no-chdir --pidfile="`pwd`"/pid > --remote=ptcp:$TCP_PORT:127.0.0.1 --unixctl="`pwd`"/unixctl db], [0], > [ignore], [ignore]) > + m4_foreach([txn], [$3], > + [AT_CHECK([ovsdb-client transact tcp:127.0.0.1:$TCP_PORT 'txn'], > [0], [stdout], [ignore], > + [test ! -e pid || kill `cat pid`]) > +cat stdout >> output > +]) > + AT_CHECK([perl $srcdir/uuidfilt.pl output], [0], [$4], [ignore], > + [test ! -e pid || kill `cat pid`]) > + OVSDB_SERVER_SHUTDOWN > + AT_CLEANUP]) > + > +EXECUTION_EXAMPLES > + > AT_BANNER([OVSDB -- transactions on transient ovsdb-server]) > > # OVSDB_CHECK_EXECUTION(TITLE, SCHEMA, TRANSACTIONS, OUTPUT, [KEYWORDS]) > -- > 1.7.1.1 > > _______________________________________________ > dev mailing list > dev@openvswitch.org > http://openvswitch.org/mailman/listinfo/dev >
_______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev