New issue
Advanced search Search tips
Note: Color blocks (like or ) mean that a user may not be available. Tooltip shows the reason.

Issue 866048 link

Starred by 1 user

Issue metadata

Status: WontFix
Owner:
Closed: Jul 25
Cc:
EstimatedDays: ----
NextAction: ----
OS: ----
Pri: 2
Type: Bug

Blocking:
issue 695115



Sign in to add a comment

Taskrunner issue in MultiplexRouter and SimpleWatcher when running service manager only mode

Project Member Reported by qin...@chromium.org, Jul 20

Issue description

We got several RunsTasksInCurrentSequence DCHECK failure in MultiplexRouter and SimpleWatcher when running the ServiceManager only mode, stack attached
 

#0  base::internal::MessageLoopTaskRunner::RunsTasksInCurrentSequence (this=0xd9e34560) at ../../base/message_loop/message_loop_task_runner.cc:45
#1  0xd7933502 in mojo::SimpleWatcher::SimpleWatcher (this=0xec9bad18, from_here=..., arming_policy=<optimized out>, runner=...) at ../../mojo/public/cpp/system/simple_watcher.cc:142
#2  0xd77ead94 in mojo::Connector::WaitToReadMore (this=0xd5ed1474) at ../../mojo/public/cpp/bindings/lib/connector.cc:395
#3  0xd77eaca6 in mojo::Connector::Connector (this=0xd5ed1474, message_pipe=..., config=<optimized out>, runner=...) at ../../mojo/public/cpp/bindings/lib/connector.cc:163
#4  0xd77f020a in mojo::internal::MultiplexRouter::MultiplexRouter (this=0xd5ed1440, message_pipe=..., config=<optimized out>, set_interface_id_namesapce_bit=<optimized out>, 
    runner=scoped_refptr((base::SequencedTaskRunner *)0xccc19ddc)) at ../../mojo/public/cpp/bindings/lib/multiplex_router.cc:321
#5  0xd77f010e in mojo::internal::InterfacePtrStateBase::InitializeEndpointClient (this=<optimized out>, passes_associated_kinds=<optimized out>, has_sync_methods=<optimized out>, 
    payload_validator=...) at ../../mojo/public/cpp/bindings/lib/interface_ptr_state.cc:83
#6  0xce6f9162 in mojo::internal::InterfacePtrState<network::mojom::URLLoaderFactory>::ConfigureProxyIfNecessary (this=0xe7a7e824)
    at ../../mojo/public/cpp/bindings/lib/interface_ptr_state.h:210
#7  0xce6f90f0 in mojo::internal::InterfacePtrState<network::mojom::URLLoaderFactory>::instance (this=0xe7a7e824) at ../../mojo/public/cpp/bindings/lib/interface_ptr_state.h:113
#8  0xce3f4524 in mojo::InterfacePtr<network::mojom::URLLoaderFactory>::get (this=<optimized out>) at ../../mojo/public/cpp/bindings/interface_ptr.h:97
#9  mojo::InterfacePtr<network::mojom::URLLoaderFactory>::operator-> (this=<optimized out>) at ../../mojo/public/cpp/bindings/interface_ptr.h:100
#10 network::WrapperSharedURLLoaderFactoryBase<mojo::InterfacePtr>::CreateLoaderAndStart (this=<optimized out>, loader=..., routing_id=<optimized out>, request_id=<optimized out>, 
    options=1, request=..., client=..., traffic_annotation=...) at ../../services/network/public/cpp/wrapper_shared_url_loader_factory.h:59
#11 0xd2b07db6 in download::ResourceDownloader::Start (this=<optimized out>, download_url_parameters=..., is_parallel_request=false)
    at ../../components/download/internal/common/resource_downloader.cc:157
#12 0xd2b07baa in download::ResourceDownloader::BeginDownload (delegate=..., params=..., request=..., url_loader_factory_getter=
    scoped_refptr((download::DownloadURLLoaderFactoryGetter *)0xccc1a0d8), site_url=..., tab_url=..., tab_referrer_url=..., is_new_download=<optimized out>, is_parallel_request=false, 
    task_runner=scoped_refptr((base::internal::MessageLoopTaskRunner *)0xd9e34560)) at ../../components/download/internal/common/resource_downloader.cc:74
#13 0xd2b04918 in download::(anonymous namespace)::BeginResourceDownload (params=..., request=..., url_loader_factory_getter=..., is_new_download=<optimized out>, 
    download_manager=base::WeakPtr((uintptr_t)3969577648), site_url=..., tab_url=..., tab_referrer_url=..., 
    main_task_runner=scoped_refptr((base::internal::MessageLoopTaskRunner *)0xd9e34560)) at ../../components/download/internal/common/in_progress_download_manager.cc:84
