On Fri, Mar 18, 2016 at 6:08 PM, Ben Pfaff <[email protected]> wrote:
> On Thu, Mar 03, 2016 at 12:13:24AM -0800, Andy Zhou wrote:
> > Add a global lock to serialize all OVSDB operations. It is a simple
> > locking scheme to implement and to reason about correctness, without
> > much changes to core of OVSDB implementation.
> >
> > Signed-off-by: Andy Zhou <[email protected]>
>
> I don't understand yet what 'mutex' protects. Maybe it will become more
> clear as I read more patches.
>
> It protects all shared resources. For example, if any sessions shares
common 'db_mon' objects.
This lock effectively serializes all sessions request handling. It is
definitely an overkill, but easier
to get started with multithreading. I will add more comments about this.
Clang is irritating in that, if you fail to put the thread-safety
> annotations on both a function's prototype and its definition (if both
> are present), then it will not check every reference to the function.
> So here is an incremental diff that adds the annotations in the places
> they were missing. It also includes some stylistic changes.
>
> diff --git a/ovsdb/jsonrpc-server.c b/ovsdb/jsonrpc-server.c
> index dc38064..33cb0b2 100644
> --- a/ovsdb/jsonrpc-server.c
> +++ b/ovsdb/jsonrpc-server.c
> @@ -51,7 +51,7 @@ struct ovsdb_jsonrpc_session;
> * method with an error. */
> static bool monitor2_enable__ = true;
>
> -/* A global lock to serilize just about all OVSDB operations. */
> +/* A global lock to serialize just about all OVSDB operations. */
> static struct ovs_mutex mutex = OVS_MUTEX_INITIALIZER;
>
> /* Message rate-limiting. */
> @@ -474,30 +474,33 @@ ovsdb_jsonrpc_server_use_threads(struct
> ovsdb_jsonrpc_server *svr) {
>
> struct ovsdb_jsonrpc_session {
> struct ovs_list node; /* Element in remote's sessions list. */
> - struct ovsdb_session up OVS_GUARDED_BY(mutex);
> + struct ovsdb_session up OVS_GUARDED_BY(mutex);
> const void *remote;
>
> /* Triggers. */
> /* Hmap of "struct ovsdb_jsonrpc_trigger"s. */
> - struct hmap triggers OVS_GUARDED_BY(mutex);
> + struct hmap triggers OVS_GUARDED_BY(mutex);
>
> /* Monitors. */
> /* Hmap of "struct ovsdb_jsonrpc_monitor"s. */
> - struct hmap monitors OVS_GUARDED_BY(mutex);
> + struct hmap monitors OVS_GUARDED_BY(mutex);
>
> /* Network connectivity. */
> struct jsonrpc_session *js; /* JSON-RPC session. */
> unsigned int js_seqno; /* Last jsonrpc_session_get_seqno()
> value. */
> };
>
> -static void ovsdb_jsonrpc_session_close(struct ovsdb_jsonrpc_session *);
> +static void ovsdb_jsonrpc_session_close(struct ovsdb_jsonrpc_session *)
> + OVS_EXCLUDED(mutex);
> static int ovsdb_jsonrpc_session_run(struct ovsdb_jsonrpc_session *)
> OVS_EXCLUDED(mutex);
> -static void ovsdb_jsonrpc_session_wait(struct ovsdb_jsonrpc_session *);
> +static void ovsdb_jsonrpc_session_wait(struct ovsdb_jsonrpc_session *)
> + OVS_EXCLUDED(mutex);
> static void ovsdb_jsonrpc_session_get_memory_usage(
> const struct ovsdb_jsonrpc_session *, struct simap *usage);
> static void ovsdb_jsonrpc_session_got_request(struct
> ovsdb_jsonrpc_session *,
> - struct jsonrpc_msg *);
> + struct jsonrpc_msg *)
> + OVS_REQUIRES(mutex);
> static void ovsdb_jsonrpc_session_got_notify(struct ovsdb_jsonrpc_session
> *,
> struct jsonrpc_msg *);
>
> @@ -524,6 +527,7 @@ ovsdb_jsonrpc_session_create(struct
> ovsdb_jsonrpc_remote *remote,
>
> static void
> ovsdb_jsonrpc_session_close(struct ovsdb_jsonrpc_session *s)
> + OVS_EXCLUDED(mutex)
> {
> struct ovsdb_jsonrpc_server *server;
>
> @@ -596,6 +600,7 @@ ovsdb_jsonrpc_session_set_options(struct
> ovsdb_jsonrpc_session *session,
>
> static void
> ovsdb_jsonrpc_session_wait(struct ovsdb_jsonrpc_session *s)
> + OVS_EXCLUDED(mutex)
> {
> jsonrpc_session_wait(s->js);
> if (!jsonrpc_session_get_backlog(s->js)) {
>
_______________________________________________
dev mailing list
[email protected]
http://openvswitch.org/mailman/listinfo/dev