Skip to content

Commit 923a428

Browse files
author
Radek Felcman
authored
DeadLock detection diagnostic - WriteLockManager.acquireLocksForClone message change (#2450)
Fixes #2173 There is incorrect log output in case if deadlock is detected and dump triggered in WriteLockManager.acquireLocksForClonemessage(). Mentioned method acquire read lock instead of write lock -> logged output was incorrect. (cherry picked from commit d5d4f23) Signed-off-by: Radek Felcman <radek.felcman@oracle.com>
1 parent 6536fe2 commit 923a428

3 files changed

Lines changed: 6 additions & 3 deletions

File tree

foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/helper/ConcurrencyUtil.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1147,6 +1147,7 @@ protected String createInformationAboutAllResourcesAcquiredAndDeferredByAllThrea
11471147
allRelevantThreads.addAll(concurrencyManagerState.getUnifiedMapOfThreadsStuckTryingToAcquireWriteLock().keySet());
11481148
allRelevantThreads.addAll(concurrencyManagerState.getDeferredLockManagerMapClone().keySet());
11491149
allRelevantThreads.addAll(concurrencyManagerState.getReadLockManagerMapClone().keySet());
1150+
allRelevantThreads.addAll(concurrencyManagerState.getMapThreadToWaitOnAcquireReadLockClone().keySet());
11501151

11511152
// (b) print information about all threads
11521153
StringWriter writer = new StringWriter();

foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/helper/WriteLockManager.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@
4545
import java.util.concurrent.ConcurrentHashMap;
4646
import java.util.concurrent.Semaphore;
4747
import java.util.concurrent.TimeUnit;
48-
import java.util.concurrent.locks.Condition;
4948
import java.util.concurrent.locks.Lock;
5049
import java.util.concurrent.locks.ReentrantLock;
5150

@@ -169,7 +168,7 @@ public Map acquireLocksForClone(Object objectForClone, ClassDescriptor descripto
169168
// to indicate that the current thread is now stuck trying to acquire some arbitrary
170169
// cache key for writing
171170
lastCacheKeyWeNeededToWaitToAcquire = toWaitOn;
172-
lastCacheKeyWeNeededToWaitToAcquire.putThreadAsWaitingToAcquireLockForWriting(currentThread, ACQUIRE_LOCK_FOR_CLONE_METHOD_NAME);
171+
lastCacheKeyWeNeededToWaitToAcquire.putThreadAsWaitingToAcquireLockForReading(currentThread, ACQUIRE_LOCK_FOR_CLONE_METHOD_NAME);
173172

174173
// Since we know this one of those methods that can appear in the dead locks
175174
// we threads frozen here forever inside of the wait that used to have no timeout
@@ -205,7 +204,7 @@ public Map acquireLocksForClone(Object objectForClone, ClassDescriptor descripto
205204
throw ConcurrencyException.maxTriesLockOnCloneExceded(objectForClone);
206205
} finally {
207206
if (lastCacheKeyWeNeededToWaitToAcquire != null) {
208-
lastCacheKeyWeNeededToWaitToAcquire.removeThreadNoLongerWaitingToAcquireLockForWriting(currentThread);
207+
lastCacheKeyWeNeededToWaitToAcquire.removeThreadNoLongerWaitingToAcquireLockForReading(currentThread);
209208
}
210209
if (!successful) {//did not acquire locks but we are exiting
211210
for (Iterator lockedList = lockedObjects.values().iterator(); lockedList.hasNext();) {

jpa/eclipselink.jpa.testapps/jpa.test.diagnostic.deadlock/src/test/java/org/eclipse/persistence/testing/tests/jpa/deadlock/diagnostic/CacheDeadLockManagersTest.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,9 @@ public void testWriteLockManagerAcquireLocksForClone() {
119119
Map map = writeLockManager.acquireLocksForClone(result, descriptor, cacheKey, serverSession);
120120
} catch (Exception e) {
121121
assertEquals(2, logWrapper.getMessageCount(WriteLockManager.class.getName() + ".acquireLocksForClone"));
122+
//WriteLockManager.acquireLocksForClone acquire read lock, not write lock -> not any "...acquire writing.." message
123+
assertEquals(0, logWrapper.getMessageCount("waitingOnAcquireWritingCacheKey: true waiting to acquire writing: --- CacheKey (org.eclipse.persistence.testing.models.jpa.deadlock.diagnostic.CacheDeadLockDetectionMaster): (primaryKey: 1)"));
124+
assertEquals(1, logWrapper.getMessageCount("Waiting to acquire (read lock): --- CacheKey (org.eclipse.persistence.testing.models.jpa.deadlock.diagnostic.CacheDeadLockDetectionMaster): (primaryKey: 1)"));
122125
} finally {
123126
if (em != null) {
124127
if (em.isOpen()) {

0 commit comments

Comments
 (0)