You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@cayenne.apache.org by Aristedes Maniatis <ar...@ish.com.au> on 2007/11/09 11:00:30 UTC

deadlock in CayenneContext.commitChanges

I was able to create a deadlock between two threads committing to the  
same context today. Cayenne as of svn trunk yesterday. Are contexts  
not thread-safe for writing or is this a bug?


[java] -- Thread Foxtrot Single Worker Thread #3 (Id = 39) BLOCKED  
org.apache.cayenne.event.DispatchQueue@18c8aa
[java] --  
org 
.apache.cayenne.event.DispatchQueue.dispatchEvent(DispatchQueue.java:54)
[java] --  
org.apache.cayenne.event.EventManager.dispatchEvent(EventManager.java: 
348)
[java] --  
org.apache.cayenne.event.EventManager.postEvent(EventManager.java:319)
[java] --  
org.apache.cayenne.remote.ClientChannel.onSync(ClientChannel.java:215)
[java] --  
org.apache.cayenne.CayenneContext.doCommitChanges(CayenneContext.java: 
249)
[java] --  
org.apache.cayenne.CayenneContext.commitChanges(CayenneContext.java:208)


[java] -- Thread AWT-EventQueue-0 (Id = 22) BLOCKED  
org.apache.cayenne.CayenneContextGraphManager@ab0e6f
[java] --  
org 
.apache 
.cayenne 
.CayenneContextMergeHandler 
.runWithEventsDisabled(CayenneContextMergeHandler.java:266)
[java] --  
org 
.apache 
.cayenne 
.CayenneContextMergeHandler 
.graphFlushed(CayenneContextMergeHandler.java:81)
[java] -- sun.reflect.GeneratedMethodAccessor22.invoke(Unknown Source)
[java] --  
sun 
.reflect 
.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java: 
25)
[java] -- java.lang.reflect.Method.invoke(Method.java:585)
[java] -- org.apache.cayenne.util.Invocation.fire(Invocation.java:204)
[java] -- org.apache.cayenne.event.EventManager 
$Dispatch.fire(EventManager.java:409)
[java] --  
org 
.apache.cayenne.event.DispatchQueue.dispatchEvent(DispatchQueue.java: 
162)
[java] --  
org 
.apache.cayenne.event.DispatchQueue.dispatchEvent(DispatchQueue.java:58)
[java] --  
org.apache.cayenne.event.EventManager.dispatchEvent(EventManager.java: 
348)
[java] --  
org.apache.cayenne.event.EventManager.postEvent(EventManager.java:319)
[java] --  
org.apache.cayenne.remote.ClientChannel.onSync(ClientChannel.java:215)
[java] --  
org.apache.cayenne.CayenneContext.doCommitChanges(CayenneContext.java: 
249)
[java] --  
org.apache.cayenne.CayenneContext.commitChanges(CayenneContext.java:208)



Ari Maniatis


-------------------------->
ish
http://www.ish.com.au
Level 1, 30 Wilson Street Newtown 2042 Australia
phone +61 2 9550 5001   fax +61 2 9550 4001
GPG fingerprint CBFB 84B4 738D 4E87 5E5C  5EFA EF6A 7D2E 3E49 102A



Re: deadlock in CayenneContext.commitChanges

Posted by Aristedes Maniatis <ar...@ish.com.au>.
On 12/11/2007, at 1:33 AM, Andrus Adamchik wrote:

> Actually in 3.0 DataContext IS thread-safe (DataObjects are not).  
> CayenneContext probably not. At least no effort has been made to  
> make it thread-safe.

OK. I reverted my change to the docs about this. I'm thinking the  
stack trace below shows that CayenneContext is not thread safe.


> Now regarding the stack below... Is it possible to take a thread  
> dump to see what locks are involved? I.e. "kill -QUIT pid"

  [java] Found one Java-level deadlock:
      [java] =============================
      [java] "Foxtrot Single Worker Thread #4":
      [java]   waiting to lock monitor 0x0080e700 (object 0x1b5518d8,  
a org.apache.cayenne.CayenneContextGraphManager),
      [java]   which is held by "AWT-EventQueue-0"
      [java] "AWT-EventQueue-0":
      [java]   waiting to lock monitor 0x0080e7b4 (object 0x1b3cef98,  
a org.apache.cayenne.event.DispatchQueue),
      [java]   which is held by "Foxtrot Single Worker Thread #4"
      [java]
      [java] Java stack information for the threads listed above:
      [java] ===================================================
      [java] "Foxtrot Single Worker Thread #4":
      [java] 	at  
org 
.apache 
.cayenne 
.CayenneContextMergeHandler 
.runWithEventsDisabled(CayenneContextMergeHandler.java:266)
      [java] 	- waiting to lock <0x1b5518d8> (a  
org.apache.cayenne.CayenneContextGraphManager)
      [java] 	at  
org 
.apache 
.cayenne 
.CayenneContextMergeHandler 
.graphFlushed(CayenneContextMergeHandler.java:81)
      [java] 	at sun.reflect.GeneratedMethodAccessor18.invoke(Unknown  
Source)
      [java] 	at  
sun 
.reflect 
.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java: 
25)
      [java] 	at java.lang.reflect.Method.invoke(Method.java:585)
      [java] 	at  
org.apache.cayenne.util.Invocation.fire(Invocation.java:204)
      [java] 	at org.apache.cayenne.event.EventManager 
$Dispatch.fire(EventManager.java:409)
      [java] 	at  
org 
.apache.cayenne.event.DispatchQueue.dispatchEvent(DispatchQueue.java: 
162)
      [java] 	at  
org 
.apache.cayenne.event.DispatchQueue.dispatchEvent(DispatchQueue.java:58)
      [java] 	- locked <0x1b3cef98> (a  
org.apache.cayenne.event.DispatchQueue)
      [java] 	at  
org.apache.cayenne.event.EventManager.dispatchEvent(EventManager.java: 
348)
      [java] 	at  
org.apache.cayenne.event.EventManager.postEvent(EventManager.java:319)
      [java] 	at  
org.apache.cayenne.remote.ClientChannel.onSync(ClientChannel.java:215)
      [java] 	at  
org.apache.cayenne.CayenneContext.doCommitChanges(CayenneContext.java: 
249)
      [java] 	- locked <0x1bcbcfe0> (a  
org.apache.cayenne.CayenneContextGraphManager)
      [java] 	at  
org.apache.cayenne.CayenneContext.commitChanges(CayenneContext.java:208)
      [java] 	at  
ish.oncourse.cayenne.CayenneContext.commitChanges(CayenneContext.java: 
80)
      [java] 	at  
ish 
.oncourse 
.util 
.xmlimport 
.ImportXMLHandler 
.commitAndCreateNewContextWhenObjectsInContextExceed 
(ImportXMLHandler.java:793)
      [java] 	at  
ish 
.oncourse 
.util.xmlimport.ImportXMLHandler.endElement(ImportXMLHandler.java:354)
      [java] 	at  
com 
.sun 
.org 
.apache 
.xerces 
.internal.parsers.AbstractSAXParser.endElement(AbstractSAXParser.java: 
633)
      [java] 	at  
com 
.sun 
.org 
.apache 
.xerces 
.internal 
.impl 
.XMLDocumentFragmentScannerImpl 
.scanEndElement(XMLDocumentFragmentScannerImpl.java:1241)
      [java] 	at  
com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl 
$ 
FragmentContentDispatcher.dispatch(XMLDocumentFragmentScannerImpl.java: 
1685)
      [java] 	at  
com 
.sun 
.org 
.apache 
.xerces 
.internal 
.impl 
.XMLDocumentFragmentScannerImpl 
.scanDocument(XMLDocumentFragmentScannerImpl.java:368)
      [java] 	at  
com 
.sun 
.org 
.apache 
.xerces 
.internal.parsers.XML11Configuration.parse(XML11Configuration.java:834)
      [java] 	at  
com 
.sun 
.org 
.apache 
.xerces 
.internal.parsers.XML11Configuration.parse(XML11Configuration.java:764)
      [java] 	at  
com 
.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java: 
148)
      [java] 	at  
