@@ -70,6 +70,12 @@ 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 ]
75+ self .fake_pathwaysutils .elastic .get_slice_to_devices .return_value = {
76+ 0 : [FakeDevice ()],
77+ 1 : [FakeDevice ()],
78+ }
7379 self .fake_jax .process_index .return_value = 0
7480
7581 # Inject fakes into elastic_utils namespace
@@ -97,9 +103,28 @@ def tearDown(self):
97103 elastic_utils .pending_elastic_event_type = None
98104 super ().tearDown ()
99105
106+ def test_record_slice_state (self ):
107+ elastic_utils .elastic_manager = self .fake_manager
108+ self .fake_manager .active_slice_indices = {0 }
109+ self .fake_manager .slice_to_devices = {0 : [FakeDevice ()], 1 : [FakeDevice ()]}
110+ self .fake_pathwaysutils .elastic .get_active_slice_indices .return_value = {0 , 1 }
111+
112+ fake_recorder = Mock ()
113+ fake_recorder .record_elastic_slice_counts = Mock ()
114+
115+ elastic_utils .record_slice_state (fake_recorder )
116+
117+ fake_recorder .record_elastic_slice_counts .assert_called_once_with (available_slices = 2 , active_slices = 1 , total_slices = 2 )
118+
119+ fake_recorder .record_elastic_slice_counts .reset_mock ()
120+ elastic_utils .record_slice_state (fake_recorder , active_slices_override = 0 )
121+ fake_recorder .record_elastic_slice_counts .assert_called_once_with (available_slices = 2 , active_slices = 0 , total_slices = 2 )
122+
100123 def test_elastic_enabled (self ):
101124 config = FakeConfig ()
102125 self .fake_pathwaysutils .is_pathways_backend_used .return_value = True
126+ self .fake_pathwaysutils .elastic = Mock ()
127+ self .fake_pathwaysutils .elastic .get_active_slice_indices .return_value = [0 , 1 ]
103128 config .elastic_enabled = True
104129 self .assertTrue (elastic_utils .elastic_enabled (config ))
105130
@@ -144,6 +169,8 @@ def test_live_devices_no_pathways(self):
144169 def test_live_devices_pathways (self ):
145170 """Tests live_devices when pathways is used."""
146171 self .fake_pathwaysutils .is_pathways_backend_used .return_value = True
172+ self .fake_pathwaysutils .elastic = Mock ()
173+ self .fake_pathwaysutils .elastic .get_active_slice_indices .return_value = [0 , 1 ]
147174 device0 = FakeDevice (slice_index = 0 )
148175 device1 = FakeDevice (slice_index = 1 )
149176 self .fake_jax .devices .return_value = [device0 , device1 ]
@@ -168,6 +195,8 @@ def test_live_devices_disabled(self):
168195 def test_elastic_retry_disabled (self ):
169196 """Tests elastic_retry when disabled but pathways is used."""
170197 self .fake_pathwaysutils .is_pathways_backend_used .return_value = True
198+ self .fake_pathwaysutils .elastic = Mock ()
199+ self .fake_pathwaysutils .elastic .get_active_slice_indices .return_value = [0 , 1 ]
171200 config = FakeConfig ()
172201 config .elastic_enabled = False
173202 msg = (
@@ -319,28 +348,28 @@ def test_record_elastic_event_start(self):
319348 """Tests recording an elastic slice down start."""
320349 elastic_utils .elastic_manager = self .fake_manager
321350 self .fake_manager .new_slice_event .is_set .return_value = False
351+ self .fake_manager .slice_to_devices = {0 : [FakeDevice ()], 1 : [FakeDevice ()]}
322352 fake_recorder = Mock ()
323353 config = FakeConfig ()
324354
325355 elastic_utils .record_elastic_event_start (fake_recorder , config )
326356
327- fake_recorder .record_custom_badput_event_start_time .assert_called_once_with (
328- custom_badput_event_type = "elastic_slice_down"
329- )
357+ fake_recorder .record_elastic_wait_start_time .assert_called_once_with (event_type = "elastic_slice_down" )
358+ fake_recorder .record_elastic_slice_counts .assert_called_once ()
330359 self .assertEqual (elastic_utils .pending_elastic_event_type , "elastic_slice_down" )
331360
332361 def test_record_elastic_event_start_scale_up (self ):
333362 """Tests recording an elastic slice scale up start."""
334363 elastic_utils .elastic_manager = self .fake_manager
335364 self .fake_manager .new_slice_event .is_set .return_value = True
365+ self .fake_manager .slice_to_devices = {0 : [FakeDevice ()], 1 : [FakeDevice ()]}
336366 fake_recorder = Mock ()
337367 config = FakeConfig ()
338368
339369 elastic_utils .record_elastic_event_start (fake_recorder , config )
340370
341- fake_recorder .record_custom_badput_event_start_time .assert_called_once_with (
342- custom_badput_event_type = "elastic_scale_up"
343- )
371+ fake_recorder .record_elastic_wait_start_time .assert_called_once_with (event_type = "elastic_scale_up" )
372+ fake_recorder .record_elastic_slice_counts .assert_called_once ()
344373
345374 def test_record_elastic_wait_end_and_reinit_start_noop_on_first_attempt (self ):
346375 """Tests recording elastic event end and elastic reinit start."""
@@ -349,36 +378,39 @@ def test_record_elastic_wait_end_and_reinit_start_noop_on_first_attempt(self):
349378
350379 elastic_utils .record_elastic_wait_end_and_reinit_start (fake_recorder )
351380
352- fake_recorder .record_custom_badput_event_end_time .assert_not_called ()
353- fake_recorder .record_custom_badput_event_start_time .assert_not_called ()
381+ fake_recorder .record_elastic_wait_end_time .assert_not_called ()
382+ fake_recorder .record_elastic_reinit_start_time .assert_not_called ()
354383 self .assertIsNone (elastic_utils .pending_reinit_recorder )
355384
356385 def test_record_elastic_wait_end_and_reinit_start (self ):
357386 """Test recording end of slice down and start of reinit."""
358387 elastic_utils .pending_elastic_event_type = "elastic_slice_down"
388+ elastic_utils .elastic_manager = self .fake_manager
389+ self .fake_manager .active_slice_indices = {0 }
390+ self .fake_manager .slice_to_devices = {0 : [FakeDevice ()], 1 : [FakeDevice ()]}
391+ elastic_utils .pending_elastic_event_type = "elastic_slice_down"
359392 fake_recorder = Mock ()
360393
361394 elastic_utils .record_elastic_wait_end_and_reinit_start (fake_recorder )
362395
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"
368- )
396+ fake_recorder .record_elastic_wait_end_time .assert_called_once_with (event_type = "elastic_slice_down" )
397+ fake_recorder .record_elastic_reinit_start_time .assert_called_once ()
398+ fake_recorder .record_elastic_slice_counts .assert_called_once ()
369399 self .assertIs (elastic_utils .pending_reinit_recorder , fake_recorder )
370400 self .assertIsNone (elastic_utils .pending_elastic_event_type )
371401
372402 def test_record_elastic_reinit_end (self ):
373403 """Tests recording end of elastic reinit."""
374404 fake_recorder = Mock ()
375405 elastic_utils .pending_reinit_recorder = fake_recorder
406+ elastic_utils .elastic_manager = self .fake_manager
407+ self .fake_manager .active_slice_indices = {0 }
408+ self .fake_manager .slice_to_devices = {0 : [FakeDevice ()], 1 : [FakeDevice ()]}
376409
377410 elastic_utils .record_elastic_reinit_end ()
378411
379- fake_recorder .record_custom_badput_event_end_time .assert_called_once_with (
380- custom_badput_event_type = "elastic_reinitialization"
381- )
412+ fake_recorder .record_elastic_reinit_end_time .assert_called_once ()
413+ fake_recorder .record_elastic_slice_counts .assert_called_once ()
382414 self .assertIsNone (elastic_utils .pending_reinit_recorder )
383415
384416 def test_record_elastic_reinit_end_on_cold_start (self ):
@@ -401,6 +433,8 @@ def __setattr__(self, name, value):
401433
402434 config = ReadOnlyConfig ()
403435 self .fake_pathwaysutils .is_pathways_backend_used .return_value = True
436+ self .fake_pathwaysutils .elastic = Mock ()
437+ self .fake_pathwaysutils .elastic .get_active_slice_indices .return_value = [0 , 1 ]
404438
405439 # Should not raise ValueError
406440 elastic_utils .ensure_elastic_manager_initialized (config )
0 commit comments