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

Reply via email to