com 
.sun 
.org 
.apache 
.xerces 
.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1242)
      [java] 	at ish.oncourse.util.xmlimport.ImportManager 
$1.run(ImportManager.java:124)
      [java] 	at foxtrot.AbstractWorkerThread 
$1.run(AbstractWorkerThread.java:39)
      [java] 	at java.security.AccessController.doPrivileged(Native  
Method)
      [java] 	at  
foxtrot.AbstractWorkerThread.runTask(AbstractWorkerThread.java:35)
      [java] 	at  
foxtrot.workers.SingleWorkerThread.run(SingleWorkerThread.java:196)
      [java] 	at  
foxtrot.workers.SingleWorkerThread.run(SingleWorkerThread.java:179)
      [java] 	at java.lang.Thread.run(Thread.java:613)
      [java] "AWT-EventQueue-0":
      [java] 	at  
org 
.apache.cayenne.event.DispatchQueue.dispatchEvent(DispatchQueue.java:54)
      [java] 	- waiting to lock <0x1b3cef98> (a  
org.apache.cayenne.event.DispatchQueue)
      [java] 	at  
org.apache.cayenne.event.EventManager.dispatchEvent(EventManager.java: 
348)
      [java] 	at  
org.apache.cayenne.event.EventManager.postEvent(EventManager.java:319)
      [java] 	at  
org 
.apache 
.cayenne 
.CayenneContextGraphManager.send(CayenneContextGraphManager.java:309)
      [java] 	at  
org 
.apache 
.cayenne 
.CayenneContextGraphManager 
.graphCommitted(CayenneContextGraphManager.java:146)
      [java] 	at  
org.apache.cayenne.CayenneContext.doCommitChanges(CayenneContext.java: 
263)
      [java] 	- locked <0x1b5518d8> (a  
org.apache.cayenne.CayenneContextGraphManager)
      [java] 	at  
org.apache.cayenne.CayenneContext.commitChanges(CayenneContext.java:208)
      [java] 	at  
ish.oncourse.cayenne.CayenneContext.commitChanges(CayenneContext.java: 
80)
      [java] 	at  
ish.oncourse.PreferenceController.commit(PreferenceController.java:151)
      [java] 	at  
ish.oncourse.PreferenceController.setValue(PreferenceController.java: 
128)
      [java] 	at  
ish 
.persistence 
.CommonPreferenceController 
.setListViewColumns(CommonPreferenceController.java:799)
      [java] 	at  
ish.oncourse.controller.ListController.dispose(ListController.java:657)
      [java] 	- locked <0x1bda6ce8> (a  
ish.oncourse.controller.entity.StudentListController)
      [java] 	at  
ish 
.oncourse.controller.ViewController.windowClosing(ViewController.java: 
802)
      [java] 	at  
java.awt.AWTEventMulticaster.windowClosing(AWTEventMulticaster.java:291)
      [java] 	at java.awt.Window.processWindowEvent(Window.java:1203)
      [java] 	at javax.swing.JFrame.processWindowEvent(JFrame.java:267)
      [java] 	at java.awt.Window.processEvent(Window.java:1161)
      [java] 	at java.awt.Component.dispatchEventImpl(Component.java: 
4068)
      [java] 	at java.awt.Container.dispatchEventImpl(Container.java: 
2068)
      [java] 	at java.awt.Window.dispatchEventImpl(Window.java:1791)
      [java] 	at java.awt.Component.dispatchEvent(Component.java:3903)
      [java] 	at java.awt.EventQueue.dispatchEvent(EventQueue.java:463)
      [java] 	at  
java 
.awt 
.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java: 
269)
      [java] 	at  
java 
.awt 
.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java: 
190)
      [java] 	at  
java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:184)
      [java] 	at  
java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:176)
      [java] 	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native  
Method)
      [java] 	at  
sun 
.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java: 
39)
      [java] 	at  
sun 
.reflect 
.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java: 
25)
      [java] 	at java.lang.reflect.Method.invoke(Method.java:585)
      [java] 	at  
foxtrot 
.pumps.ConditionalEventPump.pumpEvents(ConditionalEventPump.java:98)
      [java] 	at  
foxtrot.AbstractSyncWorker.post(AbstractSyncWorker.java:98)
      [java] 	at foxtrot.Worker.post(Worker.java:128)
      [java] 	at  
ish 
.oncourse 
.util.xmlimport.ImportManager.importDocument(ImportManager.java:120)
      [java] 	at  
ish.oncourse.util.xmlimport.ImportManager.run(ImportManager.java:86)
      [java] 	at  
ish.oncourse.ControllerManager.importXML(ControllerManager.java:176)
      [java] 	at  
ish 
.oncourse 
.view.frame.CommonFrame.importXMLActionPerformed(CommonFrame.java:545)
      [java] 	at ish.oncourse.view.frame.CommonFrame.access 
$2(CommonFrame.java:544)
      [java] 	at ish.oncourse.view.frame.CommonFrame 
$6.actionPerformed(CommonFrame.java:253)
      [java] 	at  
javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1882)
      [java] 	at javax.swing.AbstractButton 
$Handler.actionPerformed(AbstractButton.java:2202)
      [java] 	at  
javax 
.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java: 
420)
      [java] 	at  
javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:258)
      [java] 	at  
javax.swing.AbstractButton.doClick(AbstractButton.java:334)
      [java] 	at  
apple.laf.ScreenMenuItem.actionPerformed(ScreenMenuItem.java:96)
      [java] 	at java.awt.MenuItem.processActionEvent(MenuItem.java:597)
      [java] 	at java.awt.MenuItem.processEvent(MenuItem.java:556)
      [java] 	at  
java.awt.MenuComponent.dispatchEventImpl(MenuComponent.java:298)
      [java] 	at  
java.awt.MenuComponent.dispatchEvent(MenuComponent.java:286)
      [java] 	at java.awt.EventQueue.dispatchEvent(EventQueue.java:466)
      [java] 	at  
java 
.awt 
.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java: 
269)
      [java] 	at  
java 
.awt 
.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java: 
190)
      [java] 	at  
java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:184)
      [java] 	at  
java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:176)
      [java] 	at  
java.awt.EventDispatchThread.run(EventDispatchThread.java:110)
      [java]
      [java] Found 1 deadlock.
      [java]



-------------------------->
ish
http://www.ish.com.au
Level 1, 30 Wilson Street Newtown 2042 Australia
phone +61 2 9550 5001   fax +61 2 9550 4001
GPG fingerprint CBFB 84B4 738D 4E87 5E5C  5EFA EF6A 7D2E 3E49 102A



Re: deadlock in CayenneContext.commitChanges

Posted by Andrus Adamchik <an...@objectstyle.org>.
Actually in 3.0 DataContext IS thread-safe (DataObjects are not).  
CayenneContext probably not. At least no effort has been made to make  
it thread-safe.

Now regarding the stack below... Is it possible to take a thread dump  
to see what locks are involved? I.e. "kill -QUIT pid"

Andrus


On Nov 9, 2007, at 5:00 AM, Aristedes Maniatis wrote:

