[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:33:55 CET 2013
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
->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
More information about the sheepdog
mailing list