@@ -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,6 +353,7 @@ 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
@@ -327,12 +362,15 @@ def test_record_elastic_event_start(self):
327362 fake_recorder .record_custom_badput_event_start_time .assert_called_once_with (
328363 custom_badput_event_type = "elastic_slice_down"
329364 )
365+ fake_recorder .record_elastic_slice_counts .assert_called_once ()
366+ self .assertEqual (elastic_utils .pending_elastic_event_type , 'elastic_slice_down' )
330367 self .assertEqual (elastic_utils .pending_elastic_event_type , "elastic_slice_down" )
331368
332369 def test_record_elastic_event_start_scale_up (self ):
333370 """Tests recording an elastic slice scale up start."""
334371 elastic_utils .elastic_manager = self .fake_manager
335372 self .fake_manager .new_slice_event .is_set .return_value = True
373+ self .fake_manager .slice_to_devices = {0 : [FakeDevice ()], 1 : [FakeDevice ()]}
336374 fake_recorder = Mock ()
337375 config = FakeConfig ()
338376
@@ -341,6 +379,7 @@ def test_record_elastic_event_start_scale_up(self):
341379 fake_recorder .record_custom_badput_event_start_time .assert_called_once_with (
342380 custom_badput_event_type = "elastic_scale_up"
343381 )
382+ fake_recorder .record_elastic_slice_counts .assert_called_once ()
344383
345384 def test_record_elastic_wait_end_and_reinit_start_noop_on_first_attempt (self ):
346385 """Tests recording elastic event end and elastic reinit start."""
@@ -355,6 +394,10 @@ def test_record_elastic_wait_end_and_reinit_start_noop_on_first_attempt(self):
355394
356395 def test_record_elastic_wait_end_and_reinit_start (self ):
357396 """Test recording end of slice down and start of reinit."""
397+ elastic_utils .pending_elastic_event_type = 'elastic_slice_down'
398+ elastic_utils .elastic_manager = self .fake_manager
399+ self .fake_manager .active_slice_indices = {0 }
400+ self .fake_manager .slice_to_devices = {0 : [FakeDevice ()], 1 : [FakeDevice ()]}
358401 elastic_utils .pending_elastic_event_type = "elastic_slice_down"
359402 fake_recorder = Mock ()
360403
@@ -366,19 +409,24 @@ def test_record_elastic_wait_end_and_reinit_start(self):
366409 fake_recorder .record_custom_badput_event_start_time .assert_called_once_with (
367410 custom_badput_event_type = "elastic_reinitialization"
368411 )
412+ fake_recorder .record_elastic_slice_counts .assert_called_once ()
369413 self .assertIs (elastic_utils .pending_reinit_recorder , fake_recorder )
370414 self .assertIsNone (elastic_utils .pending_elastic_event_type )
371415
372416 def test_record_elastic_reinit_end (self ):
373417 """Tests recording end of elastic reinit."""
374418 fake_recorder = Mock ()
375419 elastic_utils .pending_reinit_recorder = fake_recorder
420+ elastic_utils .elastic_manager = self .fake_manager
421+ self .fake_manager .active_slice_indices = {0 }
422+ self .fake_manager .slice_to_devices = {0 : [FakeDevice ()], 1 : [FakeDevice ()]}
376423
377424 elastic_utils .record_elastic_reinit_end ()
378425
379426 fake_recorder .record_custom_badput_event_end_time .assert_called_once_with (
380427 custom_badput_event_type = "elastic_reinitialization"
381428 )
429+ fake_recorder .record_elastic_slice_counts .assert_called_once ()
382430 self .assertIsNone (elastic_utils .pending_reinit_recorder )
383431
384432 def test_record_elastic_reinit_end_on_cold_start (self ):
@@ -401,6 +449,8 @@ def __setattr__(self, name, value):
401449
402450 config = ReadOnlyConfig ()
403451 self .fake_pathwaysutils .is_pathways_backend_used .return_value = True
452+ self .fake_pathwaysutils .elastic = Mock ()
453+ self .fake_pathwaysutils .elastic .get_active_slice_indices .return_value = [0 , 1 ]
404454
405455 # Should not raise ValueError
406456 elastic_utils .ensure_elastic_manager_initialized (config )
0 commit comments