Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [jgit-dev] stack overflow in branch deletion

On 04/03/12 07:44, Markus Duft wrote:
> On 03/21/12 10:26, Baumgart, Jens wrote:
>> Nevertheless I wonder why calling getRef inside a RefsChanged Event causes
>> RefsChange events over and over again.
>> I think we had a similar issue at another location of Egit.
> 
> Uh, now that i fixed my own stack overflow by just not calling getRef anymore, i got one that comes from egit/jgit themselves (i didn't change it this time, i promise :D)

hm, and after employing a quickfix for me (which really just checks whether fireRefsChanged is already running, and doesn't call it), i got this... NIO again :(

btw. in all cases i try to delete approx 15 branches at once.

org.eclipse.core.runtime.CoreException: Unable to write packed-refs
	at org.eclipse.egit.core.op.DeleteBranchOperation$1.run(DeleteBranchOperation.java:131)
	at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:2344)
	at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:2326)
	at org.eclipse.egit.core.op.DeleteBranchOperation.execute(DeleteBranchOperation.java:139)
	at org.eclipse.egit.ui.internal.repository.tree.command.DeleteBranchCommand.deleteBranch(DeleteBranchCommand.java:100)
	at org.eclipse.egit.ui.internal.repository.tree.command.DeleteBranchCommand.access$0(DeleteBranchCommand.java:96)
	at org.eclipse.egit.ui.internal.repository.tree.command.DeleteBranchCommand$1.run(DeleteBranchCommand.java:54)
	at org.eclipse.jface.operation.ModalContext.runInCurrentThread(ModalContext.java:464)
	at org.eclipse.jface.operation.ModalContext.run(ModalContext.java:372)
	at org.eclipse.jface.dialogs.ProgressMonitorDialog.run(ProgressMonitorDialog.java:507)
	at org.eclipse.egit.ui.internal.repository.tree.command.DeleteBranchCommand.execute(DeleteBranchCommand.java:46)
	at org.eclipse.ui.internal.handlers.HandlerProxy.execute(HandlerProxy.java:293)
	at org.eclipse.core.commands.Command.executeWithChecks(Command.java:476)
	at org.eclipse.core.commands.ParameterizedCommand.executeWithChecks(ParameterizedCommand.java:508)
	at org.eclipse.ui.internal.handlers.HandlerService.executeCommand(HandlerService.java:169)
	at org.eclipse.ui.internal.keys.WorkbenchKeyboard.executeCommand(WorkbenchKeyboard.java:468)
	at org.eclipse.ui.internal.keys.WorkbenchKeyboard.press(WorkbenchKeyboard.java:786)
	at org.eclipse.ui.internal.keys.WorkbenchKeyboard.processKeyEvent(WorkbenchKeyboard.java:885)
	at org.eclipse.ui.internal.keys.OutOfOrderListener.handleEvent(OutOfOrderListener.java:76)
	at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1258)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1282)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1267)
	at org.eclipse.swt.widgets.Widget.sendKeyEvent(Widget.java:1294)
	at org.eclipse.swt.widgets.Widget.gtk_key_press_event(Widget.java:730)
	at org.eclipse.swt.widgets.Control.gtk_key_press_event(Control.java:3019)
	at org.eclipse.swt.widgets.Composite.gtk_key_press_event(Composite.java:734)
	at org.eclipse.swt.widgets.Tree.gtk_key_press_event(Tree.java:2002)
	at org.eclipse.swt.widgets.Widget.windowProc(Widget.java:1743)
	at org.eclipse.swt.widgets.Control.windowProc(Control.java:5016)
	at org.eclipse.swt.widgets.Tree.windowProc(Tree.java:3530)
	at org.eclipse.swt.widgets.Display.windowProc(Display.java:4408)
	at org.eclipse.swt.internal.gtk.OS._gtk_main_do_event(Native Method)
	at org.eclipse.swt.internal.gtk.OS.gtk_main_do_event(OS.java:8422)
	at org.eclipse.swt.widgets.Display.eventProc(Display.java:1245)
	at org.eclipse.swt.internal.gtk.OS._g_main_context_iteration(Native Method)
	at org.eclipse.swt.internal.gtk.OS.g_main_context_iteration(OS.java:2276)
	at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3207)
	at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:2696)
	at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2660)
	at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2494)
	at org.eclipse.ui.internal.Workbench$7.run(Workbench.java:674)
	at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
	at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:667)
	at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)
	at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:123)
	at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196)
	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110)
	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:344)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:616)
	at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:622)
	at org.eclipse.equinox.launcher.Main.basicRun(Main.java:577)
	at org.eclipse.equinox.launcher.Main.run(Main.java:1410)
	at org.eclipse.equinox.launcher.Main.main(Main.java:1386)
