On Fri, Mar 18, 2016 at 6:08 PM, Ben Pfaff <b...@ovn.org> 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 <az...@ovn.org>
>
> 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
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to