Skip to content

Commit 5ec096e

Browse files
committed
L2 Cache Deadlock Prevention
1 parent 4a7149f commit 5ec096e

File tree

2 files changed

+33
-19
lines changed

2 files changed

+33
-19
lines changed

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -721,7 +721,7 @@ public void releaseDeferredLock() throws ConcurrencyException {
721721
throw ConcurrencyException.waitWasInterrupted(interrupted.getMessage());
722722
}
723723
}
724-
} catch (Error error) {
724+
} catch (Error | Exception error) {
725725
if (!releaseAllLocksAquiredByThreadAlreadyPerformed) {
726726
THREADS_WAITING_TO_RELEASE_DEFERRED_LOCKS.remove(currentThread);
727727
AbstractSessionLog.getLog().logThrowable(SessionLog.SEVERE, SessionLog.CACHE, error);

foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/ObjectChangeSet.java

+32-18
Original file line numberDiff line numberDiff line change
@@ -521,33 +521,47 @@ protected Object getObjectForMerge(MergeManager mergeManager, AbstractSession se
521521
CacheKey cacheKey = session.getIdentityMapAccessorInstance().getCacheKeyForObject(primaryKey, descriptor.getJavaClass(), descriptor, true);
522522
if (cacheKey != null) {
523523
if (cacheKey.acquireReadLockNoWait()) {
524-
domainObject = cacheKey.getObject();
525-
cacheKey.releaseReadLock();
524+
try {
525+
domainObject = cacheKey.getObject();
526+
} catch (Exception exception) {
527+
exception.printStackTrace();
528+
}
529+
finally {
530+
cacheKey.releaseReadLock();
531+
}
526532
} else {
527533
if (!mergeManager.isTransitionedToDeferredLocks()) {
528534
session.getIdentityMapAccessorInstance().getWriteLockManager().transitionToDeferredLocks(mergeManager);
529535
}
530536
cacheKey.acquireDeferredLock();
531-
domainObject = cacheKey.getObject();
532-
int tries = 0;
533-
while (domainObject == null) {
534-
++tries;
535-
if (tries > MAX_TRIES){
536-
session.getParent().log(SessionLog.SEVERE, SessionLog.CACHE, "entity_not_available_during_merge", new Object[]{descriptor.getJavaClassName(), cacheKey.getKey(), Thread.currentThread().getName(), cacheKey.getActiveThread()});
537-
break;
538-
}
539-
synchronized (cacheKey) {
540-
if (cacheKey.isAcquired()) {
541-
try {
542-
cacheKey.wait(10);
543-
} catch (InterruptedException e) {
544-
//ignore and return
537+
try {
538+
domainObject = cacheKey.getObject();
539+
int tries = 0;
540+
while (domainObject == null) {
541+
++tries;
542+
if (tries > MAX_TRIES){
543+
if (session.getParent() != null) {
544+
session.getParent().log(SessionLog.SEVERE, SessionLog.CACHE, "entity_not_available_during_merge", new Object[]{descriptor.getJavaClassName(), cacheKey.getKey(), Thread.currentThread().getName(), cacheKey.getActiveThread()});
545545
}
546+
break;
547+
}
548+
synchronized (cacheKey) {
549+
if (cacheKey.isAcquired()) {
550+
try {
551+
cacheKey.wait(10);
552+
} catch (InterruptedException e) {
553+
//ignore and return
554+
}
555+
}
556+
domainObject = cacheKey.getObject();
546557
}
547-
domainObject = cacheKey.getObject();
548558
}
559+
} catch (Exception exception) {
560+
exception.printStackTrace();
561+
}
562+
finally {
563+
cacheKey.releaseDeferredLock();
549564
}
550-
cacheKey.releaseDeferredLock();
551565
}
552566
} else {
553567
domainObject = mergeManager.registerExistingObjectOfReadOnlyClassInNestedTransaction(getUnitOfWorkClone(), descriptor, session);

0 commit comments

Comments
 (0)