diff --git a/foundation/org.eclipse.persistence.core/src/org/eclipse/persistence/internal/helper/WriteLockManager.java b/foundation/org.eclipse.persistence.core/src/org/eclipse/persistence/internal/helper/WriteLockManager.java index 5e180ab34d7..4d82dd7eb0e 100644 --- a/foundation/org.eclipse.persistence.core/src/org/eclipse/persistence/internal/helper/WriteLockManager.java +++ b/foundation/org.eclipse.persistence.core/src/org/eclipse/persistence/internal/helper/WriteLockManager.java @@ -79,6 +79,13 @@ public class WriteLockManager { */ private static final Boolean ALLOW_INTERRUPTED_EXCEPTION_TO_BE_FIRED_UP_TRUE = true; + private static final Logger logger = Logger.getLogger(WriteLockManager.class.getSimpleName()); + + private static boolean isInterruptionEnabled() { + String value = System.getProperty("interruptionEnabled"); + return Boolean.parseBoolean(value); + } + /** * This a map from a thread to cache keys the thread is finding itself not being able to acquire. This map is * important to explain why a thread might be stuck in a stack trace of the form: {@code @@ -176,7 +183,15 @@ public Map acquireLocksForClone(Object objectForClone, ClassDescriptor descripto toWaitOn.wait(ConcurrencyUtil.SINGLETON.getAcquireWaitTime());// wait for lock on object to be released } } catch (InterruptedException ex) { - // Ignore exception thread should continue. + //https://jira.site1.hyperwallet.local/browse/HW-53073 + //Custom change to allow thread interruptions for bad threads stuck in org.eclipse.persistence.internal.helper.WriteLockManager.acquireLocksForClone pattern + if (isInterruptionEnabled()) { + logger.log(Level.SEVERE, + "EclipseLinkLockHandler has set interruption flag to TRUE. Allowing interrupts"); + throw ConcurrencyException.waitWasInterrupted(ex.getMessage()); + } + logger.log(Level.WARNING, + "EclipseLinkLockHandler has not set the interruption flag to TRUE. Will not interrupt"); } } Object waitObject = toWaitOn.getObject(); @@ -188,6 +203,7 @@ public Map acquireLocksForClone(Object objectForClone, ClassDescriptor descripto toWaitOn = acquireLockAndRelatedLocks(objectForClone, lockedObjects, refreshedObjects, cacheKey, descriptor, cloningSession); if ((toWaitOn != null) && ((++tries) > MAXTRIES)) { // If we've tried too many times abort. + logger.log(Level.WARNING, "Interruption done by EclipseLink Library."); throw ConcurrencyException.maxTriesLockOnCloneExceded(objectForClone); } }