> I was able to create a deadlock between two threads committing to  
> the same context today. Cayenne as of svn trunk yesterday. Are  
> contexts not thread-safe for writing or is this a bug?
>
>
> [java] -- Thread Foxtrot Single Worker Thread #3 (Id = 39) BLOCKED  
> org.apache.cayenne.event.DispatchQueue@18c8aa
> [java] -- org.apache.cayenne.event.DispatchQueue.dispatchEvent 
> (DispatchQueue.java:54)
> [java] -- org.apache.cayenne.event.EventManager.dispatchEvent 
> (EventManager.java:348)
> [java] -- org.apache.cayenne.event.EventManager.postEvent 
> (EventManager.java:319)
> [java] -- org.apache.cayenne.remote.ClientChannel.onSync 
> (ClientChannel.java:215)
> [java] -- org.apache.cayenne.CayenneContext.doCommitChanges 
> (CayenneContext.java:249)
> [java] -- org.apache.cayenne.CayenneContext.commitChanges 
> (CayenneContext.java:208)
>
>
> [java] -- Thread AWT-EventQueue-0 (Id = 22) BLOCKED  
> org.apache.cayenne.CayenneContextGraphManager@ab0e6f
> [java] --  
> org.apache.cayenne.CayenneContextMergeHandler.runWithEventsDisabled 
> (CayenneContextMergeHandler.java:266)
> [java] -- org.apache.cayenne.CayenneContextMergeHandler.graphFlushed 
> (CayenneContextMergeHandler.java:81)
> [java] -- sun.reflect.GeneratedMethodAccessor22.invoke(Unknown Source)
> [java] -- sun.reflect.DelegatingMethodAccessorImpl.invoke 
> (DelegatingMethodAccessorImpl.java:25)
> [java] -- java.lang.reflect.Method.invoke(Method.java:585)
> [java] -- org.apache.cayenne.util.Invocation.fire(Invocation.java:204)
> [java] -- org.apache.cayenne.event.EventManager$Dispatch.fire 
> (EventManager.java:409)
> [java] -- org.apache.cayenne.event.DispatchQueue.dispatchEvent 
> (DispatchQueue.java:162)
> [java] -- org.apache.cayenne.event.DispatchQueue.dispatchEvent 
> (DispatchQueue.java:58)
> [java] -- org.apache.cayenne.event.EventManager.dispatchEvent 
> (EventManager.java:348)
> [java] -- org.apache.cayenne.event.EventManager.postEvent 
> (EventManager.java:319)
> [java] -- org.apache.cayenne.remote.ClientChannel.onSync 
> (ClientChannel.java:215)
> [java] -- org.apache.cayenne.CayenneContext.doCommitChanges 
> (CayenneContext.java:249)
> [java] -- org.apache.cayenne.CayenneContext.commitChanges 
> (CayenneContext.java:208)
>
>
>
> Ari Maniatis
>
>
> -------------------------->
> ish
> http://www.ish.com.au
> Level 1, 30 Wilson Street Newtown 2042 Australia
> phone +61 2 9550 5001   fax +61 2 9550 4001
> GPG fingerprint CBFB 84B4 738D 4E87 5E5C  5EFA EF6A 7D2E 3E49 102A
>
>
>


Re: deadlock in CayenneContext.commitChanges

Posted by Michael Gentry <bl...@gmail.com>.
I did the same in an application I wrote, although it read and wrote
through the shared data context.  I put my own synchronized methods
around everything I did with it, though.  It worked fine, but was more
manual work.  The benefit was less memory overall and, more
importantly for this app, it sped things up for everyone as there was
a shared database view and DB access was pretty expensive.


On 11/9/07, Aristedes Maniatis <ar...@ish.com.au> wrote:
>
> On 10/11/2007, at 2:14 AM, Michael Gentry wrote:
>
> > "DataContext is not thread-safe, as it is intended for access by a
> > single user.
>
> Ah, yes. Thanks for unearthing that. I wonder though if it might be
> safe for read only access. For quite some time now we've been using a
> single 'shared' context for the read only parts of the application in
> order to reduce memory use. We've never hit a problem, but maybe we've
> just been lucky.
>
> Thanks
> Ari
>
>
>
> -------------------------->
> ish
> http://www.ish.com.au
> Level 1, 30 Wilson Street Newtown 2042 Australia
> phone +61 2 9550 5001   fax +61 2 9550 4001
> GPG fingerprint CBFB 84B4 738D 4E87 5E5C  5EFA EF6A 7D2E 3E49 102A
>
>
>

Re: deadlock in CayenneContext.commitChanges

Posted by Aristedes Maniatis <ar...@ish.com.au>.
On 10/11/2007, at 2:14 AM, Michael Gentry wrote:

> "DataContext is not thread-safe, as it is intended for access by a  
> single user.

Ah, yes. Thanks for unearthing that. I wonder though if it might be  
safe for read only access. For quite some time now we've been using a  
single 'shared' context for the read only parts of the application in  
order to reduce memory use. We've never hit a problem, but maybe we've  
just been lucky.

Thanks
Ari