#14 0xd2b05a36 in base::internal::FunctorTraits<void (*)(std::__ndk1::unique_ptr<download::DownloadUrlParameters, std::__ndk1::default_delete<download::DownloadUrlParameters> >, std::__ndk1::unique_ptr<network::ResourceRequest, std::__ndk1::default_delete<network::ResourceRequest> >, scoped_refptr<download::DownloadURLLoaderFactoryGetter>, bool, base::WeakPtr<download::InProgressDownloadManager>, GURL const&, GURL const&, GURL const&, scoped_refptr<base::SingleThreadTaskRunner> const&), void>::Invoke<void (*)(std::__ndk1::unique_ptr<download::DownloadUrlParameters, std::__ndk1::default_delete<download::DownloadUrlParameters> >, std::__ndk1::unique_ptr<network::ResourceRequest, std::__ndk1::default_delete<network::ResourceRequest> >, scoped_refptr<download::DownloadURLLoaderFactoryGetter>, bool, base::WeakPtr<download::InProgressDownloadManager>, GURL const&, GURL const&, GURL const&, scoped_refptr<base::SingleThreadTaskRunner> const&), std::__ndk1::unique_ptr<download::DownloadUrlParameters, std::__ndk1::default_delete<download::DownloadUrlParameters> >, std::__ndk1::unique_ptr<network::ResourceRequest, std::__ndk1::default_delete<network::ResourceRequest> >, scoped_refptr<download::DownloadURLLoaderFactoryGetter>, bool, base::WeakPtr<download::InProgressDownloadManager>, GURL, GURL, GURL, scoped_refptr<base::SingleThreadTaskRunner> >(void (*&&)(std::__ndk1::unique_ptr<download::DownloadUrlParameters, std::__ndk1::default_delete<download::DownloadUrlParameters> >, std::__ndk1::unique_ptr<network::ResourceRequest, std::__ndk1::default_delete<network::ResourceRequest> >, scoped_refptr<download::DownloadURLLoaderFactoryGetter>, bool, base::WeakPtr<download::InProgressDownloadManager>, GURL const&, GURL const&, GURL const&, scoped_refptr<base::SingleThreadTaskRunner> const&), std::__ndk1::unique_ptr<download::DownloadUrlParameters, std::__ndk1::default_delete<download::DownloadUrlParameters> >&&, std::__ndk1::unique_ptr<network::ResourceRequest, std::__ndk1::default_delete<network::ResourceRequest> >&&, scoped_refptr<download::DownloadURLLoaderFactoryGetter>&&, bool&&, base::WeakPtr<download::InProgressDownloadManager>&&, GURL&&, GURL&&, GURL&&, scoped_refptr<base::SingleThreadTaskRunner>&&) (function=<optimized out>, 


seems multiplexRouter is created with a wrong taskrunner.
 
Blocking: 695115
The MultiplexRouter and SimpleWatcher are created on whatever task runner is current when the URLLoaderFactoryPtr is first used, i.e. the first call to set_connection_error_handler or operator->.

hmm... URLLoaderFactoryPtr is first used on IO task runner, I don't see any other places we use it
Is the IO thread being torn down and re-created or something?

There is exactly one way to hit this DCHECK and it's to use the same InterfacePtr from multiple independent sequences.
Xi did some debugging on the InterfacePtr:
07-17 14:54:07.088 16372 16372 E chromium: [ERROR:interface_ptr_state.h(210)] ABCD***, interface name:service_manager.mojom.Connector
07-17 14:54:07.088 16372 16372 E chromium: [ERROR:interface_ptr_state.cc(78)] ABCD!!, ruuner_=0xe8c4f3e0
07-17 14:54:07.093 16372 16402 E chromium: [ERROR:interface_ptr_state.h(210)] ABCD***, interface name:service_manager.mojom.Service
07-17 14:54:07.093 16372 16402 E chromium: [ERROR:interface_ptr_state.cc(78)] ABCD!!, ruuner_=0xe8c4f440
07-17 14:54:07.110 16372 16372 E chromium: [ERROR:interface_ptr_state.h(210)] ABCD***, interface name:network.mojom.NetworkService
07-17 14:54:07.111 16372 16372 E chromium: [ERROR:interface_ptr_state.cc(78)] ABCD!!, ruuner_=0xe8c4f3e0
07-17 14:54:07.121 16372 16372 E chromium: [ERROR:interface_ptr_state.h(210)] ABCD***, interface name:network.mojom.NetworkContext
07-17 14:54:07.121 16372 16372 E chromium: [ERROR:interface_ptr_state.cc(78)] ABCD!!, ruuner_=0xe8c4f3e0
07-17 14:54:07.142 16372 16372 E chromium: [ERROR:download_task_runner.cc(60)] ABCD!!, get g_io_task_runner=0xe8c4f440
07-17 14:54:07.142 16372 16402 E chromium: [ERROR:download_task_runner.cc(60)] ABCD!!, get g_io_task_runner=0xe8c4f440
07-17 14:54:07.144 16372 16402 E chromium: [ERROR:interface_ptr_state.h(210)] ABCD***, interface name:network.mojom.URLLoaderFactory
07-17 14:54:07.144 16372 16402 E chromium: [ERROR:interface_ptr_state.cc(78)] ABCD!!, ruuner_=0xe8c4f3e0
07-17 14:54:07.144 16372 16402 E chromium: [ERROR:simple_watcher.cc(138)] ABCD!!, SimpleWatcher::task_runner=0xe8c4f3e0
07-17 14:54:07.144 16372 16402 E chromium: [ERROR:simple_watcher.cc(141)] ABCD!!, current thread TaskRunner:0xe8c4f440

the g_io_task_runner is on the correct thread, but everything else is not? 
Yes, g_io_task_runner is the task runner of the io thread, while the cached the task_runner to create SimpleWatcher is the one of the UI thread. The following interfaces are initially bound from the UI thread:
- service_manager.mojom.Connector
- network.mojom.NetworkService
- network.mojom.URLLoaderFactory

While the service_manager.mojom.Service is bound on io thread. The SimpleWatcher is created using one of the task runner passed in when perhaps one of the above interfaces are bounded.
ok, the issue is that calling network::mojom::NetworkContextPtr::CreateURLLoaderFactory(
        mojo::MakeRequest(&url_loader_factory_ptr),
        std::move(url_loader_factory_params)) 
on UI thread will internally call bind() and binds the URLLoaderFactory to UI thread.
Status: (was: Untriaged)
I think I have a fix for this, should simply call Clone() on the SharedURLLoaderFactory 
Owner: qin...@chromium.org
Status: WontFix

Sign in to add a comment