When reporting remote status, A listening remote will randomly pick a session and report its session status. This does not seem to make much sense. It is probably better to leave those fields untouched.
Update ovs-vswitchd.conf.db(5) to match the change in implementation. The man page says 'n_connections' should be at least 2. Make the implementation match the description. Signed-off-by: Andy Zhou <az...@ovn.org> --- ovsdb/jsonrpc-server.c | 60 ++++++++++++++++++++++++++++++++++++-------------- vswitchd/vswitch.xml | 27 +++++++++++++++++------ 2 files changed, 64 insertions(+), 23 deletions(-) diff --git a/ovsdb/jsonrpc-server.c b/ovsdb/jsonrpc-server.c index 0d23b77..f265565 100644 --- a/ovsdb/jsonrpc-server.c +++ b/ovsdb/jsonrpc-server.c @@ -63,9 +63,12 @@ static void ovsdb_jsonrpc_session_close_all(struct ovsdb_jsonrpc_remote *); static void ovsdb_jsonrpc_session_reconnect_all(struct ovsdb_jsonrpc_remote *); static void ovsdb_jsonrpc_session_set_all_options( struct ovsdb_jsonrpc_remote *, const struct ovsdb_jsonrpc_options *); -static bool ovsdb_jsonrpc_session_get_status( +static bool ovsdb_jsonrpc_active_session_get_status( const struct ovsdb_jsonrpc_remote *, struct ovsdb_jsonrpc_remote_status *); +static void ovsdb_jsonrpc_session_get_status( + const struct ovsdb_jsonrpc_session *, + struct ovsdb_jsonrpc_remote_status *); static void ovsdb_jsonrpc_session_unlock_all(struct ovsdb_jsonrpc_session *); static void ovsdb_jsonrpc_session_unlock__(struct ovsdb_lock_waiter *); static void ovsdb_jsonrpc_session_send(struct ovsdb_jsonrpc_session *, @@ -288,7 +291,24 @@ ovsdb_jsonrpc_server_get_remote_status( memset(status, 0, sizeof *status); remote = shash_find_data(&svr->remotes, target); - return remote && ovsdb_jsonrpc_session_get_status(remote, status); + + if (!remote) { + return false; + } + + if (remote->listener) { + status->bound_port = pstream_get_bound_port(remote->listener); + status->is_connected = !list_is_empty(&remote->sessions); + + size_t n_connections = list_size(&remote->sessions); + /* Update 'n_connections' if there are at least two connections. */ + if (n_connections >= 2) { + status->n_connections = n_connections; + } + return true; + } + + return ovsdb_jsonrpc_active_session_get_status(remote, status); } void @@ -583,24 +603,36 @@ ovsdb_jsonrpc_session_set_all_options( } } +/* Sets the 'status' of for the 'remote' with an outgoing connection. */ static bool -ovsdb_jsonrpc_session_get_status(const struct ovsdb_jsonrpc_remote *remote, - struct ovsdb_jsonrpc_remote_status *status) +ovsdb_jsonrpc_active_session_get_status( + const struct ovsdb_jsonrpc_remote *remote, + struct ovsdb_jsonrpc_remote_status *status) { + const struct ovs_list *sessions = &remote->sessions; const struct ovsdb_jsonrpc_session *s; + + if (list_is_empty(sessions)) { + return false; + } + + ovs_assert(list_is_singleton(sessions)); + s = CONTAINER_OF(list_front(sessions), struct ovsdb_jsonrpc_session, node); + ovsdb_jsonrpc_session_get_status(s, status); + + return true; +} + +static void +ovsdb_jsonrpc_session_get_status(const struct ovsdb_jsonrpc_session *session, + struct ovsdb_jsonrpc_remote_status *status) +{ + const struct ovsdb_jsonrpc_session *s = session; const struct jsonrpc_session *js; struct ovsdb_lock_waiter *waiter; struct reconnect_stats rstats; struct ds locks_held, locks_waiting, locks_lost; - status->bound_port = (remote->listener - ? pstream_get_bound_port(remote->listener) - : htons(0)); - - if (list_is_empty(&remote->sessions)) { - return false; - } - s = CONTAINER_OF(remote->sessions.next, struct ovsdb_jsonrpc_session, node); js = s->js; status->is_connected = jsonrpc_session_is_connected(js); @@ -630,10 +662,6 @@ ovsdb_jsonrpc_session_get_status(const struct ovsdb_jsonrpc_remote *remote, status->locks_held = ds_steal_cstr(&locks_held); status->locks_waiting = ds_steal_cstr(&locks_waiting); status->locks_lost = ds_steal_cstr(&locks_lost); - - status->n_connections = list_size(&remote->sessions); - - return true; } /* Examines 'request' to determine the database to which it relates, and then diff --git a/vswitchd/vswitch.xml b/vswitchd/vswitch.xml index bccea55..5df5903 100644 --- a/vswitchd/vswitch.xml +++ b/vswitchd/vswitch.xml @@ -4193,6 +4193,26 @@ </group> <group title="Status"> + <p> + Key-value pair of <ref column="is_connected"/> is always updated. + Other key-value pairs in the status columns may be updated depends on + the <ref column="target"/> type. + </p> + + <p> + When <ref column="target"/> specifies a connection method that + listens for inbound connections (e.g. <code>ptcp:</code> or + <code>punix:</code>), Both <ref column="n_connections"/> and + <ref column="is_connected"/> may also be updated while the + remaining key-value paris are omitted. + </p> + + <p> On the other hand, when <ref column="target"/> specifies an + outbond connection, all key-value pairs may be updated, except + the above-mentioned two key-value pairs associated with inbond + connections targets. They are omitted. + </p> + <column name="is_connected"> <code>true</code> if currently connected to this manager, <code>false</code> otherwise. @@ -4264,18 +4284,11 @@ <column name="status" key="n_connections" type='{"type": "integer", "minInteger": 2}'> - <p> When <ref column="target"/> specifies a connection method that listens for inbound connections (e.g. <code>ptcp:</code> or <code>pssl:</code>) and more than one connection is actually active, the value is the number of active connections. Otherwise, this key-value pair is omitted. - </p> - <p> - When multiple connections are active, status columns and key-value - pairs (other than this one) report the status of one arbitrarily - chosen connection. - </p> </column> <column name="status" key="bound_port" type='{"type": "integer"}'> -- 1.9.1 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev