Fix web_proxy for multinode.
Make sure the channel is readable on a node before making fetchers.
Web side will silently fail to subscribe if it isn't available.
Change-Id: Ic3e2c3cf49fb6750697ce6bd7ccf172558eebf2d
diff --git a/aos/network/web_proxy.cc b/aos/network/web_proxy.cc
index 77371eb..f4a8ce8 100644
--- a/aos/network/web_proxy.cc
+++ b/aos/network/web_proxy.cc
@@ -212,6 +212,10 @@
const message_bridge::Connect *message =
flatbuffers::GetRoot<message_bridge::Connect>(buffer.data.data());
for (auto &subscriber : subscribers_) {
+ // Make sure the subscriber is for a channel on this node.
+ if (subscriber.get() == nullptr) {
+ continue;
+ }
bool found_match = false;
for (auto channel : *message->channels_to_transfer()) {
if (subscriber->Compare(channel)) {
diff --git a/aos/network/web_proxy_main.cc b/aos/network/web_proxy_main.cc
index 21b6f9c..479320a 100644
--- a/aos/network/web_proxy_main.cc
+++ b/aos/network/web_proxy_main.cc
@@ -15,13 +15,18 @@
std::vector<std::unique_ptr<aos::web_proxy::Subscriber>> *subscribers,
const aos::FlatbufferDetachedBuffer<aos::Configuration> &config) {
aos::ShmEventLoop event_loop(&config.message());
+ const aos::Node *self = aos::configuration::GetMyNode(&config.message());
// TODO(alex): skip fetchers on the wrong node.
for (uint i = 0; i < config.message().channels()->size(); ++i) {
auto channel = config.message().channels()->Get(i);
- auto fetcher = event_loop.MakeRawFetcher(channel);
- subscribers->emplace_back(
- std::make_unique<aos::web_proxy::Subscriber>(std::move(fetcher), i));
+ if (!aos::configuration::ChannelIsReadableOnNode(channel, self)) {
+ subscribers->emplace_back(nullptr);
+ } else {
+ auto fetcher = event_loop.MakeRawFetcher(channel);
+ subscribers->emplace_back(
+ std::make_unique<aos::web_proxy::Subscriber>(std::move(fetcher), i));
+ }
}
flatbuffers::FlatBufferBuilder fbb(1024);