Caused by: org.eclipse.jgit.api.errors.JGitInternalException: Unable to write packed-refs
	at org.eclipse.jgit.api.DeleteBranchCommand.call(DeleteBranchCommand.java:173)
	at org.eclipse.egit.core.op.DeleteBranchOperation$1.run(DeleteBranchOperation.java:122)
	... 58 more
Caused by: org.eclipse.jgit.errors.ObjectWritingException: Unable to write packed-refs
	at org.eclipse.jgit.storage.file.RefDirectory$1.writeFile(RefDirectory.java:718)
	at org.eclipse.jgit.lib.RefWriter.writePackedRefs(RefWriter.java:181)
	at org.eclipse.jgit.storage.file.RefDirectory.commitPackedRefs(RefDirectory.java:732)
	at org.eclipse.jgit.storage.file.RefDirectory.delete(RefDirectory.java:562)
	at org.eclipse.jgit.storage.file.RefDirectoryUpdate.doDelete(RefDirectoryUpdate.java:144)
	at org.eclipse.jgit.lib.RefUpdate$2.execute(RefUpdate.java:543)
	at org.eclipse.jgit.lib.RefUpdate.updateImpl(RefUpdate.java:626)
	at org.eclipse.jgit.lib.RefUpdate.delete(RefUpdate.java:540)
	at org.eclipse.jgit.lib.RefUpdate.delete(RefUpdate.java:513)
	at org.eclipse.jgit.api.DeleteBranchCommand.call(DeleteBranchCommand.java:141)
	... 59 more
Caused by: java.nio.channels.ClosedByInterruptException
	at java.nio.channels.spi.AbstractInterruptibleChannel.end(AbstractInterruptibleChannel.java:201)
	at sun.nio.ch.FileChannelImpl.write(FileChannelImpl.java:229)
	at org.eclipse.jgit.storage.file.LockFile.write(LockFile.java:286)
	at org.eclipse.jgit.storage.file.RefDirectory$1.writeFile(RefDirectory.java:716)
	... 68 more


