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

Reply via email to