Closed Bug 25509 Opened 25 years ago Closed 25 years ago

Getting full log from tinderbox causes mozilla to hang

Categories

(Core :: Layout, defect, P3)

Other
Linux
defect

Tracking

()

VERIFIED FIXED

People

(Reporter: dp, Assigned: nisheeth_mozilla)

References

()

Details

(Whiteboard: [PDT+])

I thought we had a fast network library and a great incremental layout engine. So when I see full log it should just stream in and get displayed instantaneously and get updated.... What really happened was the browser was hanging displaying no data and worse freezing the entire app. No redisplay of chrome even when exposed. I will let it run for a while and add to the bug if I see anything positive.
Why did you think we had a fast network library and a great incremental layout engine?
Keywords: beta1
Target Milestone: M14
We're not freezing, we executing what seems to be at least a geometric if not exponential algorithm to layout this poor (albeit lengthy) text file. Here's a typical snapshot of what's going on: USER32! 77e72572() nsViewManager::UpdateView(nsViewManager * const 0x02f37930, nsIView * 0x02f55aa0, const nsRect & {x=0x00000078 y=0x0013fbed width=0x00003390 height=0x000000ff}, unsigned int 0x00000004) line 1502 nsFrame::Invalidate(nsIPresContext * 0x02ee2940, const nsRect & {x=0x00000000 y=0x0013ec00 width=0x00003390 height=0x000000ff}, int 0x00000000) line 1582 nsBlockFrame::ReflowLine(nsBlockReflowState & {...}, nsLineBox * 0x02b95390, int * 0x0012d688, int 0x00000001) line 2856 nsBlockFrame::ReflowDirtyLines(nsBlockReflowState & {...}) line 2557 + 27 bytes nsBlockFrame::Reflow(nsBlockFrame * const 0x00df0d60, nsIPresContext * 0x02ee2940, nsHTMLReflowMetrics & {...}, const nsHTMLReflowState & {...}, unsigned int & 0x00000000) line 1532 + 15 bytes nsBlockReflowContext::ReflowBlock(nsIFrame * 0x00df0d60, const nsRect & {x=0x00000000 y=0x00000e4a width=0x00002ce2 height=0x40000000}, int 0x00000001, int 0x0000012b, int 0x00000000, nsMargin & {top=0x00000000 right=0x00000000 bottom=0x00000000 left=0x00000000}, unsigned int & 0x00000000) line 425 + 45 bytes nsBlockFrame::ReflowBlockFrame(nsBlockReflowState & {...}, nsLineBox * 0x02670f00, int * 0x0012dfa8) line 3426 + 59 bytes nsBlockFrame::ReflowLine(nsBlockReflowState & {...}, nsLineBox * 0x02670f00, int * 0x0012dfa8, int 0x00000001) line 2746 + 23 bytes nsBlockFrame::ReflowDirtyLines(nsBlockReflowState & {...}) line 2557 + 27 bytes nsBlockFrame::Reflow(nsBlockFrame * const 0x022022d0, nsIPresContext * 0x02ee2940, nsHTMLReflowMetrics & {...}, const nsHTMLReflowState & {...}, unsigned int & 0x00000000) line 1532 + 15 bytes nsBlockReflowContext::ReflowBlock(nsIFrame * 0x022022d0, const nsRect & {x=0x00000000 y=0x00000000 width=0x00002dd2 height=0x40000000}, int 0x00000001, int 0x00000000, int 0x00000001, nsMargin & {top=0x00000000 right=0x00000000 bottom=0x00000000 left=0x00000000}, unsigned int & 0x00000000) line 425 + 45 bytes nsBlockFrame::ReflowBlockFrame(nsBlockReflowState & {...}, nsLineBox * 0x02f56770, int * 0x0012e8c8) line 3426 + 59 bytes nsBlockFrame::ReflowLine(nsBlockReflowState & {...}, nsLineBox * 0x02f56770, int * 0x0012e8c8, int 0x00000001) line 2746 + 23 bytes nsBlockFrame::ReflowDirtyLines(nsBlockReflowState & {...}) line 2557 + 27 bytes nsBlockFrame::Reflow(nsBlockFrame * const 0x02202284, nsIPresContext * 0x02ee2940, nsHTMLReflowMetrics & {...}, const nsHTMLReflowState & {...}, unsigned int & 0x00000000) line 1532 + 15 bytes nsAreaFrame::Reflow(nsAreaFrame * const 0x02202284, nsIPresContext * 0x02ee2940, nsHTMLReflowMetrics & {...}, const nsHTMLReflowState & {...}, unsigned int & 0x00000000) line 272 + 25 bytes nsContainerFrame::ReflowChild(nsIFrame * 0x02202284, nsIPresContext * 0x02ee2940, nsHTMLReflowMetrics & {...}, const nsHTMLReflowState & {...}, int 0x00000000, int 0x00000000, unsigned int 0x00000000, unsigned int & 0x00000000) line 637 + 31 bytes RootFrame::Reflow(RootFrame * const 0x0220bd14, nsIPresContext * 0x02ee2940, nsHTMLReflowMetrics & {...}, const nsHTMLReflowState & {...}, unsigned int & 0x00000000) line 331 nsContainerFrame::ReflowChild(nsIFrame * 0x0220bd14, nsIPresContext * 0x02ee2940, nsHTMLReflowMetrics & {...}, const nsHTMLReflowState & {...}, int 0x00000000, int 0x00000000, unsigned int 0x00000001, unsigned int & 0x00000000) line 637 + 31 bytes nsScrollPortFrame::Reflow(nsScrollPortFrame * const 0x0220bd9c, nsIPresContext * 0x02ee2940, nsHTMLReflowMetrics & {...}, const nsHTMLReflowState & {...}, unsigned int & 0x00000000) line 404 nsContainerFrame::ReflowChild(nsIFrame * 0x0220bd9c, nsIPresContext * 0x02ee2940, nsHTMLReflowMetrics & {...}, const nsHTMLReflowState & {...}, int 0x00000000, int 0x00000000, unsigned int 0x00000003, unsigned int & 0x00000000) line 637 + 31 bytes nsGfxScrollFrameInner::ReflowFrame(nsIPresContext * 0x02ee2940, nsHTMLReflowMetrics & {...}, const nsHTMLReflowState & {...}, unsigned int & 0x00000000, nsIFrame * 0x0220bd9c, const nsSize & {width=0x00002dd2 height=0x000020d0}, const nsSize & {width=0x00002dd2 height=0x000020d0}, int & 0x00000000, nsIFrame * & 0x00000000) line 1254 nsGfxScrollFrameInner::ReflowScrollArea(nsIPresContext * 0x02ee2940, nsHTMLReflowMetrics & {...}, const nsHTMLReflowState & {...}, unsigned int & 0x00000000, int & 0x00000000, int & 0x00000000, int & 0x00000001, nsIFrame * & 0x00000000) line 1322 nsGfxScrollFrame::Reflow(nsGfxScrollFrame * const 0x0220bd50, nsIPresContext * 0x02ee2940, nsHTMLReflowMetrics & {...}, const nsHTMLReflowState & {...}, unsigned int & 0x00000000) line 509 nsContainerFrame::ReflowChild(nsIFrame * 0x0220bd50, nsIPresContext * 0x02ee2940, nsHTMLReflowMetrics & {...}, const nsHTMLReflowState & {...}, int 0x00000000, int 0x00000000, unsigned int 0x00000000, unsigned int & 0x00000000) line 637 + 31 bytes ViewportFrame::Reflow(ViewportFrame * const 0x0220bcd8, nsIPresContext * 0x02ee2940, nsHTMLReflowMetrics & {...}, const nsHTMLReflowState & {...}, unsigned int & 0x00000000) line 531 nsHTMLReflowCommand::Dispatch(nsHTMLReflowCommand * const 0x02ba69b0, nsIPresContext * 0x02ee2940, nsHTMLReflowMetrics & {...}, const nsSize & {width=0x00002eb3 height=0x000021b1}, nsIRenderingContext & {...}) line 145 PresShell::ProcessReflowCommands(PresShell * const 0x02f36ce0, int 0x00000000) line 1944 PresShell::ExitReflowLock(PresShell * const 0x02f36ce0, int 0x00000001) line 858 PresShell::ContentChanged(PresShell * const 0x02f36ce8, nsIDocument * 0x02ef1e80, nsIContent * 0x025774bc, nsISupports * 0x02ba0ce0) line 2448 nsDocument::ContentChanged(nsDocument * const 0x02ef1e80, nsIContent * 0x025774bc, nsISupports * 0x02ba0ce0) line 1514 nsGenericDOMDataNode::AppendData(const nsString & {"d/mozilla/layout/base/public' ../../../config/nsinstall -R -m 444 _xpidlgen/layout.xpt ../../../dist/bin/components gmake[4]: "}) line 356 + 32 bytes nsTextNode::AppendData(nsTextNode * const 0x025774b0, const nsString & {"d/mozilla/layout/base/public' ../../../config/nsinstall -R -m 444 _xpidlgen/layout.xpt ../../../dist/bin/components gmake[4]: "}) line 54 + 18 bytes SinkContext::FlushText(int * 0x00000000, int 0x00000000) line 1882 + 39 bytes SinkContext::AddText(const nsString & {"s/tinderbox/SeaMonkey/Linux_2.2.5-22smp_depend/mozilla/layout/html/document/sr c' gmake[4]: Leaving directory `/builds/tinderbo"}) line 1744 + 12 bytes SinkContext::AddLeaf(const nsIParserNode & {...}) line 1564 + 23 bytes HTMLContentSink::AddLeaf(HTMLContentSink * const 0x02ef49e0, const nsIParserNode & {...}) line 2851 + 15 bytes CNavDTD::AddLeaf(const nsIParserNode * 0x02f5caf0) line 3262 + 28 bytes CNavDTD::HandleDefaultStartToken(CToken * 0x02587da0, nsHTMLTag eHTMLTag_text, nsIParserNode * 0x02f5caf0) line 1161 + 12 bytes CNavDTD::HandleStartToken(CToken * 0x02587da0) line 1472 + 22 bytes CNavDTD::HandleToken(CNavDTD * const 0x02f35e30, CToken * 0x02587da0, nsIParser * 0x02ef4b00) line 829 + 12 bytes CNavDTD::BuildModel(CNavDTD * const 0x02f35e30, nsIParser * 0x02ef4b00, nsITokenizer * 0x02f357e0, nsITokenObserver * 0x00000000, nsIContentSink * 0x02ef49e0) line 568 + 20 bytes nsParser::BuildModel() line 1078 + 34 bytes nsParser::ResumeParse(nsIDTD * 0x00000000, int 0x00000000) line 993 + 11 bytes nsParser::OnDataAvailable(nsParser * const 0x02ef4b04, nsIChannel * 0x02ee25e0, nsISupports * 0x00000000, nsIInputStream * 0x02ef75c4, unsigned int 0x00000000, unsigned int 0x00002000) line 1372 + 19 bytes nsDocumentOpenInfo::OnDataAvailable(nsDocumentOpenInfo * const 0x02ee7680, nsIChannel * 0x02ee25e0, nsISupports * 0x00000000, nsIInputStream * 0x02ef75c4, unsigned int 0x00000000, unsigned int 0x00002000) line 192 + 46 bytes InterceptStreamListener::OnDataAvailable(InterceptStreamListener * const 0x02ef75c0, nsIChannel * 0x02ee25e0, nsISupports * 0x00000000, nsIInputStream * 0x02ef5348, unsigned int 0x00000000, unsigned int 0x00002000) line 1122 nsHTTPResponseListener::OnDataAvailable(nsHTTPResponseListener * const 0x02ef54a0, nsIChannel * 0x02ef2354, nsISupports * 0x02ee25e0, nsIInputStream * 0x02ef5348, unsigned int 0x00084000, unsigned int 0x00002000) line 195 + 58 bytes nsOnDataAvailableEvent::HandleEvent(nsOnDataAvailableEvent * const 0x02ba07f0) line 370 nsStreamListenerEvent::HandlePLEvent(PLEvent * 0x02ba4900) line 93 + 12 bytes PL_HandleEvent(PLEvent * 0x02ba4900) line 526 + 10 bytes PL_ProcessPendingEvents(PLEventQueue * 0x00c84090) line 487 + 9 bytes _md_EventReceiverProc(HWND__ * 0x03290cb0, unsigned int 0x0000c080, unsigned int 0x00000000, long 0x00c84090) line 975 + 9 bytes USER32! 77e71820() 00c84090() Off to Nisheeth.
Assignee: warren → nisheeth
Severity: major → critical
Component: Networking → Layout
I've been investigating this some more, and it seems like there's also a problem (or maybe it's entirely the problem) in nsFileTransport::SetNotificationCallbacks. This calls GetProxyObject which does massive amounts of file I/O. Dougt should take a look.
More info: I ran Quantify on viewer, first visiting the default viewer test page, and then the tinderbox log page. I subtracted out the time spend in wait and i/o routines, and determined that 89% of the time left was spent in nsTextNode::AppendData, which calls nsGenericDOMDataNode::AppendData -> nsDocument::ContentChanged -> PresShell::ContentChanged -> PresShell::ExitReflowLock -> PresShell::ProcessReflowCommands, etc.
Giving a real URL to a tinderbox log. I just noticed bug 21637 -- looks like a dup.
I just checked in a change that restricts the length of a text node (the maximum is settable via the content.maxtextrun and defaults to 8k). This improves the speed of laying this page out considerably. Note that it doesn't change the control flow of the page in bug 21637 by much since that test case doesn't have long text runs. I'll let Nisheeth decide what he wants to do with the bug.
With Vidur's changes, tinderbox logs load substantially faster and no longer hang mozilla. I'm marking this bug fixed. Text layout performance needs to be further improved and bug 21637 can be used to track that issue after beta 1.
Status: NEW → RESOLVED
Closed: 25 years ago
Resolution: --- → FIXED
Putting on PDT+ radar for beta1.
Whiteboard: [PDT+]
verified: NT 2000020215 Linux 2000020214
Status: RESOLVED → VERIFIED
You need to log in before you can comment on or make changes to this bug.