-------------------------->
ish
http://www.ish.com.au
Level 1, 30 Wilson Street Newtown 2042 Australia
phone +61 2 9550 5001   fax +61 2 9550 4001
GPG fingerprint CBFB 84B4 738D 4E87 5E5C  5EFA EF6A 7D2E 3E49 102A



Re: deadlock in CayenneContext.commitChanges

Posted by Michael Gentry <bl...@gmail.com>.
Well, maybe Andrus won't ...

http://osdir.com/ml/java.cayenne.user/2006-09/msg00171.html

"DataContext is not thread-safe, as it is intended for access by a single user.

DataDomain and the rest of the stack underneath the DataContext is thread-safe.

If a there is a chance of multiple threads belonging to the same user
to access the context (and its DataObjects) simultaneously, you'll
have to synchronize manually.

Andrus"


On Nov 9, 2007 9:50 AM, Michael Gentry <bl...@gmail.com> wrote:
> I don't know this for a fact, and I'm sure Andrus will correct me, but
> I would never have expected the DataContext to be thread-safe.
> Perhaps that is my EOF background.  I believe that doing commits (or
> queries) from two different DataContexts is thread-safe, though.
>
> /dev/mrg
>
>
>
> On Nov 9, 2007 5:00 AM, Aristedes Maniatis <ar...@ish.com.au> wrote:
> > I was able to create a deadlock between two threads committing to the
> > same context today. Cayenne as of svn trunk yesterday. Are contexts
> > not thread-safe for writing or is this a bug?
> >
> >
> > [java] -- Thread Foxtrot Single Worker Thread #3 (Id = 39) BLOCKED
> > org.apache.cayenne.event.DispatchQueue@18c8aa
> > [java] --
> > org
> > .apache.cayenne.event.DispatchQueue.dispatchEvent(DispatchQueue.java:54)
> > [java] --
> > org.apache.cayenne.event.EventManager.dispatchEvent(EventManager.java:
> > 348)
> > [java] --
> > org.apache.cayenne.event.EventManager.postEvent(EventManager.java:319)
> > [java] --
> > org.apache.cayenne.remote.ClientChannel.onSync(ClientChannel.java:215)
> > [java] --
> > org.apache.cayenne.CayenneContext.doCommitChanges(CayenneContext.java:
> > 249)
> > [java] --
> > org.apache.cayenne.CayenneContext.commitChanges(CayenneContext.java:208)
> >
> >
> > [java] -- Thread AWT-EventQueue-0 (Id = 22) BLOCKED
> > org.apache.cayenne.CayenneContextGraphManager@ab0e6f
> > [java] --
> > org
> > .apache
> > .cayenne
> > .CayenneContextMergeHandler
> > .runWithEventsDisabled(CayenneContextMergeHandler.java:266)
> > [java] --
> > org
> > .apache
> > .cayenne
> > .CayenneContextMergeHandler
> > .graphFlushed(CayenneContextMergeHandler.java:81)
> > [java] -- sun.reflect.GeneratedMethodAccessor22.invoke(Unknown Source)
> > [java] --
> > sun
> > .reflect
> > .DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:
> > 25)
> > [java] -- java.lang.reflect.Method.invoke(Method.java:585)
> > [java] -- org.apache.cayenne.util.Invocation.fire(Invocation.java:204)
> > [java] -- org.apache.cayenne.event.EventManager
> > $Dispatch.fire(EventManager.java:409)
> > [java] --
> > org
> > .apache.cayenne.event.DispatchQueue.dispatchEvent(DispatchQueue.java:
> > 162)
> > [java] --
> > org
> > .apache.cayenne.event.DispatchQueue.dispatchEvent(DispatchQueue.java:58)
> > [java] --
> > org.apache.cayenne.event.EventManager.dispatchEvent(EventManager.java:
> > 348)
> > [java] --
> > org.apache.cayenne.event.EventManager.postEvent(EventManager.java:319)
> > [java] --
> > org.apache.cayenne.remote.ClientChannel.onSync(ClientChannel.java:215)
> > [java] --
> > org.apache.cayenne.CayenneContext.doCommitChanges(CayenneContext.java:
> > 249)
> > [java] --
> > org.apache.cayenne.CayenneContext.commitChanges(CayenneContext.java:208)
> >
> >
> >
> > Ari Maniatis
> >
> >
> > -------------------------->
> > ish
> > http://www.ish.com.au
> > Level 1, 30 Wilson Street Newtown 2042 Australia
> > phone +61 2 9550 5001   fax +61 2 9550 4001
> > GPG fingerprint CBFB 84B4 738D 4E87 5E5C  5EFA EF6A 7D2E 3E49 102A
> >
> >
> >
>

