On Thu, Mar 03, 2016 at 12:13:20AM -0800, Andy Zhou wrote: > Currently ovsdb_jsonrpc_session are grouped together in a linked > list within 'ovsdb_jsonrpc_remote'. This makes sense since most > session operations applies to sessions within a remote. > > However, in order to scale up ovsdb-server with multi-threading, it is > more convenient to distribute a sessions to any thread available, > regardless which remote it is associated with. > > This patch introduces a set of APIs that provide operations on > a list of sessions. Instead of group sessions by remote, they > are linked together in a new ovs_list field 'all_sessions' in the > ovsdb_jsonrpc_server struct. > > With multi-threading, the design is that all sessions managed > by a thread will have them linked together on a thread private > linked list. At that time, the 'all_sessions' field in > ovsdb_jsonrpc_server struct will have all session managed > the main process. > > Signed-off-by: Andy Zhou <az...@ovn.org>
Thank you! Acked-by: Ben Pfaff <b...@ovn.org> I suggest folding in the following incremental. --8<--------------------------cut here-------------------------->8-- diff --git a/ovsdb/jsonrpc-server.c b/ovsdb/jsonrpc-server.c index 4d83157..ec60f33 100644 --- a/ovsdb/jsonrpc-server.c +++ b/ovsdb/jsonrpc-server.c @@ -111,18 +111,10 @@ static struct json *ovsdb_jsonrpc_monitor_compose_update( struct ovsdb_jsonrpc_server { struct ovsdb_server up; - unsigned int n_sessions; struct shash remotes; /* Contains "struct ovsdb_jsonrpc_remote *"s. */ struct ovs_list all_sessions; /* All 'ovsdb_jsonrpc_session's. */ }; -/* Cast an 'ovsdb_server' pointer down into an ovsdb_jsonrpc_server pinter. - * Caller needs to make sure this conversion is valid. */ -static struct ovsdb_jsonrpc_server * -ovsdb_jsonrpc_server_cast(struct ovsdb_server *s) { - return CONTAINER_OF(s, struct ovsdb_jsonrpc_server, up); -} - /* A configured remote. This is either a passive stream listener plus a list * of the currently connected sessions, or a list of exactly one active * session. */ @@ -399,7 +391,7 @@ void ovsdb_jsonrpc_server_get_memory_usage(const struct ovsdb_jsonrpc_server *svr, struct simap *usage) { - simap_increase(usage, "sessions", svr->n_sessions); + simap_increase(usage, "sessions", list_size(&svr->all_sessions)); ovsdb_jsonrpc_session_get_memory_usage_all(svr, usage); } @@ -447,16 +439,12 @@ ovsdb_jsonrpc_session_create(struct ovsdb_jsonrpc_remote *remote, s->js = js; s->js_seqno = jsonrpc_session_get_seqno(js); - server->n_sessions++; - return s; } static void ovsdb_jsonrpc_session_close(struct ovsdb_jsonrpc_session *s) { - struct ovsdb_jsonrpc_server *server; - ovsdb_jsonrpc_monitor_remove_all(s); ovsdb_jsonrpc_session_unlock_all(s); ovsdb_jsonrpc_trigger_complete_all(s); @@ -466,8 +454,6 @@ ovsdb_jsonrpc_session_close(struct ovsdb_jsonrpc_session *s) jsonrpc_session_close(s->js); list_remove(&s->node); - server = ovsdb_jsonrpc_server_cast(s->up.server); - server->n_sessions--; ovsdb_session_destroy(&s->up); free(s); } @@ -1356,7 +1342,7 @@ ovsdb_jsonrpc_sessions_run(struct ovs_list *sessions) struct ovsdb_jsonrpc_session *s, *next; LIST_FOR_EACH_SAFE (s, next, node, sessions) { - int error = ovsdb_jsonrpc_session_run(s); + int error = ovsdb_jsonrpc_session_run(s); if (error) { ovsdb_jsonrpc_session_close(s); } @@ -1386,7 +1372,7 @@ ovsdb_jsonrpc_sessions_close(struct ovs_list *sessions, } } -/* Forces all of the JSON-RPC sessions to disconnect and +/* Forces all of the JSON-RPC sessions for the given 'remote' to disconnect and * reconnect. */ static void ovsdb_jsonrpc_sessions_reconnect(struct ovs_list *sessions, @@ -1422,7 +1408,7 @@ ovsdb_jsonrpc_sessions_count(const struct ovs_list *sessions, /* Sets the options for all of the JSON-RPC sessions managed by 'remote' to * 'options'. * - * (The dscp value can't be changed directly; the caller must instead close and + * (The DSCP value can't be changed directly; the caller must instead close and * re-open the session.) */ static void ovsdb_jsonrpc_sessions_set_options(struct ovs_list *sessions, _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev