Return-Path: X-Original-To: archive-asf-public-internal@cust-asf2.ponee.io Delivered-To: archive-asf-public-internal@cust-asf2.ponee.io Received: from cust-asf.ponee.io (cust-asf.ponee.io [163.172.22.183]) by cust-asf2.ponee.io (Postfix) with ESMTP id 5C625200C72 for ; Thu, 27 Apr 2017 08:28:11 +0200 (CEST) Received: by cust-asf.ponee.io (Postfix) id 5B318160BB2; Thu, 27 Apr 2017 06:28:11 +0000 (UTC) Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by cust-asf.ponee.io (Postfix) with SMTP id 83381160BA7 for ; Thu, 27 Apr 2017 08:28:10 +0200 (CEST) Received: (qmail 23551 invoked by uid 500); 27 Apr 2017 06:28:09 -0000 Mailing-List: contact dev-help@geode.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@geode.apache.org Delivered-To: mailing list dev@geode.apache.org Received: (qmail 23456 invoked by uid 99); 27 Apr 2017 06:28:09 -0000 Received: from pnap-us-west-generic-nat.apache.org (HELO spamd1-us-west.apache.org) (209.188.14.142) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 27 Apr 2017 06:28:09 +0000 Received: from localhost (localhost [127.0.0.1]) by spamd1-us-west.apache.org (ASF Mail Server at spamd1-us-west.apache.org) with ESMTP id EA716CD41E for ; Thu, 27 Apr 2017 06:28:08 +0000 (UTC) X-Virus-Scanned: Debian amavisd-new at spamd1-us-west.apache.org X-Spam-Flag: NO X-Spam-Score: -99.202 X-Spam-Level: X-Spam-Status: No, score=-99.202 tagged_above=-999 required=6.31 tests=[KAM_ASCII_DIVIDERS=0.8, RP_MATCHES_RCVD=-0.001, SPF_PASS=-0.001, USER_IN_WHITELIST=-100] autolearn=disabled Received: from mx1-lw-us.apache.org ([10.40.0.8]) by localhost (spamd1-us-west.apache.org [10.40.0.7]) (amavisd-new, port 10024) with ESMTP id i1DO-0csHS8f for ; Thu, 27 Apr 2017 06:28:07 +0000 (UTC) Received: from mailrelay1-us-west.apache.org (mailrelay1-us-west.apache.org [209.188.14.139]) by mx1-lw-us.apache.org (ASF Mail Server at mx1-lw-us.apache.org) with ESMTP id D27AE5FAFA for ; Thu, 27 Apr 2017 06:28:06 +0000 (UTC) Received: from jira-lw-us.apache.org (unknown [207.244.88.139]) by mailrelay1-us-west.apache.org (ASF Mail Server at mailrelay1-us-west.apache.org) with ESMTP id 067C4E0DA7 for ; Thu, 27 Apr 2017 06:28:06 +0000 (UTC) Received: from jira-lw-us.apache.org (localhost [127.0.0.1]) by jira-lw-us.apache.org (ASF Mail Server at jira-lw-us.apache.org) with ESMTP id A6E9721DF9 for ; Thu, 27 Apr 2017 06:28:04 +0000 (UTC) Date: Thu, 27 Apr 2017 06:28:04 +0000 (UTC) From: "ASF subversion and git services (JIRA)" To: dev@geode.apache.org Message-ID: In-Reply-To: References: Subject: [jira] [Commented] (GEODE-2808) Deadlock in tomcat session module during session expiration MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-JIRA-FingerPrint: 30527f35849b9dde25b450d4833f0394 archived-at: Thu, 27 Apr 2017 06:28:11 -0000 [ https://issues.apache.org/jira/browse/GEODE-2808?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15986091#comment-15986091 ] ASF subversion and git services commented on GEODE-2808: -------------------------------------------------------- Commit 80a95f6047ad64d165744f5ae4088b409484d50f in geode's branch refs/heads/feature/GEM-1299 from [~upthewaterspout] [ https://git-wip-us.apache.org/repos/asf?p=geode.git;h=80a95f6 ] GEODE-2808 - Fixing lock ordering issues in DeltaSession Region expiration of sessions and explicit expiration of sessions had lock ordering issues. Fixing the code so that expiration goes through the region entry lock first, before getting the lock on StandardSession. Adding a workaround for the fact that liferay calls removeAttribute from within session expiration by ignoreing remoteAttribute calls during expiration. This closes #472 > Deadlock in tomcat session module during session expiration > ----------------------------------------------------------- > > Key: GEODE-2808 > URL: https://issues.apache.org/jira/browse/GEODE-2808 > Project: Geode > Issue Type: Bug > Components: http session > Reporter: Dan Smith > Assignee: Dan Smith > Fix For: 1.2.0 > > > We observed a deadlock in the tomcat session state replication module due to the way we do expiration. Here are the threads that are involved: > {noformat} > Found one Java-level deadlock: > ============================= > "http-nio-21064-exec-2": > waiting to lock monitor 0x00007f9a04bde298 (object 0x00000007947da1f0, a org.apache.geode.internal.cache.VersionedStatsLRURegionEntryHeapObjectKey), > which is held by "Timer-1" > "Timer-1": > waiting to lock monitor 0x00007f99a4004e38 (object 0x00000007947da240, a org.apache.geode.modules.session.catalina.DeltaSession8), > which is held by "http-nio-21064-exec-2" > Java stack information for the threads listed above: > =================================================== > "http-nio-21064-exec-2": > at org.apache.geode.internal.cache.AbstractRegionMap.destroy(AbstractRegionMap.java:1228) > - waiting to lock <0x00000007947da1f0> (a org.apache.geode.internal.cache.VersionedStatsLRURegionEntryHeapObjectKey) > at org.apache.geode.internal.cache.LocalRegion.mapDestroy(LocalRegion.java:6785) > at org.apache.geode.internal.cache.LocalRegion.mapDestroy(LocalRegion.java:6762) > at org.apache.geode.internal.cache.LocalRegionDataView.destroyExistingEntry(LocalRegionDataView.java:55) > at org.apache.geode.internal.cache.LocalRegion.basicDestroy(LocalRegion.java:6724) > at org.apache.geode.internal.cache.LocalRegion.validatedDestroy(LocalRegion.java:1110) > at org.apache.geode.internal.cache.LocalRegion.destroy(LocalRegion.java:1095) > at org.apache.geode.internal.cache.AbstractRegion.destroy(AbstractRegion.java:271) > at org.apache.geode.modules.session.catalina.AbstractSessionCache.destroySession(AbstractSessionCache.java:72) > at org.apache.geode.modules.session.catalina.DeltaSessionManager.remove(DeltaSessionManager.java:405) > at org.apache.catalina.session.StandardSession.expire(StandardSession.java:850) > - locked <0x00000007947da240> (a org.apache.geode.modules.session.catalina.DeltaSession8) > at org.apache.catalina.session.StandardSession.isValid(StandardSession.java:682) > at org.apache.catalina.connector.Request.doGetSession(Request.java:2917) > at org.apache.catalina.connector.Request.getSession(Request.java:2367) > at org.apache.geode.modules.session.catalina.CommitSessionValve.invoke(CommitSessionValve.java:50) > at org.apache.geode.modules.session.catalina.JvmRouteBinderValve.invoke(JvmRouteBinderValve.java:46) > at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:474) > at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140) > at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) > at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) > at org.apache.geode.modules.session.catalina.JvmRouteBinderValve.invoke(JvmRouteBinderValve.java:46) > at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:349) > at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:783) > at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) > at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:789) > at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1437) > at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) > - locked <0x00000007948d6870> (a org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper) > at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) > at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) > at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) > at java.lang.Thread.run(Thread.java:745) > "Timer-1": > at org.apache.catalina.session.StandardSession.expire(StandardSession.java:791) > - waiting to lock <0x00000007947da240> (a org.apache.geode.modules.session.catalina.DeltaSession8) > at org.apache.catalina.session.StandardSession.expire(StandardSession.java:766) > at org.apache.geode.modules.session.catalina.DeltaSession8.processExpired(DeltaSession8.java:320) > at org.apache.geode.modules.session.catalina.callback.SessionExpirationCacheListener.afterDestroy(SessionExpirationCacheListener.java:56) > at org.apache.geode.internal.cache.EnumListenerEvent$AFTER_DESTROY.dispatchEvent(EnumListenerEvent.java:151) > at org.apache.geode.internal.cache.LocalRegion.dispatchEvent(LocalRegion.java:8751) > at org.apache.geode.internal.cache.LocalRegion.dispatchListenerEvent(LocalRegion.java:7245) > at org.apache.geode.internal.cache.LocalRegion.invokeDestroyCallbacks(LocalRegion.java:7052) > at org.apache.geode.internal.cache.EntryEventImpl.invokeCallbacks(EntryEventImpl.java:2293) > at org.apache.geode.internal.cache.AbstractRegionEntry.dispatchListenerEvents(AbstractRegionEntry.java:140) > at org.apache.geode.internal.cache.LocalRegion.basicDestroyPart2(LocalRegion.java:6992) > at org.apache.geode.internal.cache.AbstractRegionMap.destroy(AbstractRegionMap.java:1419) > - locked <0x00000007947da1f0> (a org.apache.geode.internal.cache.VersionedStatsLRURegionEntryHeapObjectKey) > at org.apache.geode.internal.cache.LocalRegion.mapDestroy(LocalRegion.java:6785) > at org.apache.geode.internal.cache.LocalRegion.mapDestroy(LocalRegion.java:6762) > at org.apache.geode.internal.cache.LocalRegionDataView.destroyExistingEntry(LocalRegionDataView.java:55) > at org.apache.geode.internal.cache.LocalRegion.basicDestroy(LocalRegion.java:6724) > at org.apache.geode.internal.cache.LocalRegion.expireDestroy(LocalRegion.java:6864) > at org.apache.geode.internal.cache.EntryExpiryTask.destroy(EntryExpiryTask.java:119) > at org.apache.geode.internal.cache.ExpiryTask.expire(ExpiryTask.java:278) > at org.apache.geode.internal.cache.ExpiryTask.expire(ExpiryTask.java:232) > at org.apache.geode.internal.cache.EntryExpiryTask.basicPerformTimeout(EntryExpiryTask.java:305) > at org.apache.geode.internal.cache.LocalRegion.performExpiryTimeout(LocalRegion.java:801) > at org.apache.geode.internal.cache.EntryExpiryTask.performTimeout(EntryExpiryTask.java:219) > at org.apache.geode.internal.cache.ExpiryTask.runInThreadPool(ExpiryTask.java:370) > at org.apache.geode.internal.cache.ExpiryTask.run2(ExpiryTask.java:318) > at org.apache.geode.internal.SystemTimer$SystemTimerTask.run(SystemTimer.java:444) > at java.util.TimerThread.mainLoop(Timer.java:555) > at java.util.TimerThread.run(Timer.java:505) > Found 1 deadlock. > {noformat} > The basic issue is that we configure expiration on the geode region to expire sessions, and the tomcat container will also expire sessions when the get to old. But those two threads get locks in a different order: > Tomcat expiration (http-nio-21064-exec-2) > # sync session in the tomcat code (StandardSession.expire) > # sync region entry in the geode code (AbstractRegionMap.destroy) > region expiration > # sync region entry in the geode code (AbstractRegionMap.destroy > # sync session in geode code (StandardSession.expire) -- This message was sent by Atlassian JIRA (v6.3.15#6346)