Re: deadlock in CayenneContext.commitChanges

Posted by Michael Gentry <bl...@gmail.com>.
I don't know this for a fact, and I'm sure Andrus will correct me, but
I would never have expected the DataContext to be thread-safe.
Perhaps that is my EOF background.  I believe that doing commits (or
queries) from two different DataContexts is thread-safe, though.

/dev/mrg


On Nov 9, 2007 5:00 AM, Aristedes Maniatis <ar...@ish.com.au> wrote:
> I was able to create a deadlock between two threads committing to the
> same context today. Cayenne as of svn trunk yesterday. Are contexts
> not thread-safe for writing or is this a bug?
>
>
> [java] -- Thread Foxtrot Single Worker Thread #3 (Id = 39) BLOCKED
> org.apache.cayenne.event.DispatchQueue@18c8aa
> [java] --
> org
> .apache.cayenne.event.DispatchQueue.dispatchEvent(DispatchQueue.java:54)
> [java] --
> org.apache.cayenne.event.EventManager.dispatchEvent(EventManager.java:
> 348)
> [java] --
> org.apache.cayenne.event.EventManager.postEvent(EventManager.java:319)
> [java] --
> org.apache.cayenne.remote.ClientChannel.onSync(ClientChannel.java:215)
> [java] --
> org.apache.cayenne.CayenneContext.doCommitChanges(CayenneContext.java:
> 249)
> [java] --
> org.apache.cayenne.CayenneContext.commitChanges(CayenneContext.java:208)
>
>
> [java] -- Thread AWT-EventQueue-0 (Id = 22) BLOCKED
> org.apache.cayenne.CayenneContextGraphManager@ab0e6f
> [java] --
> org
> .apache
> .cayenne
> .CayenneContextMergeHandler
> .runWithEventsDisabled(CayenneContextMergeHandler.java:266)
> [java] --
> org
> .apache
> .cayenne
> .CayenneContextMergeHandler
> .graphFlushed(CayenneContextMergeHandler.java:81)
> [java] -- sun.reflect.GeneratedMethodAccessor22.invoke(Unknown Source)
> [java] --
> sun
> .reflect
> .DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:
> 25)
> [java] -- java.lang.reflect.Method.invoke(Method.java:585)
> [java] -- org.apache.cayenne.util.Invocation.fire(Invocation.java:204)
> [java] -- org.apache.cayenne.event.EventManager
> $Dispatch.fire(EventManager.java:409)
> [java] --
> org
> .apache.cayenne.event.DispatchQueue.dispatchEvent(DispatchQueue.java:
> 162)
> [java] --
> org
> .apache.cayenne.event.DispatchQueue.dispatchEvent(DispatchQueue.java:58)
> [java] --
> org.apache.cayenne.event.EventManager.dispatchEvent(EventManager.java:
> 348)
> [java] --
> org.apache.cayenne.event.EventManager.postEvent(EventManager.java:319)
> [java] --
> org.apache.cayenne.remote.ClientChannel.onSync(ClientChannel.java:215)
> [java] --
> org.apache.cayenne.CayenneContext.doCommitChanges(CayenneContext.java:
> 249)
> [java] --
> org.apache.cayenne.CayenneContext.commitChanges(CayenneContext.java:208)
>
>
>
> Ari Maniatis
>
>
> -------------------------->
> ish
> http://www.ish.com.au
> Level 1, 30 Wilson Street Newtown 2042 Australia
> phone +61 2 9550 5001   fax +61 2 9550 4001
> GPG fingerprint CBFB 84B4 738D 4E87 5E5C  5EFA EF6A 7D2E 3E49 102A
>
>
>