[
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