diff --git a/syndicate/distributed/federation.rkt b/syndicate/distributed/federation.rkt index c49f6c2..9a43484 100644 --- a/syndicate/distributed/federation.rkt +++ b/syndicate/distributed/federation.rkt @@ -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.