Hi,

I'm trying to provide mutex services through a singleton class
(methods lock and unlock). It basically follows lock recipe, but I'm
having a problem how to handle connection loss properly if it happens
during mutex wait:

pseudocode/snippet:


public class SingletonMutex implements Watcher
{
    private Integer mutex;
    private ZooKeeper zk;

    public void process(WatchedEvent event)
    {
        synchronized (mutex)
        {
            mutex.notifyAll();
        }
    }

    private String lock()
    {
        <create ephemeral znode>
        <find children and do related checks>

        if (there_is_somebody_with_smaller_number)
        {
            mutex.wait();

            if (isConnected() == false)
                throw new Exception("foobar");
        }
    }
}

Question is: If there is a server disconnect during mutex.wait, the
thread will wake up without having any means to continue (or delete
the znode), so it throws an exception. However, if this is only due to
connection loss (and not session expire), the lock znode it has
created previously will not be deleted, thus resulting in a deadlock.
One way would be to use sessionId in lock name and check if we already
have the lock when entering lock method. However, since this is
singleton class and used by multiple threads, that approach won't
work. Using thread ID for this purpose or some form of internal
bookkeeping is also not very robust. Currently I just do zk.close and
get another instance on connection loss, which seems to solve the
problem.

Is there any other way to do this?

Thanks for any comments/suggestions,

-Jaakko

Reply via email to