Bug 82505 - several http tests are flaky and crashing on win, debug
Summary: several http tests are flaky and crashing on win, debug
Status: RESOLVED FIXED
Alias: None
Product: WebKit
Classification: Unclassified
Component: Tools / Tests (show other bugs)
Version: 528+ (Nightly build)
Hardware: Unspecified Unspecified
: P2 Normal
Assignee: Ami Fischman
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2012-03-28 12:32 PDT by Dirk Pranke
Modified: 2012-04-09 02:50 PDT (History)
6 users (show)

See Also:


Attachments
Patch (3.85 KB, patch)
2012-04-06 16:02 PDT, Ami Fischman
no flags Details | Formatted Diff | Diff

Note You need to log in before you can comment on or make changes to this bug.
Comment 1 Dirk Pranke 2012-03-28 12:34:19 PDT
However, the failures actually appear to be stack traces ... I don't know why they're not being reported as crashes. I tried a bit to reproduce this yesterday on linux locally, but had no luck. Perhaps someone can take a look?
Comment 2 Bill Budge 2012-03-28 14:26:26 PDT
I looked at this in the VS debugger by loading the page in TestShell. The test passes but hits a DCHECK in timer.cc (this also seems to be the case from a quick look at the flakiness dashboard logs)

Here's the code:

void Timer::AbandonScheduledTask() {
  DCHECK(thread_id_ == 0 ||
         thread_id_ == static_cast<int>(PlatformThread::CurrentId()));
  if (scheduled_task_) {
    scheduled_task_->Abandon();
    scheduled_task_ = NULL;
  }
}

Here's the stack trace. I don't know what's going on but hopefully someone can shed some light.

 	test_shell.exe!base::debug::BreakDebugger()  Line 107	C++
 	test_shell.exe!logging::LogMessage::~LogMessage()  Line 642	C++
