[ https://issues.apache.org/jira/browse/GEODE-7780?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17032699#comment-17032699 ]
Eric Shu commented on GEODE-7780: --------------------------------- Currently we do not have a good way to update the last access time of an entry if the get is on a client local cache. The last access time is not propagated to servers, and certainly won't update it on entries in other local client caches used by tomcat servers. It seems that put follows after a get would solve the early expiry problem -- however, it incurs additional put operation (distributed operation) for a get. Shall we just stop allow caching proxy being used/set when using session caching through tomcat servers? If this is not feasible, one option could be providing a new method that can be invoked on client so that server will do an update of a key using its latest value. Another option is to provide a way that get on a local client cache will update lastAccessTime of the same entry on all servers and all other local client caches. (I am not sure if there is a way to do this.) > Geode session management could update a stale state and cause some session > attributes to be lost if enableLocalCache is set to true > ----------------------------------------------------------------------------------------------------------------------------------- > > Key: GEODE-7780 > URL: https://issues.apache.org/jira/browse/GEODE-7780 > Project: Geode > Issue Type: Bug > Components: http session > Reporter: Eric Shu > Priority: Major > > I have analyzed the test failure > (https://issues.apache.org/jira/browse/GEODE-7753) and found out the cause. > What happened is that for every session get (get through geode client local > caching), geode session management will do a put of that session to reset the > lastAccessTime on all servers and local caches used by Tomcat servers. > Please see the code below: > {code:java} > public void commit() { > if (!isValidInternal()) > throw new IllegalStateException("commit: Session " + getId() + " > already invalidated"); > // (STRING_MANAGER.getString("deltaSession.commit.ise", getId())); > synchronized (this.changeLock) { > // Jens - there used to be a check to only perform this if the queue is > // empty, but we want this to always run so that the lastAccessedTime > // will be updated even when no attributes have been changed. > DeltaSessionManager mgr = (DeltaSessionManager) this.manager; > if (this.enableGatewayDeltaReplication && mgr.isPeerToPeer()) { > setCurrentGatewayDeltaEvent( > new DeltaSessionAttributeEventBatch(this.sessionRegionName, > this.id, this.eventQueue)); > } > this.hasDelta = true; > this.applyRemotely = true; > putInRegion(getOperatingRegion(), true, null); > this.eventQueue.clear(); > } > } > {code} > However, because this is a client local cache, the get could have stale data > (some delta updates have not been delivered yet through HARegionQueue). This > new update will update on server to be a staled data (lost some of the > attributes). > The stack shows the get and the following put of the session are: > {noformat} > at > org.apache.geode.internal.cache.LocalRegion.get(LocalRegion.java:1312) > at > org.apache.geode.internal.cache.AbstractRegion.get(AbstractRegion.java:436) > at > org.apache.geode.modules.session.catalina.AbstractSessionCache.getSession(AbstractSessionCache.java:69) > at > org.apache.geode.modules.session.catalina.DeltaSessionManager.findSession(DeltaSessionManager.java:340) > at > org.apache.catalina.connector.Request.doGetSession(Request.java:2951) > at > org.apache.catalina.connector.Request.getSessionInternal(Request.java:2677) > at > org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:460) > at > org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) > at > org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) > at > org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:668) > at > org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) > at > org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) > at > org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408) > at > org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) > at > org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:770) > at > org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1415) > at > org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) > at > java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) > at > java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) > at > org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) > at java.lang.Thread.run(Thread.java:748) > {noformat} > and > {noformat} > at > org.apache.geode.internal.cache.LocalRegion.put(LocalRegion.java:1628) > at > org.apache.geode.modules.session.catalina.DeltaSession.putInRegion(DeltaSession.java:442) > at > org.apache.geode.modules.session.catalina.DeltaSession.commit(DeltaSession.java:469) > at > org.apache.geode.modules.session.catalina.DeltaSessionFacade.commit(DeltaSessionFacade.java:36) > at > org.apache.geode.modules.session.catalina.CommitSessionValve.invoke(CommitSessionValve.java:56) > at > org.apache.geode.modules.session.catalina.JvmRouteBinderValve.invoke(JvmRouteBinderValve.java:45) > at > org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:490) > at > org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) > at > org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) > at > org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:668) > at > org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) > at > org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) > at > org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408) > at > org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) > at > org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:770) > at > org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1415) > at > org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) > at > java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) > at > java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) > at > org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) > at java.lang.Thread.run(Thread.java:748) > {noformat} -- This message was sent by Atlassian Jira (v8.3.4#803005)