From 751b8b69066ea65eb27bf6841118abf3bc17eb13 Mon Sep 17 00:00:00 2001 From: Radek Felcman Date: Thu, 27 Feb 2025 12:55:24 +0100 Subject: [PATCH] DeadLock detection diagnostic - WriteLockManager.acquireLocksForClone message change Signed-off-by: Radek Felcman --- .../persistence/internal/helper/ConcurrencyUtil.java | 1 + .../persistence/internal/helper/WriteLockManager.java | 6 +++--- .../jpa/deadlock/diagnostic/CacheDeadLockManagersTest.java | 6 +++--- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/helper/ConcurrencyUtil.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/helper/ConcurrencyUtil.java index 1d4440187d..6e456754d7 100644 --- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/helper/ConcurrencyUtil.java +++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/helper/ConcurrencyUtil.java @@ -1146,6 +1146,7 @@ protected String createInformationAboutAllResourcesAcquiredAndDeferredByAllThrea allRelevantThreads.addAll(concurrencyManagerState.getUnifiedMapOfThreadsStuckTryingToAcquireWriteLock().keySet()); allRelevantThreads.addAll(concurrencyManagerState.getDeferredLockManagerMapClone().keySet()); allRelevantThreads.addAll(concurrencyManagerState.getReadLockManagerMapClone().keySet()); + allRelevantThreads.addAll(concurrencyManagerState.getMapThreadToWaitOnAcquireReadLockClone().keySet()); // (b) print information about all threads StringWriter writer = new StringWriter(); diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/helper/WriteLockManager.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/helper/WriteLockManager.java index 0580636e88..fcbea309c3 100644 --- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/helper/WriteLockManager.java +++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/helper/WriteLockManager.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2024 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2025 Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1998, 2024 IBM Corporation. All rights reserved. * * This program and the accompanying materials are made available under the @@ -170,7 +170,7 @@ public Map acquireLocksForClone(Object objectForClone, ClassDescriptor descripto // to indicate that the current thread is now stuck trying to acquire some arbitrary // cache key for writing lastCacheKeyWeNeededToWaitToAcquire = toWaitOn; - lastCacheKeyWeNeededToWaitToAcquire.putThreadAsWaitingToAcquireLockForWriting(currentThread, ACQUIRE_LOCK_FOR_CLONE_METHOD_NAME); + lastCacheKeyWeNeededToWaitToAcquire.putThreadAsWaitingToAcquireLockForReading(currentThread, ACQUIRE_LOCK_FOR_CLONE_METHOD_NAME); // Since we know this one of those methods that can appear in the dead locks // we threads frozen here forever inside of the wait that used to have no timeout @@ -206,7 +206,7 @@ public Map acquireLocksForClone(Object objectForClone, ClassDescriptor descripto throw ConcurrencyException.maxTriesLockOnCloneExceded(objectForClone); } finally { if (lastCacheKeyWeNeededToWaitToAcquire != null) { - lastCacheKeyWeNeededToWaitToAcquire.removeThreadNoLongerWaitingToAcquireLockForWriting(currentThread); + lastCacheKeyWeNeededToWaitToAcquire.removeThreadNoLongerWaitingToAcquireLockForReading(currentThread); } if (!successful) {//did not acquire locks but we are exiting for (Iterator lockedList = lockedObjects.values().iterator(); lockedList.hasNext();) { diff --git a/jpa/eclipselink.jpa.testapps/jpa.test.diagnostic.deadlock/src/test/java/org/eclipse/persistence/testing/tests/jpa/deadlock/diagnostic/CacheDeadLockManagersTest.java b/jpa/eclipselink.jpa.testapps/jpa.test.diagnostic.deadlock/src/test/java/org/eclipse/persistence/testing/tests/jpa/deadlock/diagnostic/CacheDeadLockManagersTest.java index d1fad11907..8ba19fb6da 100644 --- a/jpa/eclipselink.jpa.testapps/jpa.test.diagnostic.deadlock/src/test/java/org/eclipse/persistence/testing/tests/jpa/deadlock/diagnostic/CacheDeadLockManagersTest.java +++ b/jpa/eclipselink.jpa.testapps/jpa.test.diagnostic.deadlock/src/test/java/org/eclipse/persistence/testing/tests/jpa/deadlock/diagnostic/CacheDeadLockManagersTest.java @@ -36,12 +36,9 @@ import org.eclipse.persistence.testing.models.jpa.deadlock.diagnostic.CacheDeadLockDetectionDetail; import org.eclipse.persistence.testing.models.jpa.deadlock.diagnostic.CacheDeadLockDetectionMaster; import org.eclipse.persistence.testing.models.jpa.deadlock.diagnostic.DeadLockDiagnosticTableCreator; -import org.junit.Assert; import java.util.Map; import java.util.concurrent.Semaphore; -import java.util.concurrent.locks.Lock; -import java.util.concurrent.locks.ReentrantLock; public class CacheDeadLockManagersTest extends JUnitTestCase { @@ -120,6 +117,9 @@ public void testWriteLockManagerAcquireLocksForClone() { Map map = writeLockManager.acquireLocksForClone(result, descriptor, cacheKey, serverSession); } catch (Exception e) { assertEquals(2, logWrapper.getMessageCount(WriteLockManager.class.getName() + ".acquireLocksForClone")); + //WriteLockManager.acquireLocksForClone acquire read lock, not write lock -> not any "...acquire writing.." message + assertEquals(0, logWrapper.getMessageCount("waitingOnAcquireWritingCacheKey: true waiting to acquire writing: --- CacheKey (org.eclipse.persistence.testing.models.jpa.deadlock.diagnostic.CacheDeadLockDetectionMaster): (primaryKey: 1)")); + assertEquals(1, logWrapper.getMessageCount("Waiting to acquire (read lock): --- CacheKey (org.eclipse.persistence.testing.models.jpa.deadlock.diagnostic.CacheDeadLockDetectionMaster): (primaryKey: 1)")); } finally { if (em != null) { if (em.isOpen()) {