Make simulated_message_bridge resend reliable messages
Just like message_bridge now sends reliable messages (ttl = 0) sent
before connecting when connecting, simulated_message_bridge now does the
same. This brings sim up to the same standard as the real world.
The combination of the two of these let us send low rate configuration
messages over message_gateway and guarantee the latest message will
always be delivered.
Change-Id: I7c32ea94f56dfa89e155af807ed284bf47dc4912
diff --git a/aos/events/simulated_network_bridge.cc b/aos/events/simulated_network_bridge.cc
index 5660331..b9ff861 100644
--- a/aos/events/simulated_network_bridge.cc
+++ b/aos/events/simulated_network_bridge.cc
@@ -40,6 +40,12 @@
const Channel *channel() const { return fetcher_->channel(); }
+ uint32_t time_to_live() {
+ return configuration::ConnectionToNode(sender_->channel(),
+ send_node_factory_->node())
+ ->time_to_live();
+ }
+
// Kicks us to re-fetch and schedule the timer.
void Schedule() {
// Keep pulling messages out of the fetcher until we find one in the future.
@@ -284,6 +290,16 @@
});
} else {
// And register every delayer to be poked when a new message shows up.
+
+ source_event_loop->second.event_loop->OnRun([captured_delayers =
+ delayers.get()]() {
+ // Poke all the reliable delayers so they send any queued messages.
+ for (std::unique_ptr<RawMessageDelayer> &delayer : *captured_delayers) {
+ if (delayer->time_to_live() == 0) {
+ delayer->Schedule();
+ }
+ }
+ });
source_event_loop->second.event_loop->MakeRawNoArgWatcher(
channel, [captured_delayers = delayers.get()](const Context &) {
for (std::unique_ptr<RawMessageDelayer> &delayer :