@@ -1319,46 +1319,68 @@ pub async fn insert_and_send_commands(
13191319 input : & InsertAndSendCommandsInput ,
13201320) -> Result < ( ) > {
13211321 let mut state = ctx. state :: < State > ( ) ?;
1322+ let mut commands = input. commands . clone ( ) ;
1323+
1324+ for command in & mut commands {
1325+ if let protocol:: mk2:: Command :: CommandStartActor ( start) = command {
1326+ start. hibernating_requests = ctx
1327+ . op ( crate :: ops:: actor:: hibernating_request:: list:: Input {
1328+ actor_id : input. actor_id ,
1329+ } )
1330+ . await ?
1331+ . into_iter ( )
1332+ . map ( |req| protocol:: mk2:: HibernatingRequest {
1333+ gateway_id : req. gateway_id ,
1334+ request_id : req. request_id ,
1335+ } )
1336+ . collect ( ) ;
1337+ }
1338+ }
13221339
13231340 let runner_state = state. runner_state . get_or_insert_default ( ) ;
13241341 let old_last_command_idx = runner_state. last_command_idx ;
1325- runner_state. last_command_idx += input . commands . len ( ) as i64 ;
1342+ runner_state. last_command_idx += commands. len ( ) as i64 ;
13261343
13271344 // This does not have to be part of its own activity because the txn is idempotent
13281345 let last_command_idx = runner_state. last_command_idx ;
1346+ let commands_for_tx = commands. clone ( ) ;
13291347 ctx. udb ( ) ?
1330- . run ( |tx| async move {
1331- let tx = tx . with_subspace ( keys :: subspace ( ) ) ;
1348+ . run ( |tx| {
1349+ let commands_for_tx = commands_for_tx . clone ( ) ;
13321350
1333- tx. write (
1334- & keys:: runner:: ActorLastCommandIdxKey :: new (
1335- input. runner_id ,
1336- input. actor_id ,
1337- input. generation ,
1338- ) ,
1339- last_command_idx,
1340- ) ?;
1351+ async move {
1352+ let tx = tx. with_subspace ( keys:: subspace ( ) ) ;
13411353
1342- for ( i, command) in input. commands . iter ( ) . enumerate ( ) {
13431354 tx. write (
1344- & keys:: runner:: ActorCommandKey :: new (
1355+ & keys:: runner:: ActorLastCommandIdxKey :: new (
13451356 input. runner_id ,
13461357 input. actor_id ,
13471358 input. generation ,
1348- old_last_command_idx + i as i64 + 1 ,
13491359 ) ,
1350- match command {
1351- protocol:: mk2:: Command :: CommandStartActor ( x) => {
1352- protocol:: mk2:: ActorCommandKeyData :: CommandStartActor ( x. clone ( ) )
1353- }
1354- protocol:: mk2:: Command :: CommandStopActor => {
1355- protocol:: mk2:: ActorCommandKeyData :: CommandStopActor
1356- }
1357- } ,
1360+ last_command_idx,
13581361 ) ?;
1359- }
13601362
1361- Ok ( ( ) )
1363+ for ( i, command) in commands_for_tx. iter ( ) . enumerate ( ) {
1364+ tx. write (
1365+ & keys:: runner:: ActorCommandKey :: new (
1366+ input. runner_id ,
1367+ input. actor_id ,
1368+ input. generation ,
1369+ old_last_command_idx + i as i64 + 1 ,
1370+ ) ,
1371+ match command {
1372+ protocol:: mk2:: Command :: CommandStartActor ( x) => {
1373+ protocol:: mk2:: ActorCommandKeyData :: CommandStartActor ( x. clone ( ) )
1374+ }
1375+ protocol:: mk2:: Command :: CommandStopActor => {
1376+ protocol:: mk2:: ActorCommandKeyData :: CommandStopActor
1377+ }
1378+ } ,
1379+ ) ?;
1380+ }
1381+
1382+ Ok ( ( ) )
1383+ }
13621384 } )
13631385 . await ?;
13641386
@@ -1367,8 +1389,7 @@ pub async fn insert_and_send_commands(
13671389
13681390 let message_serialized =
13691391 versioned:: ToRunnerMk2 :: wrap_latest ( protocol:: mk2:: ToRunner :: ToClientCommands (
1370- input
1371- . commands
1392+ commands
13721393 . iter ( )
13731394 . enumerate ( )
13741395 . map ( |( i, command) | protocol:: mk2:: CommandWrapper {
0 commit comments