[sheepdog] [PATCH v2 1/2] cluster: add the distributed lock implemented by zookeeper for object-storage

Robin Dong robin.k.dong at gmail.com
Fri Nov 29 10:39:54 CET 2013


2013/11/29 Liu Yuan <namei.unix at gmail.com>

> On Fri, Nov 29, 2013 at 05:10:31PM +0800, Robin Dong wrote:
> > Implement the distributed lock by zookeeper (refer:
> http://zookeeper.apache.org/doc/trunk/recipes.html)
> > The routine is:
> >         1. create a seq-ephemeral znode in lock directory (use lock-id
> as dir name)
> >         2. get smallest file path as owner of the lock; the other thread
> wait on a pthread_mutex_t
> >         3. if owner of the lock release it (or the owner is killed by
> accident), zookeeper will
> >            trigger zk_watch() which will wake up all waiting threads to
> compete new owner of the lock
> >
> > We add ->local_lock for dist_mutex to avoid many threads in one sheepdog
> daemon to create too many files
> > in a lock directory.
> >
> > Signed-off-by: Robin Dong <sanbai at taobao.com>
> > ---
> >  sheep/cluster.h           |   15 +++++
> >  sheep/cluster/zookeeper.c |  140
> ++++++++++++++++++++++++++++++++++++++++++++-
> >  2 files changed, 154 insertions(+), 1 deletions(-)
> >
> > diff --git a/sheep/cluster.h b/sheep/cluster.h
> > index 81b5ae4..0aa058c 100644
> > --- a/sheep/cluster.h
> > +++ b/sheep/cluster.h
> > @@ -23,6 +23,13 @@
> >  #include "sheep.h"
> >  #include "config.h"
> >
> > +struct dist_mutex {
> > +     uint32_t id;            /* id of this mutex */
> > +     pthread_mutex_t wait;
> > +     pthread_mutex_t local_lock;
> > +     char ephemeral_path[MAX_NODE_STR_LEN];
> > +};
> > +
> >  /*
> >   * maximum payload size sent in ->notify and ->unblock, it should be
> large
> >   * enough to support COROSYNC_MAX_NODES * struct sd_node
> > @@ -109,6 +116,14 @@ struct cluster_driver {
> >       int (*unblock)(void *msg, size_t msg_len);
> >
> >       /*
> > +      * A distributed mutex lock to avoid race condition when using
> swift
> > +      * interface to add/delete/list object.
>
> This is not a swift only operation. Instead it is now as a generic locking
> service.
>
> > +      */
> > +     int (*init_mutex)(struct dist_mutex *mutex, uint32_t id);
> > +     void (*lock_mutex)(struct dist_mutex *mutex);
> > +     void (*unlock_mutex)(struct dist_mutex *mutex);
>
> Please explain every function clearly as other interface does.
>
> Any reason to call it mutex? I'd suggest shorter name as
>

Because it is only mutex now, I will add dist_rwlock,dist_selock or some
other kind of locks in the future.


>
>  ->init_lock()
>  ->lock()
>  ->unlock()
>
> So struct dist_mutex -> struct cluster_lock
>
> Finally, I think you need to initialize local/cluster driver's lock
> interface's
> too, thought it would be currently empty operations for them.


> Thanks
> Yuan
>



-- 
--
Best Regard
Robin Dong
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.wpkg.org/pipermail/sheepdog/attachments/20131129/aa28d733/attachment-0004.html>


More information about the sheepdog mailing list