Support Article
ConcurrentModificationException in iterating GlobalContextCache
SA-35387
Summary
User requires the HFix 26430 for version Pega 7.1.7 with the backport.
Error Messages
[fault (self-tuning)'] [ ] [ ] [ ] ( services.http.HTTPService) ERROR stage2cpp085|xx.xx.xx.xx - Caught unexpected java.util.ConcurrentModificationException, message='', stacktrace=java.util.ConcurrentModificationException
at java.util.HashMap$HashIterator.nextEntry(HashMap.java:926)
at java.util.HashMap$KeyIterator.next(HashMap.java:960)
at com.pega.pegarules.session.internal.authorization.context.GlobalContextCache.getBasicApplicationContext(GlobalContextCache.java:495)
at com.pega.pegarules.session.internal.authorization.context.GlobalContextCache.getLocalizedApplicationContext(GlobalContextCache.java:582)
at com.pega.pegarules.session.internal.authorization.context.AuthorizationContextManagerImpl.getContext(AuthorizationContextManagerImpl.java:132)
at com.pega.pegarules.session.internal.authorization.SessionAuthorization.getContext(SessionAuthorization.java:554)
at com.pega.pegarules.session.internal.authorization.SessionAuthorization.getContext(SessionAuthorization.java:527)
at com.pega.pegarules.session.internal.authorization.SessionAuthorization.reset(SessionAuthorization.java:461)
at com.pega.pegarules.session.internal.authorization.SessionAuthorization.<init>(SessionAuthorization.java:245)
at com.pega.pegarules.session.internal.mgmt.PRRequestorBase.allocateSessionAuthorization(PRRequestorBase.java:539)
at com.pega.pegarules.session.internal.mgmt.PRRequestorImpl.allocateSessionAuthorization(PRRequestorImpl.java:2009)
at com.pega.pegarules.session.internal.authorization.Authorization.reset(Authorization.java:433)
at com.pega.pegarules.session.internal.authorization.Authorization.reset(Authorization.java:382)
at com.pega.pegarules.session.internal.authorization.Authorization.onBeforeThreadUse(Authorization.java:1629)
at com.pega.pegarules.session.internal.mgmt.base.ThreadPassivation.configureThreadImpl(ThreadPassivation.java:322)
at com.pega.pegarules.session.internal.mgmt.PRThreadBase.configureThread(PRThreadBase.java:177)
at com.pega.pegarules.session.internal.mgmt.PRThreadImpl.<init>(PRThreadImpl.java:134)
at com.pega.pegarules.session.internal.mgmt.PRThreadImpl.acquire(PRThreadImpl.java:158)
at com.pega.pegarules.session.internal.mgmt.base.RequestorThreadSync.getOrCreateThread(RequestorThreadSync.java:175)
at com.pega.pegarules.session.internal.mgmt.base.RequestorThreadSync.getOrCreateThread(RequestorThreadSync.java:162)
at com.pega.pegarules.session.internal.mgmt.base.RequestorThreadSync.getOrCreateThread(RequestorThreadSync.java:158)
at com.pega.pegarules.session.internal.mgmt.base.RequestorPassivation.configureRequestorImpl(RequestorPassivation.java:479)
at com.pega.pegarules.session.internal.mgmt.PRRequestorBase.configureRequestor(PRRequestorBase.java:482)
at com.pega.pegarules.session.internal.mgmt.PRRequestorImpl.<init>(PRRequestorImpl.java:300)
at com.pega.pegarules.session.internal.mgmt.PRRequestorImpl.acquire(PRRequestorImpl.java:324)
at com.pega.pegarules.session.internal.mgmt.base.MultiThreadRequestorFactory.acquire(MultiThreadRequestorFactory.java:63)
at com.pega.pegarules.session.internal.mgmt.base.NodeRequestorMgt.createRequestorImpl(NodeRequestorMgt.java:1483)
at com.pega.pegarules.session.internal.mgmt.PRNodeImpl.createRequestor(PRNodeImpl.java:273)
at com.pega.pegarules.session.internal.PRSessionProviderImpl.borrowRequestor(PRSessionProviderImpl.java:655)
at com.pega.pegarules.session.internal.PRSessionProviderImpl.obtainRequestor(PRSessionProviderImpl.java:1474)
at com.pega.pegarules.session.internal.PRSessionProviderImpl.doWithRequestorLocked(PRSessionProviderImpl.java:980)
at com.pega.pegarules.session.internal.PRSessionProviderImpl.doWithRequestorLocked(PRSessionProviderImpl.java:874)
at com.pega.pegarules.session.internal.mgmt.RequestorPool.borrowRequestor(RequestorPool.java:514)
at com.pega.pegarules.session.internal.mgmt.RequestorPoolManager.borrowRequestor(RequestorPoolManager.java:77)
at com.pega.pegarules.session.internal.PRSessionProviderImpl.borrowRequestor(PRSessionProviderImpl.java:643)
at com.pega.pegarules.session.internal.PRSessionProviderImpl.obtainRequestor(PRSessionProviderImpl.java:1474)
at com.pega.pegarules.session.internal.PRSessionProviderImpl.doWithRequestorLocked(PRSessionProviderImpl.java:980)
at com.pega.pegarules.session.internal.PRSessionProviderImpl.doWithRequestorLocked(PRSessionProviderImpl.java:841)
at com.pega.pegarules.integration.engine.internal.services.ServiceAPI.getServiceMethod(ServiceAPI.java:3051)
at com.pega.pegarules.integration.engine.internal.services.http.HTTPService.invoke(HTTPService.java:258)
at com.pega.pegarules.session.internal.engineinterface.etier.impl.EngineImpl._invokeEngine_privact(EngineImpl.java:315)
at com.pega.pegarules.session.internal.engineinterface.etier.impl.EngineImpl.invokeEngine(EngineImpl.java:263)
at com.pega.pegarules.session.internal.engineinterface.etier.ejb.EngineBean.invokeEngine(EngineBean.java:225)
at sun.reflect.GeneratedMethodAccessor124.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.pega.pegarules.internal.bootstrap.PRBootstrap.invokeMethod(PRBootstrap.java:367)
at com.pega.pegarules.internal.bootstrap.PRBootstrap.invokeMethodPropagatingThrowable(PRBootstrap.java:408)
at
Steps to Reproduce
Reproducible only in production with large load.
Root Cause
A defect in Pegasystems’ code or rules.
In GlobalContextCache.getBasicApplicationContext Pega are iterating over the keyset of a synchronized map. Pega needs to manually synchronize the map before iterating over its keyset which Pega is not doing.
Resolution
Apply HFix-33202.
Published April 7, 2017 - Updated October 8, 2020
Have a question? Get answers now.
Visit the Collaboration Center to ask questions, engage in discussions, share ideas, and help others.