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 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)
>>>
> 


Back to the top