@@ -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,26 @@ 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 slices: & [ & Slice ] = & sel. iter ( ) . collect :: < Vec < _ > > ( ) ;
249
+ let selection = self
250
+ . proc_mesh
251
+ . shape ( )
252
+ . slice ( )
253
+ . reify_views ( slices)
254
+ . expect ( "invalid slices" ) ;
255
+
256
+ self . cast ( selection, message) ?;
257
+
266
258
Ok ( ( ) )
267
259
}
268
260
@@ -528,6 +520,7 @@ mod tests {
528
520
use $crate:: sel_from_shape;
529
521
use $crate:: sel;
530
522
use $crate:: proc_mesh:: SharedSpawnable ;
523
+ use $crate:: comm:: multicast:: set_cast_info_on_headers;
531
524
use std:: collections:: VecDeque ;
532
525
use hyperactor:: data:: Serialized ;
533
526
0 commit comments