Hello All:

I would like to use Curator to synchronize mutually exclusive access to a 
shared resource, however the entity that wants to release a lock is distinct 
from the locking entity (i.e. they are in different JVMS on different 
machines).    Such cases can occur in practice (e.g. producer/consumer 
synchronization, but this isn't quite my use case).   Informally I would like 
to have operations that behave like the following in a JVM based language:

  1.  Strict requirements:
     *   acquire(resourceId, taskId) - Have the task waiting for the resource 
suspend until it has mutually exclusive access (i.e. acquires the lock) or 
throw an exception if the request is somehow invalid (i.e. bad resource Id, bad 
task Id, internal error, etc).
     *   release(resourceId) - Given a resource, if there is an acquired lock, 
release that lock and wake up the next task (in FCFS order) waiting to acquire 
the lock if it exists
  2.  Nice to have (useful for maintenance, etc).
     *   status(resourceId) - Report if the resource is locked, the current 
taskId of the acquirer if the lock is acquired and the (potentially empty)  
FCFS list of tasks waiting to acquire the lock.
     *   releaseAll(resourceId)  - remove all pending locks on this resource

However, the semantics of the recipes I've looked at seem to indicate that the 
releasing entity must have a handle (either explicit or implicit) of the 
lease/lock, e.g.


  *   http://curator.apache.org/curator-recipes/shared-reentrant-lock.html 
states
  *

public void release()
Perform one release of the mutex if the calling thread is the same thread that 
acquired it. If the
thread had made multiple calls to acquire, the mutex will still be held when 
this method returns.



  *   http://curator.apache.org/curator-recipes/shared-semaphore.html states:
  *   Lease instances can either be closed directly or you can use these 
convenience methods:

public void returnAll(Collection<Lease> leases)
public void returnLease(Lease lease)

So it appears on the surface the the expectation is that the same entity that 
acquires a mutex or a semaphore lease is expected to release the mutex or 
return the lease.
My questions are:

  1.  Am I misunderstanding how Curator works?
  2.  Is there a more appropriate abstraction in Curator for my use case?
  3.  Can I use one of the existing recipes?  Could a releasing entity return a 
lease if they had a serialized copy of the lease but weren't the entity 
acquiring the lease?
  4.  If I need to roll my own, should the Curator Framework be able to help 
here or should I work at the raw zookeeper level for this use case?

Thanks for your help with this:

Bill

Reply via email to