Fixed by myself.

There are two errors in my code/configuration.

1) lock are only supported in TRANSACTIONAL mode. I missed it in my
configuration.
2) within a lock block, can't start cache:
  IgniteCache<String, NamedSequence> cache =
ignite.cache(NamedSequence.CACHE_NAME_ID);
  
  Above code should be called out of the lock block.

Thanks
Shawn

-----邮件原件-----
发件人: Shawn Du [mailto:shawn...@neulion.com.cn] 
发送时间: 2016年11月24日 14:20
收件人: user@ignite.apache.org
主题: Lock and Failed to unlock keys exception

Hi,

I am trying to implement distributed ID generators using lock and caches. 

I wrote some codes like this, but it always throw exception "Failed to
unlock keys exception". 
The code may runs in different JVM/hosts.

Do I misuse the lock feature?  Thanks in advance.

----------------------------------------------------
Lock lock = osCache.lock(Os.CACHE_LOCK); try {
        lock.lock();
        os = osCache.get(videoMessage.os());
        if (os == null)
        {
                os = new Os(videoMessage.os(),
idGenerator.next(Os.class.getName()));
                osCache.put(os.getName(), os);
        }
        videoMessage.os(os.getId() + "");
}
finally
{
        lock.unlock();
}

-------------------------------------------------------End
IdGenerator.next looks like this:
-------------------------------------------------------
public int next(String name)
{
        IgniteCache<String, NamedSequence> cache =
ignite.cache(NamedSequence.CACHE_NAME_ID);
        NamedSequence sequence = cache.get(name);
        if (sequence == null)
        {
                sequence = new NamedSequence(name);
        }
        else
        {
                sequence.increase();
        }
        cache.put(sequence.getName(), sequence);
        return sequence.getSequence();
}
----------------------------------------------------------

Reply via email to