Taskrunner issue in MultiplexRouter and SimpleWatcher when running service manager only mode |
|||
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.
,
Jul 20
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->.
,
Jul 20
hmm... URLLoaderFactoryPtr is first used on IO task runner, I don't see any other places we use it
,
Jul 20
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.
,
Jul 20
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?
,
Jul 20
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.
,
Jul 25
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.
,
Jul 25
I think I have a fix for this, should simply call Clone() on the SharedURLLoaderFactory
,
Jul 25
|
|||
►
Sign in to add a comment |
|||
Comment 1 by qin...@chromium.org
, Jul 20