@@ -70,6 +70,8 @@ def setUp(self):
7070
7171 # Configure default behaviors if needed
7272 self .fake_pathwaysutils .is_pathways_backend_used .return_value = True
73+ self .fake_pathwaysutils .elastic = Mock ()
74+ self .fake_pathwaysutils .elastic .get_active_slice_indices .return_value = [0 , 1 ]
7375 self .fake_jax .process_index .return_value = 0
7476
7577 # Inject fakes into elastic_utils namespace
@@ -97,9 +99,37 @@ def tearDown(self):
9799 elastic_utils .pending_elastic_event_type = None
98100 super ().tearDown ()
99101
102+
103+ def test_record_slice_state (self ):
104+ elastic_utils .elastic_manager = self .fake_manager
105+ self .fake_manager .active_slice_indices = {0 }
106+ self .fake_manager .slice_to_devices = {0 : [FakeDevice ()], 1 : [FakeDevice ()]}
107+ self .fake_pathwaysutils .elastic .get_active_slice_indices .return_value = {0 , 1 }
108+
109+ fake_recorder = Mock ()
110+ fake_recorder .record_elastic_slice_counts = Mock ()
111+
112+ elastic_utils .record_slice_state (fake_recorder )
113+
114+ fake_recorder .record_elastic_slice_counts .assert_called_once_with (
115+ available_slices = 2 ,
116+ active_slices = 1 ,
117+ total_slices = 2
118+ )
119+
120+ fake_recorder .record_elastic_slice_counts .reset_mock ()
121+ elastic_utils .record_slice_state (fake_recorder , active_slices_override = 0 )
122+ fake_recorder .record_elastic_slice_counts .assert_called_once_with (
123+ available_slices = 2 ,
124+ active_slices = 0 ,
125+ total_slices = 2
126+ )
127+
100128 def test_elastic_enabled (self ):
101129 config = FakeConfig ()
102130 self .fake_pathwaysutils .is_pathways_backend_used .return_value = True
131+ self .fake_pathwaysutils .elastic = Mock ()
132+ self .fake_pathwaysutils .elastic .get_active_slice_indices .return_value = [0 , 1 ]
103133 config .elastic_enabled = True
104134 self .assertTrue (elastic_utils .elastic_enabled (config ))
105135
@@ -144,6 +174,8 @@ def test_live_devices_no_pathways(self):
144174 def test_live_devices_pathways (self ):
145175 """Tests live_devices when pathways is used."""
146176 self .fake_pathwaysutils .is_pathways_backend_used .return_value = True
177+ self .fake_pathwaysutils .elastic = Mock ()
178+ self .fake_pathwaysutils .elastic .get_active_slice_indices .return_value = [0 , 1 ]
147179 device0 = FakeDevice (slice_index = 0 )
148180 device1 = FakeDevice (slice_index = 1 )
149181 self .fake_jax .devices .return_value = [device0 , device1 ]
@@ -168,6 +200,8 @@ def test_live_devices_disabled(self):
168200 def test_elastic_retry_disabled (self ):
169201 """Tests elastic_retry when disabled but pathways is used."""
170202 self .fake_pathwaysutils .is_pathways_backend_used .return_value = True
203+ self .fake_pathwaysutils .elastic = Mock ()
204+ self .fake_pathwaysutils .elastic .get_active_slice_indices .return_value = [0 , 1 ]
171205 config = FakeConfig ()
172206 config .elastic_enabled = False
173207 msg = (
@@ -319,28 +353,32 @@ def test_record_elastic_event_start(self):
319353 """Tests recording an elastic slice down start."""
320354 elastic_utils .elastic_manager = self .fake_manager
321355 self .fake_manager .new_slice_event .is_set .return_value = False
356+ self .fake_manager .slice_to_devices = {0 : [FakeDevice ()], 1 : [FakeDevice ()]}
322357 fake_recorder = Mock ()
323358 config = FakeConfig ()
324359
325360 elastic_utils .record_elastic_event_start (fake_recorder , config )
326361
327- fake_recorder .record_custom_badput_event_start_time .assert_called_once_with (
328- custom_badput_event_type = "elastic_slice_down"
362+ fake_recorder .record_elastic_wait_start_time .assert_called_once_with (
363+ event_type = "elastic_slice_down"
329364 )
330- self .assertEqual (elastic_utils .pending_elastic_event_type , "elastic_slice_down" )
365+ fake_recorder .record_elastic_slice_counts .assert_called_once ()
366+ self .assertEqual (elastic_utils .pending_elastic_event_type , 'elastic_slice_down' )
331367
332368 def test_record_elastic_event_start_scale_up (self ):
333369 """Tests recording an elastic slice scale up start."""
334370 elastic_utils .elastic_manager = self .fake_manager
335371 self .fake_manager .new_slice_event .is_set .return_value = True
372+ self .fake_manager .slice_to_devices = {0 : [FakeDevice ()], 1 : [FakeDevice ()]}
336373 fake_recorder = Mock ()
337374 config = FakeConfig ()
338375
339376 elastic_utils .record_elastic_event_start (fake_recorder , config )
340377
341- fake_recorder .record_custom_badput_event_start_time .assert_called_once_with (
342- custom_badput_event_type = "elastic_scale_up"
378+ fake_recorder .record_elastic_wait_start_time .assert_called_once_with (
379+ event_type = "elastic_scale_up"
343380 )
381+ fake_recorder .record_elastic_slice_counts .assert_called_once ()
344382
345383 def test_record_elastic_wait_end_and_reinit_start_noop_on_first_attempt (self ):
346384 """Tests recording elastic event end and elastic reinit start."""
@@ -349,36 +387,41 @@ def test_record_elastic_wait_end_and_reinit_start_noop_on_first_attempt(self):
349387
350388 elastic_utils .record_elastic_wait_end_and_reinit_start (fake_recorder )
351389
352- fake_recorder .record_custom_badput_event_end_time .assert_not_called ()
353- fake_recorder .record_custom_badput_event_start_time .assert_not_called ()
390+ fake_recorder .record_elastic_wait_end_time .assert_not_called ()
391+ fake_recorder .record_elastic_reinit_start_time .assert_not_called ()
354392 self .assertIsNone (elastic_utils .pending_reinit_recorder )
355393
356394 def test_record_elastic_wait_end_and_reinit_start (self ):
357395 """Test recording end of slice down and start of reinit."""
396+ elastic_utils .pending_elastic_event_type = 'elastic_slice_down'
397+ elastic_utils .elastic_manager = self .fake_manager
398+ self .fake_manager .active_slice_indices = {0 }
399+ self .fake_manager .slice_to_devices = {0 : [FakeDevice ()], 1 : [FakeDevice ()]}
358400 elastic_utils .pending_elastic_event_type = "elastic_slice_down"
359401 fake_recorder = Mock ()
360402
361403 elastic_utils .record_elastic_wait_end_and_reinit_start (fake_recorder )
362404
363- fake_recorder .record_custom_badput_event_end_time .assert_called_once_with (
364- custom_badput_event_type = "elastic_slice_down"
365- )
366- fake_recorder .record_custom_badput_event_start_time .assert_called_once_with (
367- custom_badput_event_type = "elastic_reinitialization"
405+ fake_recorder .record_elastic_wait_end_time .assert_called_once_with (
406+ event_type = "elastic_slice_down"
368407 )
408+ fake_recorder .record_elastic_reinit_start_time .assert_called_once ()
409+ fake_recorder .record_elastic_slice_counts .assert_called_once ()
369410 self .assertIs (elastic_utils .pending_reinit_recorder , fake_recorder )
370411 self .assertIsNone (elastic_utils .pending_elastic_event_type )
371412
372413 def test_record_elastic_reinit_end (self ):
373414 """Tests recording end of elastic reinit."""
374415 fake_recorder = Mock ()
375416 elastic_utils .pending_reinit_recorder = fake_recorder
417+ elastic_utils .elastic_manager = self .fake_manager
418+ self .fake_manager .active_slice_indices = {0 }
419+ self .fake_manager .slice_to_devices = {0 : [FakeDevice ()], 1 : [FakeDevice ()]}
376420
377421 elastic_utils .record_elastic_reinit_end ()
378422
379- fake_recorder .record_custom_badput_event_end_time .assert_called_once_with (
380- custom_badput_event_type = "elastic_reinitialization"
381- )
423+ fake_recorder .record_elastic_reinit_end_time .assert_called_once ()
424+ fake_recorder .record_elastic_slice_counts .assert_called_once ()
382425 self .assertIsNone (elastic_utils .pending_reinit_recorder )
383426
384427 def test_record_elastic_reinit_end_on_cold_start (self ):
@@ -401,6 +444,8 @@ def __setattr__(self, name, value):
401444
402445 config = ReadOnlyConfig ()
403446 self .fake_pathwaysutils .is_pathways_backend_used .return_value = True
447+ self .fake_pathwaysutils .elastic = Mock ()
448+ self .fake_pathwaysutils .elastic .get_active_slice_indices .return_value = [0 , 1 ]
404449
405450 # Should not raise ValueError
406451 elastic_utils .ensure_elastic_manager_initialized (config )
0 commit comments