Buffer uplink communications to give a chance for stateful entities at each end to initialise themselves before sending messages.

An alternative approach would be to reintroduce flow-control, which was
removed as part of commit 94e27e1.
This commit is contained in:
Tony Garnock-Jones 2019-05-16 23:14:32 +01:00
parent 8daff63e8e
commit 43a0578f19
1 changed files with 22 additions and 2 deletions

View File

@ -98,11 +98,31 @@
(assert (server-proposal management-scope (federated-link session-id local-scope)))
(assert (to-server peer-addr (federated-link session-id remote-scope)))
;; We have to buffer in both directions, because at startup there's latency
;; between asserting a federated-link record and it being ready to receive
;; message-poa->server records.
(field [pending-in '()]
[pending-out '()])
(on (message (from-server peer-addr (message-server->poa session-id $p)))
(send! (server-proposal management-scope (message-poa->server session-id p))))
(pending-in (cons p (pending-in))))
(on (message (server-envelope management-scope (message-server->poa session-id $p)))
(send! (to-server peer-addr (message-poa->server session-id p))))))))
(pending-out (cons p (pending-out))))
(during (server-envelope management-scope (observe (message-poa->server session-id _)))
(during (from-server peer-addr (observe (message-poa->server session-id _)))
(begin/dataflow
(when (pair? (pending-in))
(for [(p (reverse (pending-in)))]
(send! (server-proposal management-scope
(message-poa->server session-id p))))
(pending-in '())))
(begin/dataflow
(when (pair? (pending-out))
(for [(p (reverse (pending-out)))]
(send! (to-server peer-addr (message-poa->server session-id p))))
(pending-out '())))))))))
;;---------------------------------------------------------------------------
;; Local links.