>	test_shell.exe!base::Timer::AbandonScheduledTask()  Line 145	C++
 	test_shell.exe!base::Timer::StopAndAbandon()  Line 138	C++
 	test_shell.exe!base::Timer::~Timer()  Line 81	C++
 	test_shell.exe!base::BaseTimerMethodPointer<`anonymous namespace'::RequestProxy,1>::~BaseTimerMethodPointer<`anonymous namespace'::RequestProxy,1>()  + 0x16 bytes	C++
 	test_shell.exe!base::RepeatingTimer<`anonymous namespace'::RequestProxy>::~RepeatingTimer<`anonymous namespace'::RequestProxy>()  + 0x16 bytes	C++
 	test_shell.exe!`anonymous namespace'::RequestProxy::~RequestProxy()  Line 315 + 0x27 bytes	C++
 	test_shell.exe!`anonymous namespace'::RequestProxy::`scalar deleting destructor'()  + 0x16 bytes	C++
 	test_shell.exe!base::RefCountedThreadSafe<`anonymous namespace'::RequestProxy,base::DefaultRefCountedThreadSafeTraits<`anonymous namespace'::RequestProxy> >::DeleteInternal(const `anonymous-namespace'::RequestProxy * x=0x0c707e48)  Line 151 + 0x3e bytes	C++
 	test_shell.exe!base::DefaultRefCountedThreadSafeTraits<`anonymous namespace'::RequestProxy>::Destruct(const `anonymous-namespace'::RequestProxy * x=0x0c707e48)  Line 117 + 0x9 bytes	C++
 	test_shell.exe!base::RefCountedThreadSafe<`anonymous namespace'::RequestProxy,base::DefaultRefCountedThreadSafeTraits<`anonymous namespace'::RequestProxy> >::Release()  Line 145 + 0x21 bytes	C++
 	test_shell.exe!base::internal::MaybeRefcount<1,`anonymous namespace'::RequestProxy *>::Release(`anonymous-namespace'::RequestProxy * o=0x0c707e48)  Line 466 + 0xe bytes	C++
 	test_shell.exe!base::internal::BindState<base::internal::RunnableAdapter<void (__thiscall `anonymous namespace'::RequestProxy::*)(net::URLRequestStatus const &,std::basic_string<char,std::char_traits<char>,std::allocator<char> > const &,base::TimeTicks const &)>,void __cdecl(`anonymous namespace'::RequestProxy *,net::URLRequestStatus const &,std::basic_string<char,std::char_traits<char>,std::allocator<char> > const &,base::TimeTicks const &),void __cdecl(`anonymous namespace'::RequestProxy *,net::URLRequestStatus,std::basic_string<char,std::char_traits<char>,std::allocator<char> >,base::TimeTicks)>::~BindState<base::internal::RunnableAdapter<void (__thiscall `anonymous namespace'::RequestProxy::*)(net::URLRequestStatus const &,std::basic_string<char,std::char_traits<char>,std::allocator<char> > const &,base::TimeTicks const &)>,void __cdecl(`anonymous namespace'::RequestProxy *,net::URLRequestStatus const &,std::basic_string<char,std::char_traits<char>,std::allocator<char> > const &,base::TimeTicks const &),void __cdecl(`anonymous namespace'::RequestProxy *,net::URLRequestStatus,std::basic_string<char,std::char_traits<char>,std::allocator<char> >,base::TimeTicks)>()  Line 2655 + 0xc bytes	C++
 	test_shell.exe!base::internal::BindState<base::internal::RunnableAdapter<void (__thiscall `anonymous namespace'::RequestProxy::*)(net::URLRequestStatus const &,std::basic_string<char,std::char_traits<char>,std::allocator<char> > const &,base::TimeTicks const &)>,void __cdecl(`anonymous namespace'::RequestProxy *,net::URLRequestStatus const &,std::basic_string<char,std::char_traits<char>,std::allocator<char> > const &,base::TimeTicks const &),void __cdecl(`anonymous namespace'::RequestProxy *,net::URLRequestStatus,std::basic_string<char,std::char_traits<char>,std::allocator<char> >,base::TimeTicks)>::`scalar deleting destructor'()  + 0x16 bytes	C++
 	test_shell.exe!base::RefCountedThreadSafe<base::internal::BindStateBase,base::DefaultRefCountedThreadSafeTraits<base::internal::BindStateBase> >::DeleteInternal(const base::internal::BindStateBase * x=0x0c6e6098)  Line 151 + 0x3e bytes	C++
 	test_shell.exe!base::DefaultRefCountedThreadSafeTraits<base::internal::BindStateBase>::Destruct(const base::internal::BindStateBase * x=0x0c6e6098)  Line 117 + 0x9 bytes	C++
 	test_shell.exe!base::RefCountedThreadSafe<base::internal::BindStateBase,base::DefaultRefCountedThreadSafeTraits<base::internal::BindStateBase> >::Release()  Line 145 + 0x21 bytes	C++
 	test_shell.exe!scoped_refptr<base::internal::BindStateBase>::~scoped_refptr<base::internal::BindStateBase>()  Line 244	C++
 	test_shell.exe!base::internal::CallbackBase::~CallbackBase()  Line 33 + 0x8 bytes	C++
 	test_shell.exe!base::Callback<void __cdecl(void)>::~Callback<void __cdecl(void)>()  + 0x16 bytes	C++
 	test_shell.exe!base::PendingTask::~PendingTask()  Line 32 + 0xb bytes	C++
 	test_shell.exe!MessageLoop::DoWork()  Line 661 + 0xc bytes	C++
 	test_shell.exe!base::MessagePumpForUI::DoRunLoop()  Line 203 + 0x1d bytes	C++
 	test_shell.exe!base::MessagePumpWin::RunWithDispatcher(base::MessagePump::Delegate * delegate=0x0029fc94, base::MessagePumpWin::Dispatcher * dispatcher=0x00000000)  Line 51 + 0xf bytes	C++
 	test_shell.exe!base::MessagePumpWin::Run(base::MessagePump::Delegate * delegate=0x0029fc94)  Line 64 + 0x1c bytes	C++
 	test_shell.exe!MessageLoop::RunInternal()  Line 417 + 0x2a bytes	C++
 	test_shell.exe!MessageLoop::RunHandler()  Line 391	C++
 	test_shell.exe!MessageLoop::Run()  Line 301	C++
 	test_shell.exe!main(int argc=4, char * * argv=0x003225d8)  Line 334	C++
 	test_shell.exe!__tmainCRTStartup()  Line 266 + 0x19 bytes	C
 	test_shell.exe!mainCRTStartup()  Line 182	C
 	kernel32.dll!76a73677() 	
 	[Frames below may be incorrect and/or missing, no symbols loaded for kernel32.dll]	
 	ntdll.dll!77679f42() 	
 	ntdll.dll!77679f15()
Comment 3 Tony Chang 2012-03-28 14:53:31 PDT
It looks like this is because of the call to  logging::SetLogAssertHandler(UnitTestAssertHandler); in webkit_support.cc.  This causes us to not crash when we hit an assert.  I think we're not supposed to set this for DRT or test_shell.

It looks like the code has been this way for a long time (at least 18 months?).  Maybe we've never properly crashed on ASSERTs in debug?
Comment 4 Dirk Pranke 2012-03-29 15:16:18 PDT
Looks like a few other tests are hitting this as well:

http/tests/xmlhttprequest/redirect-cross-origin-post.html
http/tests/media/media-can-load-when-hidden.html
http/tests/xmlhttprequest/upload-onloadend-event-after-abort.html
http/tests/xmlhttprequest/upload-onprogress-event.html
http/tests/xmlhttprequest/upload-onloadend-event-after-sync-requests.html

Note that after tony's change in chromium r129689 we're at least getting proper crashes.
Comment 5 Ami Fischman 2012-04-05 11:16:49 PDT
The crash is caused by a bug in chromium's simple_resource_loader_bridge.cc; opened http://crbug.com/122182 and sent CR for it in https://chromiumcodereview.appspot.com/10012010/

Also, the failing media test (http/tests/media/media-can-load-when-hidden.html) doesn't actually need to be an http test, so I'm moving it into LayoutTests/media (and de-racing it) in bug 83296.
Comment 6 Ami Fischman 2012-04-06 12:55:56 PDT
The Timer check triggered by ~RequestProxy() is fixed in http://src.chromium.org/viewvc/chrome?view=rev&revision=131170
When this rolls into WebKit deps I'll post a patch to remove the failure expectations.
Comment 7 Ami Fischman 2012-04-06 16:02:30 PDT
Created attachment 136085 [details]
Patch
Comment 8 WebKit Review Bot 2012-04-09 02:50:37 PDT
Comment on attachment 136085 [details]
Patch

Clearing flags on attachment: 136085

Committed r113566: <http://trac.webkit.org/changeset/113566>
Comment 9 WebKit Review Bot 2012-04-09 02:50:42 PDT
All reviewed patches have been landed.  Closing bug.