Commit f7a0342e authored by zxliang's avatar zxliang Committed by Commit Bot

Check external_services_to_proxy for interfaces from external services

If a service appears in external_services_to_proxy, it is supposed to be
registered and stored in services_ as well. BindInterface() should not
query ServiceManager but instead should store this request through
ServiceNotFound for later query when that particular external service is
registered through RegisterExternalServices(..). Otherwise the binding
process to this external service (which only has earlier-registered
service_instance) will be silently dropped if the the client doesn't
set any disconnection handler.

Refer to go/ml-framework-standalone-binary-flakiness for more info.

Bug: b/168555534
Test: CQ

Change-Id: I2f791c924e1b23518704ad7237fc1e5624eaefd8
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2537975
Commit-Queue: Zhaoxin Liang <zxliang@google.com>
Reviewed-by: default avatarKenneth MacKay <kmackay@chromium.org>
Cr-Commit-Position: refs/heads/master@{#827706}
parent fbf8996e
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
#include "chromecast/external_mojo/public/cpp/external_mojo_broker.h" #include "chromecast/external_mojo/public/cpp/external_mojo_broker.h"
#include <map> #include <map>
#include <set>
#include <utility> #include <utility>
#if defined(OS_LINUX) || defined(OS_CHROMEOS) #if defined(OS_LINUX) || defined(OS_CHROMEOS)
...@@ -186,6 +187,9 @@ class ExternalMojoBroker::ConnectorImpl : public mojom::ExternalConnector { ...@@ -186,6 +187,9 @@ class ExternalMojoBroker::ConnectorImpl : public mojom::ExternalConnector {
return; return;
} }
external_services_to_proxy_.insert(external_services_to_proxy.begin(),
external_services_to_proxy.end());
for (const auto& service_name : external_services_to_proxy) { for (const auto& service_name : external_services_to_proxy) {
LOG(INFO) << "Register proxy for external " << service_name; LOG(INFO) << "Register proxy for external " << service_name;
mojo::PendingRemote<service_manager::mojom::Service> service_remote; mojo::PendingRemote<service_manager::mojom::Service> service_remote;
...@@ -272,7 +276,9 @@ class ExternalMojoBroker::ConnectorImpl : public mojom::ExternalConnector { ...@@ -272,7 +276,9 @@ class ExternalMojoBroker::ConnectorImpl : public mojom::ExternalConnector {
return; return;
} }
if (!connector_) { auto service_proxy_it = external_services_to_proxy_.find(service_name);
if (!connector_ || service_proxy_it != external_services_to_proxy_.end()) {
ServiceNotFound(service_name, interface_name, std::move(interface_pipe)); ServiceNotFound(service_name, interface_name, std::move(interface_pipe));
return; return;
} }
...@@ -349,6 +355,7 @@ class ExternalMojoBroker::ConnectorImpl : public mojom::ExternalConnector { ...@@ -349,6 +355,7 @@ class ExternalMojoBroker::ConnectorImpl : public mojom::ExternalConnector {
std::unique_ptr<service_manager::Connector> connector_; std::unique_ptr<service_manager::Connector> connector_;
mojo::ReceiverSet<mojom::ExternalConnector> receivers_; mojo::ReceiverSet<mojom::ExternalConnector> receivers_;
std::set<std::string> external_services_to_proxy_;
std::map<std::string, std::unique_ptr<ExternalServiceProxy>> std::map<std::string, std::unique_ptr<ExternalServiceProxy>>
registered_external_services_; registered_external_services_;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment