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

Liu Yuan namei.unix at gmail.com
Fri Nov 29 10:46:57 CET 2013


On Fri, Nov 29, 2013 at 05:39:54PM +0800, Robin Dong wrote:
> 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.

I think we only need one interface. Currently it is a spinlock, and later we
can rework it as rw_lock, which is an optimiaztion of locking internaling,
instead of provide unnecessary locking interfaces.

Thanks
Yuan



More information about the sheepdog mailing list