@@ -551,10 +551,21 @@ defmodule VirtualClock do
551551 end
552552
553553 defp advance_loop ( state , target_time , from ) do
554+ # Calculate adaptive timeout based on time advance
555+ # For large advances, use longer timeout (max 30 seconds)
556+ time_advance = target_time - state . current_time
557+ ack_timeout_ms =
558+ if time_advance > 100_000 do
559+ # For advances > 100s, use adaptive timeout
560+ min ( trunc ( time_advance / 1000 ) , 30_000 )
561+ else
562+ 2000
563+ end
564+
554565 # Set up timeout for ack wait - only if we have pending acks
555566 ack_timeout_ref =
556567 if MapSet . size ( state . pending_acks ) > 0 do
557- Process . send_after ( self ( ) , { :ack_timeout , MapSet . to_list ( state . pending_acks ) } , 2000 )
568+ Process . send_after ( self ( ) , { :ack_timeout , MapSet . to_list ( state . pending_acks ) } , ack_timeout_ms )
558569 else
559570 nil
560571 end
@@ -569,8 +580,10 @@ defmodule VirtualClock do
569580 new_state = % { state | current_time: target_time }
570581
571582 if MapSet . size ( new_state . pending_acks ) > 0 do
572- # Still waiting for actors - store caller and wait for acks with longer timeout
573- Process . send_after ( self ( ) , { :ack_timeout , MapSet . to_list ( new_state . pending_acks ) } , 2000 )
583+ # Still waiting for actors - store caller and wait for acks with adaptive timeout
584+ time_advance = target_time - state . current_time
585+ ack_timeout_ms = if time_advance > 100_000 , do: min ( trunc ( time_advance / 1000 ) , 30_000 ) , else: 2000
586+ Process . send_after ( self ( ) , { :ack_timeout , MapSet . to_list ( new_state . pending_acks ) } , ack_timeout_ms )
574587 { :noreply , % { new_state | advance_caller: from , target_time: target_time } }
575588 else
576589 # No pending acks - advance complete!
@@ -599,8 +612,10 @@ defmodule VirtualClock do
599612 # Don't immediately continue - wait for acks first, then check scheduler
600613 if MapSet . size ( new_pending ) > 0 do
601614 # Actors are processing - store caller and wait for all acks
602- # Set up new timeout for the new acks
603- Process . send_after ( self ( ) , { :ack_timeout , MapSet . to_list ( new_pending ) } , 2000 )
615+ # Set up adaptive timeout for the new acks
616+ time_advance = target_time - next_time
617+ ack_timeout_ms = if time_advance > 100_000 , do: min ( trunc ( time_advance / 1000 ) , 30_000 ) , else: 2000
618+ Process . send_after ( self ( ) , { :ack_timeout , MapSet . to_list ( new_pending ) } , ack_timeout_ms )
604619 { :noreply , % { new_state | advance_caller: from , target_time: target_time } }
605620 else
606621 # No actors to wait for - continue immediately
0 commit comments