Return-Path: X-Original-To: apmail-cayenne-dev-archive@www.apache.org Delivered-To: apmail-cayenne-dev-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 4895B45D6 for ; Wed, 11 May 2011 05:36:18 +0000 (UTC) Received: (qmail 70725 invoked by uid 500); 11 May 2011 05:36:18 -0000 Delivered-To: apmail-cayenne-dev-archive@cayenne.apache.org Received: (qmail 70701 invoked by uid 500); 11 May 2011 05:36:16 -0000 Mailing-List: contact dev-help@cayenne.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@cayenne.apache.org Delivered-To: mailing list dev@cayenne.apache.org Received: (qmail 70693 invoked by uid 99); 11 May 2011 05:36:14 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 11 May 2011 05:36:14 +0000 X-ASF-Spam-Status: No, hits=-0.0 required=5.0 tests=SPF_PASS X-Spam-Check-By: apache.org Received-SPF: pass (nike.apache.org: local policy) Received: from [208.78.103.231] (HELO vorsha.objectstyle.org) (208.78.103.231) by apache.org (qpsmtpd/0.29) with SMTP; Wed, 11 May 2011 05:36:07 +0000 Received: (qmail 5432 invoked from network); 11 May 2011 05:35:45 -0000 Received: from unknown (HELO ?IPv6:::1?) (127.0.0.1) by localhost with SMTP; 11 May 2011 05:35:45 -0000 Subject: Re: query cloneViaSerialization Mime-Version: 1.0 (Apple Message framework v1084) Content-Type: text/plain; charset=us-ascii From: Andrus Adamchik X-Priority: 3 (Normal) In-Reply-To: <64e625f0bee19330915a873ddfc4c868.squirrel@www.pvv.ntnu.no> Date: Wed, 11 May 2011 08:35:44 +0300 Content-Transfer-Encoding: quoted-printable Message-Id: References: <03c975708d75c9d63c7574bc07bc438a.squirrel@www.pvv.ntnu.no> <64e625f0bee19330915a873ddfc4c868.squirrel@www.pvv.ntnu.no> To: dev@cayenne.apache.org X-Mailer: Apple Mail (2.1084) X-Virus-Checked: Checked by ClamAV on apache.org I just committed a removal of a synchronization on the = ByteArrayOutputStream method inside cloneViaSerialization, which was = unneeded. However I think it is not the cause of your lockup. Instead it = is a synchronized block inside ObjectStreamClass. So that's a JVM class = that we can't control.=20 I guess that makes 'cloneViaSerialization' unusable for Cayenne stack = classes. Specifically we should rewrite = BaseQueryMetadata.setPrefetchTree(..) to clone PrefetchTreeNode = manually, which should be pretty trivial. Andrus On May 11, 2011, at 12:08 AM, halset@pvv.ntnu.no wrote: > One more thing. In this single jstack output, there are 15 = threads/stacks > doing Util.cloneViaSerialization like the stack below! >=20 > - Tore. >=20 >> Hello. >>=20 >> In the jstack-output I am looking at now, there are several threads = doing >> a Util.cloneViaSerialization on some basic prefetching for a = SelectQuery. >> Down the java.io.ObjectOutputStream road there is some locking going = on. >> Is Util.cloneViaSerialization really needed here? This is with 3.1M2. >>=20 >> Regards, >> - Tore. >>=20 >> "qtp1661944297-498" prio=3D10 tid=3D0x00007f48d0189000 nid=3D0x51ec = in >> Object.wait() [0x00007f48c37f4000] >> java.lang.Thread.State: WAITING (on object monitor) >> at java.lang.Object.wait(Native Method) >> - waiting on <0x00007f49bb212090> (a >> java.io.ObjectStreamClass$EntryFuture) >> at java.lang.Object.wait(Object.java:485) >> at = java.io.ObjectStreamClass$EntryFuture.get(ObjectStreamClass.java:371) >> - locked <0x00007f49bb212090> (a = java.io.ObjectStreamClass$EntryFuture) >> at java.io.ObjectStreamClass.lookup(ObjectStreamClass.java:305) >> at = java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1114) >> at >> = java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518= ) >> at >> = java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483) >> at >> = java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:140= 0) >> at = java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158) >> at = java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:330) >> at = org.apache.cayenne.util.Util.cloneViaSerialization(Util.java:346) >> at >> = org.apache.cayenne.query.BaseQueryMetadata.setPrefetchTree(BaseQueryMetada= ta.java:332) >> at >> = org.apache.cayenne.query.SelectQuery.setPrefetchTree(SelectQuery.java:416)= >> at >> = org.apache.cayenne.query.SelectQueryPrefetchRouterAction.startDisjointPref= etch(SelectQueryPrefetchRouterAction.java:116) >> at >> = org.apache.cayenne.query.SelectQueryPrefetchRouterAction.startUnknownPrefe= tch(SelectQueryPrefetchRouterAction.java:135) >> at >> = org.apache.cayenne.query.PrefetchTreeNode.traverse(PrefetchTreeNode.java:1= 73) >> at >> = org.apache.cayenne.query.PrefetchTreeNode.traverse(PrefetchTreeNode.java:1= 79) >> at >> = org.apache.cayenne.query.SelectQueryPrefetchRouterAction.route(SelectQuery= PrefetchRouterAction.java:54) >> at >> = org.apache.cayenne.query.SelectQuery.routePrefetches(SelectQuery.java:179)= >> at = org.apache.cayenne.query.SelectQuery.route(SelectQuery.java:169) >> at >> = org.apache.cayenne.access.DataDomainQueryAction.runQuery(DataDomainQueryAc= tion.java:414) >> at >> = org.apache.cayenne.access.DataDomainQueryAction.access$000(DataDomainQuery= Action.java:69) >> at >> = org.apache.cayenne.access.DataDomainQueryAction$2.transform(DataDomainQuer= yAction.java:395) >> at >> = org.apache.cayenne.access.DataDomain.runInTransaction(DataDomain.java:824)= >> at >> = org.apache.cayenne.access.DataDomainQueryAction.runQueryInTransaction(Data= DomainQueryAction.java:392) >> at >> = org.apache.cayenne.access.DataDomainQueryAction.execute(DataDomainQueryAct= ion.java:121) >> at >> = org.apache.cayenne.access.DataDomain.onQueryNoFilters(DataDomain.java:706)= >> at >> = org.apache.cayenne.access.DataDomain$DataDomainQueryFilterChain.onQuery(Da= taDomain.java:944) >> at = org.apache.cayenne.access.DataDomain.onQuery(DataDomain.java:696) >> at >> = org.apache.cayenne.util.ObjectContextQueryAction.runQuery(ObjectContextQue= ryAction.java:336) >> at >> = org.apache.cayenne.util.ObjectContextQueryAction.executePostCache(ObjectCo= ntextQueryAction.java:104) >> at >> = org.apache.cayenne.util.ObjectContextQueryAction.execute(ObjectContextQuer= yAction.java:91) >> at = org.apache.cayenne.access.DataContext.onQuery(DataContext.java:983) >> at >> = org.apache.cayenne.access.DataContext.performQuery(DataContext.java:972) >>=20 >>=20 >>=20 >>=20 >=20 >=20 >=20