@@ -25,7 +25,6 @@ use hyperactor::RemoteMessage;
25
25
use hyperactor:: Unbind ;
26
26
use hyperactor:: WorldId ;
27
27
use hyperactor:: actor:: RemoteActor ;
28
- use hyperactor:: attrs:: Attrs ;
29
28
use hyperactor:: cap;
30
29
use hyperactor:: mailbox:: MailboxSenderError ;
31
30
use hyperactor:: mailbox:: PortReceiver ;
@@ -49,7 +48,6 @@ use crate::comm::multicast::CastMessage;
49
48
use crate :: comm:: multicast:: CastMessageEnvelope ;
50
49
use crate :: comm:: multicast:: DestinationPort ;
51
50
use crate :: comm:: multicast:: Uslice ;
52
- use crate :: comm:: multicast:: set_cast_info_on_headers;
53
51
use crate :: metrics;
54
52
use crate :: proc_mesh:: ProcMesh ;
55
53
use crate :: reference:: ActorMeshId ;
@@ -237,32 +235,35 @@ impl<'a, A: RemoteActor> RootActorMesh<'a, A> {
237
235
/// Until the selection logic is more powerful, we need a way to
238
236
/// replicate the send patterns that the worker actor mesh actually does.
239
237
#[ allow( clippy:: result_large_err) ] // TODO: Consider reducing the size of `CastError`.
240
- pub fn cast_slices < M : RemoteMessage + Clone > (
241
- & self ,
242
- sel : Vec < Slice > ,
243
- message : M ,
244
- ) -> Result < ( ) , CastError >
238
+ pub fn cast_slices < M > ( & self , sel : Vec < Slice > , message : M ) -> Result < ( ) , CastError >
245
239
where
240
+ M : Castable + Clone ,
246
241
A : RemoteHandles < M > + RemoteHandles < IndexedErasedUnbound < M > > ,
247
242
{
248
243
let _ = metrics:: ACTOR_MESH_CAST_DURATION . start ( hyperactor:: kv_pairs!(
249
244
"message_type" => M :: typename( ) ,
250
245
"message_variant" => message. arm( ) . unwrap_or_default( ) ,
251
246
) ) ;
252
- for ref slice in sel {
253
- for rank in slice. iter ( ) {
254
- let mut headers = Attrs :: new ( ) ;
255
- set_cast_info_on_headers (
256
- & mut headers,
257
- rank,
258
- self . shape ( ) . clone ( ) ,
259
- self . proc_mesh . client ( ) . actor_id ( ) . clone ( ) ,
260
- ) ;
261
- self . ranks [ rank]
262
- . send_with_headers ( self . proc_mesh . client ( ) , headers, message. clone ( ) )
263
- . map_err ( |err| CastError :: MailboxSenderError ( rank, err) ) ?;
264
- }
265
- }
247
+
248
+ let client = self . proc_mesh . client ( ) ;
249
+ let snd = client. actor_id ( ) . clone ( ) ;
250
+ let dst = DestinationPort :: new :: < A , M > ( self . name ( ) . to_string ( ) ) ;
251
+ let shape = self . proc_mesh . shape ( ) . clone ( ) ;
252
+ let base_slice = self . proc_mesh . shape ( ) . slice ( ) . clone ( ) ;
253
+ let slices: & [ & Slice ] = & sel. iter ( ) . collect :: < Vec < _ > > ( ) ;
254
+ let message = CastMessageEnvelope :: new ( snd, dst, shape, message, None ) ?;
255
+
256
+ self . proc_mesh . comm_actor ( ) . send (
257
+ client,
258
+ CastMessage {
259
+ dest : Uslice {
260
+ slice : base_slice. clone ( ) ,
261
+ selection : base_slice. reify_views ( slices) . expect ( "invalid slices" ) ,
262
+ } ,
263
+ message,
264
+ } ,
265
+ ) ?;
266
+
266
267
Ok ( ( ) )
267
268
}
268
269
@@ -528,6 +529,7 @@ mod tests {
528
529
use $crate:: sel_from_shape;
529
530
use $crate:: sel;
530
531
use $crate:: proc_mesh:: SharedSpawnable ;
532
+ use $crate:: comm:: multicast:: set_cast_info_on_headers;
531
533
use std:: collections:: VecDeque ;
532
534
use hyperactor:: data:: Serialized ;
533
535
0 commit comments