> 
> java.lang.StackOverflowError
> 	at java.nio.charset.CharsetEncoder.encode(CharsetEncoder.java:561)
> 	at java.lang.StringCoding$StringEncoder.encode(StringCoding.java:257)
> 	at java.lang.StringCoding.encode(StringCoding.java:289)
> 	at java.lang.String.getBytes(String.java:954)
> 	at java.io.UnixFileSystem.getLastModifiedTime(Native Method)
> 	at java.io.File.lastModified(File.java:843)
> 	at org.eclipse.jgit.storage.file.FileSnapshot.isModified(FileSnapshot.java:150)
> 	at org.eclipse.jgit.storage.file.RefDirectory.scanRef(RefDirectory.java:774)
> 	at org.eclipse.jgit.storage.file.RefDirectory.access$3(RefDirectory.java:768)
> 	at org.eclipse.jgit.storage.file.RefDirectory$LooseScanner.scanOne(RefDirectory.java:421)
> 	at org.eclipse.jgit.storage.file.RefDirectory$LooseScanner.scanTree(RefDirectory.java:389)
> 	at org.eclipse.jgit.storage.file.RefDirectory$LooseScanner.scan(RefDirectory.java:352)
> 	at org.eclipse.jgit.storage.file.RefDirectory.getRefs(RefDirectory.java:277)
> 	at org.eclipse.egit.ui.internal.history.CommitMessageViewer.getBranches(CommitMessageViewer.java:293)
> 	at org.eclipse.egit.ui.internal.history.CommitMessageViewer.access$6(CommitMessageViewer.java:290)
> 	at org.eclipse.egit.ui.internal.history.CommitMessageViewer$8.onRefsChanged(CommitMessageViewer.java:276)
> 	at org.eclipse.jgit.events.RefsChangedEvent.dispatch(RefsChangedEvent.java:55)
> 	at org.eclipse.jgit.events.RefsChangedEvent.dispatch(RefsChangedEvent.java:1)
> 	at org.eclipse.jgit.events.ListenerList.dispatch(ListenerList.java:120)
> 	at org.eclipse.jgit.lib.Repository.fireEvent(Repository.java:152)
> 	at org.eclipse.jgit.storage.file.RefDirectory.fireRefsChanged(RefDirectory.java:848)
> 	at org.eclipse.jgit.storage.file.RefDirectory.getRefs(RefDirectory.java:287)
> 	at org.eclipse.egit.ui.internal.history.CommitMessageViewer.getBranches(CommitMessageViewer.java:293)
> 	at org.eclipse.egit.ui.internal.history.CommitMessageViewer.access$6(CommitMessageViewer.java:290)
> 	at org.eclipse.egit.ui.internal.history.CommitMessageViewer$8.onRefsChanged(CommitMessageViewer.java:276)
> 	at org.eclipse.jgit.events.RefsChangedEvent.dispatch(RefsChangedEvent.java:55)
> 	at org.eclipse.jgit.events.RefsChangedEvent.dispatch(RefsChangedEvent.java:1)
> 	at org.eclipse.jgit.events.ListenerList.dispatch(ListenerList.java:120)
> 	at org.eclipse.jgit.lib.Repository.fireEvent(Repository.java:152)
> 	at org.eclipse.jgit.storage.file.RefDirectory.fireRefsChanged(RefDirectory.java:848)
> 	at org.eclipse.jgit.storage.file.RefDirectory.getRefs(RefDirectory.java:287)
> 	at org.eclipse.egit.ui.internal.history.CommitMessageViewer.getBranches(CommitMessageViewer.java:293)
> 	at org.eclipse.egit.ui.internal.history.CommitMessageViewer.access$6(CommitMessageViewer.java:290)
> 	at org.eclipse.egit.ui.internal.history.CommitMessageViewer$8.onRefsChanged(CommitMessageViewer.java:276)
> 	at org.eclipse.jgit.events.RefsChangedEvent.dispatch(RefsChangedEvent.java:55)
> 	at org.eclipse.jgit.events.RefsChangedEvent.dispatch(RefsChangedEvent.java:1)
> 	at org.eclipse.jgit.events.ListenerList.dispatch(ListenerList.java:120)
> 	at org.eclipse.jgit.lib.Repository.fireEvent(Repository.java:152)
> 	at org.eclipse.jgit.storage.file.RefDirectory.fireRefsChanged(RefDirectory.java:848)
> 	at org.eclipse.jgit.storage.file.RefDirectory.getRefs(RefDirectory.java:287)
> 	at org.eclipse.egit.ui.internal.history.CommitMessageViewer.getBranches(CommitMessageViewer.java:293)
> 	at org.eclipse.egit.ui.internal.history.CommitMessageViewer.access$6(CommitMessageViewer.java:290)
> 	at org.eclipse.egit.ui.internal.history.CommitMessageViewer$8.onRefsChanged(CommitMessageViewer.java:276)
> 	at org.eclipse.jgit.events.RefsChangedEvent.dispatch(RefsChangedEvent.java:55)
> 	at org.eclipse.jgit.events.RefsChangedEvent.dispatch(RefsChangedEvent.java:1)
> 	at org.eclipse.jgit.events.ListenerList.dispatch(ListenerList.java:120)
> 	at org.eclipse.jgit.lib.Repository.fireEvent(Repository.java:152)
> 	at org.eclipse.jgit.storage.file.RefDirectory.fireRefsChanged(RefDirectory.java:848)
> 	at org.eclipse.jgit.storage.file.RefDirectory.getRefs(RefDirectory.java:287)
> 	at org.eclipse.egit.ui.internal.history.CommitMessageViewer.getBranches(CommitMessageViewer.java:293)
> 	at org.eclipse.egit.ui.internal.history.CommitMessageViewer.access$6(CommitMessageViewer.java:290)
> 	at org.eclipse.egit.ui.internal.history.CommitMessageViewer$8.onRefsChanged(CommitMessageViewer.java:276)
> 	at org.eclipse.jgit.events.RefsChangedEvent.dispatch(RefsChangedEvent.java:55)
> 	at org.eclipse.jgit.events.RefsChangedEvent.dispatch(RefsChangedEvent.java:1)
> 	at org.eclipse.jgit.events.ListenerList.dispatch(ListenerList.java:120)
> 	at org.eclipse.jgit.lib.Repository.fireEvent(Repository.java:152)
> 	at org.eclipse.jgit.storage.file.RefDirectory.fireRefsChanged(RefDirectory.java:848)
> 	at org.eclipse.jgit.storage.file.RefDirectory.getRefs(RefDirectory.java:287)
> 	at org.eclipse.egit.ui.internal.history.CommitMessageViewer.getBranches(CommitMessageViewer.java:293)
> 	at org.eclipse.egit.ui.internal.history.CommitMessageViewer.access$6(CommitMessageViewer.java:290)
> 	at org.eclipse.egit.ui.internal.history.CommitMessageViewer$8.onRefsChanged(CommitMessageViewer.java:276)
> 	at org.eclipse.jgit.events.RefsChangedEvent.dispatch(RefsChangedEvent.java:55)
> 	at org.eclipse.jgit.events.RefsChangedEvent.dispatch(RefsChangedEvent.java:1)
> 	at org.eclipse.jgit.events.ListenerList.dispatch(ListenerList.java:120)
> 	at org.eclipse.jgit.lib.Repository.fireEvent(Repository.java:152)
> 	at org.eclipse.jgit.storage.file.RefDirectory.fireRefsChanged(RefDirectory.java:848)
> 	at org.eclipse.jgit.storage.file.RefDirectory.getRefs(RefDirectory.java:287)
> 	at org.eclipse.egit.ui.internal.history.CommitMessageViewer.getBranches(CommitMessageViewer.java:293)
> 	at org.eclipse.egit.ui.internal.history.CommitMessageViewer.access$6(CommitMessageViewer.java:290)
> 	at org.eclipse.egit.ui.internal.history.CommitMessageViewer$8.onRefsChanged(CommitMessageViewer.java:276)
> 	...
> 
> Ideas? The fireRefsChanged should really only be called if refs actually change i think..? it is called unconditionally currently. A quick hack would be to implement a cycle check, and don't call it if it's already on the stack... ;)
> 
> if this would be fixed i could re-activate some performance tunings regarding checkouts and such (checking whether oldRef.objectId == newRef.objectId and acting accordingly (probably not at all ;)))
> 
> Regards,
> Markus
> 
>> --Jens
>>
>> On 21.03.12 09:52, "Markus Duft" <markus.duft@xxxxxxxxxx> wrote:
>>
>>> On 03/21/2012 09:41 AM, Baumgart, Jens wrote:
>>>> I am wondering how the call stack looks like:
>>>>
>>>>  at org.eclipse.jgit.lib.Repository.getRef(Repository.java:765)
>>>> 	at 
>>>>
>>>> org.eclipse.egit.core.internal.indexdiff.IndexDiffCacheEntry$2.onRefsChan
>>>> ge
>>>> d(IndexDiffCacheEntry.java:88)
>>>>
>>>>
>>>> IndexDiffCacheEntry.onRefsChanged does not call getRef. And it should
>>>> not
>>>> do, event processing is done asynchronously using a Job.
>>>
>>> uh... my own change If43a04410492ee6976f00d18d99c7b0a935c0689 introduces
>>> the problem...
>>>
>>>>
>>>>
>>>> --Jens
>>>>
>>>>
>>>>
>>>> On 21.03.12 08:48, "Markus Duft" <markus.duft@xxxxxxxxxx> wrote:
>>>>
>>>>> 	at org.eclipse.jgit.lib.Repository.getRef(Repository.java:765)
>>>>> 	at 
>>>>>
>>>>> org.eclipse.egit.core.internal.indexdiff.IndexDiffCacheEntry$2.onRefsCha
>>>>> ng
>>>>> ed(IndexDiffCacheEntry.java:88)
>>>>
>>
> _______________________________________________
> jgit-dev mailing list
> jgit-dev@xxxxxxxxxxx
> https://dev.eclipse.org/mailman/listinfo/jgit-dev


Back to the top