[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
Re: [jgit-dev] stack overflow in branch deletion
|
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)
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)
>>>
>