66
66
//! implementation to avoid a serialization roundtrip when passing
67
67
//! messages locally.
68
68
69
- #![ allow( dead_code) ] // Allow until this is used outside of tests.
70
-
71
69
use std:: any:: Any ;
72
70
use std:: collections:: BTreeMap ;
73
71
use std:: collections:: BTreeSet ;
@@ -946,43 +944,6 @@ impl Future for MailboxServerHandle {
946
944
}
947
945
}
948
946
949
- // A `MailboxServer` (such as a router) can receive a message
950
- // that couldn't reach its destination. We can use the fact that
951
- // servers are `MailboxSender`s to attempt to forward them back to
952
- // their senders.
953
- fn server_return_handle < T : MailboxServer > ( server : T ) -> PortHandle < Undeliverable < MessageEnvelope > > {
954
- let ( return_handle, mut rx) = undeliverable:: new_undeliverable_port ( ) ;
955
-
956
- tokio:: task:: spawn ( async move {
957
- while let Ok ( Undeliverable ( mut envelope) ) = rx. recv ( ) . await {
958
- if let Ok ( Undeliverable ( e) ) = envelope. deserialized :: < Undeliverable < MessageEnvelope > > ( )
959
- {
960
- // A non-returnable undeliverable.
961
- UndeliverableMailboxSender . post ( e, monitored_return_handle ( ) ) ;
962
- continue ;
963
- }
964
- envelope. set_error ( DeliveryError :: BrokenLink (
965
- "message was undeliverable" . to_owned ( ) ,
966
- ) ) ;
967
- server. post (
968
- MessageEnvelope :: new (
969
- envelope. sender ( ) . clone ( ) ,
970
- PortRef :: < Undeliverable < MessageEnvelope > > :: attest_message_port (
971
- envelope. sender ( ) ,
972
- )
973
- . port_id ( )
974
- . clone ( ) ,
975
- Serialized :: serialize ( & Undeliverable ( envelope) ) . unwrap ( ) ,
976
- Attrs :: new ( ) ,
977
- ) ,
978
- monitored_return_handle ( ) ,
979
- ) ;
980
- }
981
- } ) ;
982
-
983
- return_handle
984
- }
985
-
986
947
/// Serve a port on the provided [`channel::Rx`]. This dispatches all
987
948
/// channel messages directly to the port.
988
949
pub trait MailboxServer : MailboxSender + Clone + Sized + ' static {
@@ -1011,6 +972,9 @@ pub trait MailboxServer: MailboxSender + Clone + Sized + 'static {
1011
972
envelope. set_error ( DeliveryError :: BrokenLink (
1012
973
"message was undeliverable" . to_owned ( ) ,
1013
974
) ) ;
975
+ let mut headers = Attrs :: new ( ) ;
976
+ // Ordering is not required when returning Undeliverable.
977
+ headers. set ( SEQ_INFO , SeqInfo :: Unordered ) ;
1014
978
server. post (
1015
979
MessageEnvelope :: new (
1016
980
envelope. sender ( ) . clone ( ) ,
@@ -1020,7 +984,7 @@ pub trait MailboxServer: MailboxSender + Clone + Sized + 'static {
1020
984
. port_id ( )
1021
985
. clone ( ) ,
1022
986
Serialized :: serialize ( & Undeliverable ( envelope) ) . unwrap ( ) ,
1023
- Attrs :: new ( ) ,
987
+ headers ,
1024
988
) ,
1025
989
monitored_return_handle ( ) ,
1026
990
) ;
@@ -1589,19 +1553,30 @@ impl<M: Message> PortHandle<M> {
1589
1553
let mut headers = Attrs :: new ( ) ;
1590
1554
1591
1555
crate :: mailbox:: headers:: set_send_timestamp ( & mut headers) ;
1592
- // Message sent from handle is delivered immediately. It could race with
1593
- // messages from refs. So we need to assign seq if the handle is bound.
1594
- if let Some ( bound_port) = self . bound . get ( )
1595
- && bound_port. is_actor_port ( )
1596
- {
1597
- let sequencer = cx. instance ( ) . sequencer ( ) ;
1598
- let seq = sequencer. assign_seq ( self . mailbox . actor_id ( ) ) ;
1599
- let seq_info = SeqInfo {
1600
- session_id : sequencer. session_id ( ) ,
1601
- seq,
1602
- } ;
1603
- headers. set ( SEQ_INFO , seq_info) ;
1556
+
1557
+ match self . bound . get ( ) {
1558
+ Some ( bound_port) => {
1559
+ // Message sent from handle is delivered immediately. It could
1560
+ // race with messages from refs. So we need to assign seq to
1561
+ // preserve the ordering.
1562
+ if bound_port. is_actor_port ( ) {
1563
+ let sequencer = cx. instance ( ) . sequencer ( ) ;
1564
+ let seq = sequencer. assign_seq ( self . mailbox . actor_id ( ) ) ;
1565
+ let seq_info = SeqInfo :: Session {
1566
+ session_id : sequencer. session_id ( ) ,
1567
+ seq,
1568
+ } ;
1569
+ headers. set ( SEQ_INFO , seq_info) ;
1570
+ }
1571
+ }
1572
+ None => {
1573
+ // we do not have info to know whether this handle is used for
1574
+ // enqueue port or not. Since enqueue port requires the SEQ_INFO
1575
+ // header, we set it in for all messages sent from unbound handles.
1576
+ headers. set ( SEQ_INFO , SeqInfo :: Unordered ) ;
1577
+ }
1604
1578
}
1579
+
1605
1580
// Encountering error means the port is closed. So we do not need to
1606
1581
// rollback the seq, because no message can be delivered to it, and
1607
1582
// subsequently do not need to worry about out-of-sequence for messages
@@ -1619,6 +1594,7 @@ impl<M: Message> PortHandle<M> {
1619
1594
pub fn anon_send ( & self , message : M ) -> Result < ( ) , MailboxSenderError > {
1620
1595
let mut headers = Attrs :: new ( ) ;
1621
1596
crate :: mailbox:: headers:: set_send_timestamp ( & mut headers) ;
1597
+ headers. set ( SEQ_INFO , SeqInfo :: Unordered ) ;
1622
1598
self . sender . send ( headers, message) . map_err ( |err| {
1623
1599
MailboxSenderError :: new_unbound :: < M > (
1624
1600
self . mailbox . actor_id ( ) . clone ( ) ,
0 commit comments