Re: [jgroups-users] Locks get locked forever after a cluster members leaves

Questions/problems related to using JGroups <[email protected]> Thu, 14 Dec 2017 13:13:13 +0100
Newsgroups gmane.comp.java.javagroups.general
Message-ID <mailman.8759.1513253614.18279.javagroups-users@lists.sourceforge.net>
I've only assigned the issue but haven't looked at it. TBH, this is not 
on the front burner atm.
I don't believe that the LockService makes sense unless it handles 
partitions (which it doesn't)...

On 01/12/17 15:26, Questions/problems related to using JGroups via 
javagroups-users wrote:
> I saw the issue in Jira was assigned to version 4.0.9, thanks. Is there 
> anything we can do? We looked at the source code of the locking 
> protocol, it doesn't seem to be a trivial fix, correct?
> 
> Met vriendelijke groet / Kind regards,
> Bram Klein Gunnewiek | Shock Media B.V.
> 
> Tel: +31 (0)546 - 714360
> Fax: +31 (0)546 - 714361
> Web:https://www.shockmedia.nl/
> 
> On 11/14/2017 10:05 AM, Questions/problems related to using JGroups via 
> javagroups-users wrote:
>>
>> It took a while but we finally have a test that reproduces our 
>> problem. See https://issues.jboss.org/browse/JGRP-2234 and 
>> https://issues.jboss.org/browse/JGRP-2235
>>
>> Met vriendelijke groet / Kind regards,
>> Bram Klein Gunnewiek | Shock Media B.V.
>>
>> Tel: +31 (0)546 - 714360
>> Fax: +31 (0)546 - 714361
>> Web:https://www.shockmedia.nl/
>> On 10/23/2017 04:16 PM, Questions/problems related to using JGroups wrote:
>>> I'm afraid I don't have time to look into your code, but if you write 
>>> a unit test which reproduces the issue *with JGroups code only*, I'll 
>>> take a look.
>>>
>>> E.g. create 5 channels in the same JVM (each with a LockService), run 
>>> tryLock() / unlock() cycles, make the coord leave and rejoin etc.
>>>
>>> From reading your previous emails, this should be able to reproduce 
>>> the issue.
>>>
>>> On 23/10/17 16:10, Questions/problems related to using JGroups via 
>>> javagroups-users wrote:
>>>> I wrote a whole reply about how the trylock thing works and I saw 
>>>> that I don't wrap the Condition returned by newCondition. Can this 
>>>> explain it? Conditions are used. My reply:
>>>>
>>>> The only reference to 
>>>> org.jgroups.blocks.locking.LockService#getLock(name) on my part is 
>>>> in JGroupsLockManager (actually, its the only class that has any 
>>>> reference to the JGroups LockService).
>>>>
>>>> The JGroupsLockManager is as I described: it wraps the JGroups lock 
>>>> in a LoggingLock that logs all method calls so we can debug it. It 
>>>> then wraps the LoggingLock in a TrylockWrappingLock that ensures 
>>>> that a call to lock() is done as a tryLock(...) throwing an 
>>>> exception if the lock could not be acquired within 20 seconds. I do 
>>>> this to prevent the application locking up when something bad (like 
>>>> a deadlock) happens. Both the LoggingLock and the 
>>>> TryLockWrappingLock implement java.util.concurrent.locks.Lock:
>>>>
>>>>      final Lock actualLock = lockService.getLock(name); // <-- 
>>>> lockService is a org.jgroups.blocks.locking.LockService instance 
>>>> (the only instance used)
>>>>      final LoggingLock loggingLock = new LoggingLock(name, actualLock);
>>>>      return new TrylockWrappingLock(loggingLock, timeout, 
>>>> TimeUnit.MILLISECONDS, this::printLockError);
>>>>
>>>> The lock() and lockInterruptibly() implementation of the 
>>>> TrylockWrappingLock looks like this:
>>>>
>>>>      try {
>>>>          if (!tryLock(maxTrylockTimeout, maxTrylockTimeUnit)) {
>>>>              throw new IllegalStateException(String.format("Regular 
>>>> lock request timed out on thread '[%d][%s]' with lock '%s'!", 
>>>> Thread.currentThread().getId(), Thread.currentThread().getName(), 
>>>> actualLock));
>>>>          }
>>>>      } catch (IllegalStateException e) {
>>>>          log.error(e.getMessage(), e);
>>>>          if (null != onLockTimeout) {
>>>>              try {
>>>>                  onLockTimeout.accept(actualLock);
>>>>              } catch (RuntimeException e2) {
>>>>                  log.warn(e2.getMessage(), e2);
>>>>              }
>>>>          }
>>>>          throw e;
>>>>      }
>>>>
>>>> The tryLock implementation looks like this:
>>>>
>>>>      boolean result = false;
>>>>      try {
>>>>          result = actualLock.tryLock(time, unit);
>>>>      } finally {
>>>>          if (!result) {
>>>>              silentUnlock();
>>>>          }
>>>>      }
>>>>      return result;
>>>>
>>>> And silentUnlock looks like this:
>>>>
>>>>      try {
>>>>          unlock();
>>>>      } catch (RuntimeException e) {
>>>>          /* ignore */
>>>>      }
>>>>
>>>> The tryLock implementation of the LoggingLock looks like this:
>>>>
>>>>      public boolean tryLock() {
>>>>          preAquireLock(track);
>>>>
>>>>          boolean result = actualLock.tryLock();
>>>>
>>>>          postAquireLock(track, result);
>>>>          return result;
>>>>      }
>>>>
>>>>      public boolean tryLock(long time, TimeUnit unit) throws 
>>>> InterruptedException {
>>>>          preAquireLock(track);
>>>>
>>>>          boolean result = actualLock.tryLock(time, unit);
>>>>
>>>>          postAquireLock(track, result);
>>>>          return result;
>>>>      }
>>>>
>>>> I see what you mean with the fact that the TL/L output is from a 
>>>> Request (and not a client or server lock).
>>>>
>>>> Met vriendelijke groet / Kind regards,
>>>> Bram Klein Gunnewiek | Shock Media B.V.
>>>>
>>>> Tel: +31 (0)546 - 714360
>>>> Fax: +31 (0)546 - 714361
>>>> Web:https://www.shockmedia.nl/
>>>>
>>>> On 10/23/2017 03:31 PM, Questions/problems related to using JGroups 
>>>> wrote:
>>>>>
>>>>>
>>>>> On 23/10/17 15:27, Questions/problems related to using JGroups via 
>>>>> javagroups-users wrote:
>>>>>>
>>>>>> Met vriendelijke groet / Kind regards,
>>>>>> Bram Klein Gunnewiek | Shock Media B.V.
>>>>>>
>>>>>> Tel: +31 (0)546 - 714360
>>>>>> Fax: +31 (0)546 - 714361
>>>>>> Web:https://www.shockmedia.nl/
>>>>>>
>>>>>> On 10/23/2017 03:15 PM, Questions/problems related to using 
>>>>>> JGroups wrote:
>>>>>>>
>>>>>>>
>>>>>>> On 23/10/17 15:05, Questions/problems related to using JGroups 
>>>>>>> via javagroups-users wrote:
>>>>>>>
>>>>>>>>> What do you mean? You must have called Lock.lock(), right? 
>>>>>>>>> Below you mention that all lock() calls are changed into 
>>>>>>>>> corresponding tryLock() calls, but the output you showed 
>>>>>>>>> clearly indicate that the queue has a regular lock() request by 
>>>>>>>>> 373 pending, followed by a tryLock() request...
>>>>>>>>
>>>>>>>> I need some more time to reply to your first response but this 
>>>>>>>> one is easy. I *never* use a regular lock() call on the JGroups 
>>>>>>>> lock (I wrap them, see example), the only calls done on the 
>>>>>>>> JGroups lock are tryLock(..) calls.
>>>>>>>
>>>>>>> Well, why am I seeing a regular lock() request in the queue then 
>>>>>>> (see the first queue element below)?
>>>>>>>
>>>>>>>   queue:
>>>>>>> L(writelock/regular/instance_2_1/,40388::373)
>>>>>>> TL(writelock/regular/instance_2_1/,45507::413,20000)
>>>>>>>
>>>>>>> The  first queued lock request is clearly a Request for a lock() 
>>>>>>> , *not* a tryLock()!
>>>>>>
>>>>>> I'll check this again. What my assumption whas that something had 
>>>>>> reset the is_trylock flag while the lock was still in the queue 
>>>>>> but I could be wrong.
>>>>>
>>>>> That's impossible; we're talking about a Request, and 
>>>>> Request.is_try_lock is (pretty much) immutable!
>>>>>
>>>>>
>>>>>>> -
>>>>>>> Bela Ban | http://www.jgroups.org
>>>>>>>
>>>>>>>
>>>>>>> ------------------------------------------------------------------------------ 
>>>>>>>
>>>>>>> Check out the vibrant tech community on one of the world's most
>>>>>>> engaging tech sites, Slashdot.org! http://sdm.link/slashdot
>>>>>>> _______________________________________________
>>>>>>> javagroups-users mailing list
>>>>>>> [email protected]
>>>>>>> https://lists.sourceforge.net/lists/listinfo/javagroups-users
>>>>>>
>>>>>>
>>>>>>
>>>>>> ------------------------------------------------------------------------------ 
>>>>>>
>>>>>> Check out the vibrant tech community on one of the world's most
>>>>>> engaging tech sites, Slashdot.org! http://sdm.link/slashdot
>>>>>>
>>>>>>
>>>>>>
>>>>>> _______________________________________________
>>>>>> javagroups-users mailing list
>>>>>> [email protected]
>>>>>> https://lists.sourceforge.net/lists/listinfo/javagroups-users
>>>>>>
>>>>>
>>>>
>>>>
>>>>
>>>> ------------------------------------------------------------------------------ 
>>>>
>>>> Check out the vibrant tech community on one of the world's most
>>>> engaging tech sites, Slashdot.org! http://sdm.link/slashdot
>>>>
>>>>
>>>>
>>>> _______________________________________________
>>>> javagroups-users mailing list
>>>> [email protected]
>>>> https://lists.sourceforge.net/lists/listinfo/javagroups-users
>>>>
>>>
>>
>>
>>
>> ------------------------------------------------------------------------------
>> Check out the vibrant tech community on one of the world's most
>> engaging tech sites, Slashdot.org!http://sdm.link/slashdot
>>
>>
>> _______________________________________________
>> javagroups-users mailing list
>> [email protected]
>> https://lists.sourceforge.net/lists/listinfo/javagroups-users
> 
> 
> 
> ------------------------------------------------------------------------------
> Check out the vibrant tech community on one of the world's most
> engaging tech sites, Slashdot.org! http://sdm.link/slashdot
> 
> 
> 
> _______________________________________________
> javagroups-users mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/javagroups-users
> 

-- 
Bela Ban | http://www.jgroups.org


------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
javagroups-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/javagroups-users