Skip to content

Commit 6c1bca1

Browse files
committed
fix
Signed-off-by: 0oshowero0 <o0shower0o@outlook.com>
1 parent c684007 commit 6c1bca1

3 files changed

Lines changed: 85 additions & 20 deletions

File tree

tests/test_controller.py

Lines changed: 74 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ def test_controller_with_single_partition(self, ray_setup):
8989
field_names=metadata.field_names,
9090
dtypes=dtypes,
9191
shapes=shapes,
92+
custom_meta=None,
9293
)
9394
)
9495
assert success
@@ -97,13 +98,18 @@ def test_controller_with_single_partition(self, ray_setup):
9798
assert partition.production_status.size(0) == gbs * num_n_samples
9899

99100
# Test for get production status
100-
production_status = ray.get(
101+
global_index, production_status = ray.get(
101102
tq_controller.get_production_status.remote(
102103
partition_id=partition_id,
103104
data_fields=data_fields,
104105
)
105106
)
106-
assert production_status
107+
# Verify global_index contains all expected indexes
108+
assert torch.equal(global_index, torch.tensor(range(gbs * num_n_samples), dtype=torch.long))
109+
# Verify all samples are produced for all fields (status should be 1)
110+
expected_production_status = torch.ones(gbs * num_n_samples, len(metadata.field_names), dtype=torch.int8)
111+
assert torch.equal(production_status, expected_production_status)
112+
print("✓ Get production status returns correct global_index and production_status")
107113

108114
# Total fields should match the number of fields we added
109115
assert partition.total_fields_num == len(data_fields)
@@ -126,14 +132,19 @@ def test_controller_with_single_partition(self, ray_setup):
126132

127133
print(f"✓ Updated production status for partition {partition_id}")
128134

129-
# Test for get consumption status
130-
consumption_status = ray.get(
135+
# Test for get consumption status BEFORE consumption
136+
global_index, consumption_status = ray.get(
131137
tq_controller.get_consumption_status.remote(
132138
partition_id=partition_id,
133139
task_name="generate_sequences",
134140
)
135141
)
136-
assert torch.equal(consumption_status, torch.zeros(gbs * num_n_samples))
142+
# Verify global_index
143+
assert torch.equal(global_index, torch.tensor(range(gbs * num_n_samples), dtype=torch.long))
144+
# Verify all samples are NOT consumed yet (status should be 0)
145+
expected_consumption_status_before = torch.zeros(gbs * num_n_samples, dtype=torch.int8)
146+
assert torch.equal(consumption_status, expected_consumption_status_before)
147+
print("✓ Get consumption status returns correct global_index and status (before consumption)")
137148

138149
# Test get metadate in fetch mode
139150
gen_meta = ray.get(
@@ -153,14 +164,19 @@ def test_controller_with_single_partition(self, ray_setup):
153164
assert torch.equal(partition.consumption_status["generate_sequences"], torch.ones(gbs * num_n_samples))
154165
print("✓ Get metadata in fetch mode correct")
155166

156-
# Test for get consumption status
157-
consumption_status = ray.get(
167+
# Test for get consumption status AFTER consumption
168+
global_index, consumption_status = ray.get(
158169
tq_controller.get_consumption_status.remote(
159170
partition_id=partition_id,
160171
task_name="generate_sequences",
161172
)
162173
)
163-
assert torch.equal(consumption_status, torch.ones(gbs * num_n_samples))
174+
# Verify global_index
175+
assert torch.equal(global_index, torch.tensor(range(gbs * num_n_samples), dtype=torch.long))
176+
# Verify all samples are consumed (status should be 1)
177+
expected_consumption_status_after = torch.ones(gbs * num_n_samples, dtype=torch.int8)
178+
assert torch.equal(consumption_status, expected_consumption_status_after)
179+
print("✓ Get consumption status returns correct global_index and status (after consumption)")
164180

165181
# Test get clear meta
166182
clear_meta = ray.get(
@@ -222,6 +238,19 @@ def test_controller_with_multi_partitions(self, ray_setup):
222238
)
223239
assert success
224240

241+
# Verify get production status returns correct data
242+
global_index_1, production_status_1 = ray.get(
243+
tq_controller.get_production_status.remote(
244+
partition_id=partition_id_1,
245+
data_fields=data_fields,
246+
)
247+
)
248+
expected_global_index_1 = torch.tensor(range(gbs_1 * num_n_samples_1), dtype=torch.long)
249+
assert torch.equal(global_index_1, expected_global_index_1)
250+
expected_production_status_1 = torch.ones(gbs_1 * num_n_samples_1, len(data_fields), dtype=torch.int8)
251+
assert torch.equal(production_status_1, expected_production_status_1)
252+
print("✓ Get production status for partition_1 returns correct global_index and status")
253+
225254
# Test get metadate in fetch mode
226255
gen_meta = ray.get(
227256
tq_controller.get_metadata.remote(
@@ -234,6 +263,18 @@ def test_controller_with_multi_partitions(self, ray_setup):
234263
)
235264
assert gen_meta
236265

266+
# Verify get consumption status after fetch (samples should be consumed)
267+
global_index_1_consumed, consumption_status_1 = ray.get(
268+
tq_controller.get_consumption_status.remote(
269+
partition_id=partition_id_1,
270+
task_name="generate_sequences",
271+
)
272+
)
273+
assert torch.equal(global_index_1_consumed, expected_global_index_1)
274+
expected_consumption_status_1 = torch.ones(gbs_1 * num_n_samples_1, dtype=torch.int8)
275+
assert torch.equal(consumption_status_1, expected_consumption_status_1)
276+
print("✓ Get consumption status for partition_1 returns correct global_index and status (after fetch)")
277+
237278
# Test get clear meta
238279
clear_meta = ray.get(
239280
tq_controller.get_metadata.remote(
@@ -282,6 +323,31 @@ def test_controller_with_multi_partitions(self, ray_setup):
282323
)
283324
assert success
284325

326+
# Verify get production status for partition_2
327+
global_index_2, production_status_2 = ray.get(
328+
tq_controller.get_production_status.remote(
329+
partition_id=partition_id_2,
330+
data_fields=data_fields,
331+
)
332+
)
333+
expected_global_index_2 = torch.tensor(range(part1_index_range, part2_index_range + part1_index_range), dtype=torch.long)
334+
assert torch.equal(global_index_2, expected_global_index_2)
335+
expected_production_status_2 = torch.ones(part2_index_range, len(data_fields), dtype=torch.int8)
336+
assert torch.equal(production_status_2, expected_production_status_2)
337+
print("✓ Get production status for partition_2 returns correct global_index and status")
338+
339+
# Verify get consumption status for partition_2 (before consumption - should be all zeros)
340+
global_index_2_consumed, consumption_status_2 = ray.get(
341+
tq_controller.get_consumption_status.remote(
342+
partition_id=partition_id_2,
343+
task_name="generate_sequences",
344+
)
345+
)
346+
assert torch.equal(global_index_2_consumed, expected_global_index_2)
347+
expected_consumption_status_2 = torch.zeros(part2_index_range, dtype=torch.int8)
348+
assert torch.equal(consumption_status_2, expected_consumption_status_2)
349+
print("✓ Get consumption status for partition_2 returns correct global_index and status (before consumption)")
350+
285351
# Clear partition 1
286352
partition_index_range_1 = ray.get(tq_controller.get_partition_index_range.remote(partition_id_1))
287353
assert partition_index_range_1

tests/test_controller_data_partitions.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ def test_data_partition_status():
8686
print("✓ Field metadata retrieval works")
8787

8888
# Test consumption status
89-
consumption_tensor = partition.get_consumption_status("test_task")
89+
global_index, consumption_tensor = partition.get_consumption_status("test_task", )
9090
assert consumption_tensor is not None
9191
assert consumption_tensor.shape[0] == partition.total_samples_num
9292

@@ -240,7 +240,7 @@ def test_data_partition_status_advanced():
240240

241241
# Initial consumption tracking
242242
partition.mark_consumed(task_name, [0, 1])
243-
initial_consumption = partition.get_consumption_status(task_name)
243+
global_index, initial_consumption = partition.get_consumption_status(task_name)
244244
assert initial_consumption[0] == 1
245245
assert initial_consumption[1] == 1
246246

@@ -258,7 +258,7 @@ def test_data_partition_status_advanced():
258258
12: {"field_d": (32,)},
259259
}
260260
partition.update_production_status([10, 11, 12], ["field_d"], dtypes, shapes, None) # Triggers sample expansion
261-
expanded_consumption = partition.get_consumption_status(task_name)
261+
global_index, expanded_consumption = partition.get_consumption_status(task_name)
262262
assert expanded_consumption[0] == 1 # Preserved
263263
assert expanded_consumption[1] == 1 # Preserved
264264
assert expanded_consumption.shape[0] >= 13 # Expanded to accommodate new samples
@@ -358,7 +358,7 @@ def test_edge_cases_and_error_handling():
358358
# Test 3: Consumption status edge cases
359359
# Test consumption status creation before production status
360360
task_name = "early_task"
361-
consumption_tensor = partition.get_consumption_status(task_name)
361+
_, consumption_tensor = partition.get_consumption_status(task_name)
362362
assert consumption_tensor is not None
363363
assert consumption_tensor.shape[0] == partition.allocated_samples_num
364364

transfer_queue/controller.py

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -367,7 +367,7 @@ def update_production_status(
367367
# Update production status
368368
if self.production_status is not None and global_indices and field_names:
369369
field_indices = [self.field_name_mapping.get(field) for field in field_names]
370-
self.production_status[Tensor(global_indices)[:, None], Tensor(field_indices)] = 1
370+
self.production_status[torch.tensor(global_indices)[:, None], torch.tensor(field_indices)] = 1
371371

372372
# Update field metadata
373373
self._update_field_metadata(global_indices, dtypes, shapes, custom_meta)
@@ -487,12 +487,12 @@ def get_consumption_status(self, task_name: str, mask:bool=False) -> tuple[Tenso
487487
else:
488488
self.consumption_status[task_name] = torch.zeros(0, dtype=torch.int8)
489489

490+
# Get consumption status for requested task
490491
consumption_status = self.consumption_status[task_name]
491492

493+
partition_global_index = torch.tensor(sorted(self.global_indexes), dtype=torch.long)
494+
492495
if mask:
493-
# Get mask for target partition
494-
partition_global_index = Tensor(sorted(self.global_indexes), dtype=torch.long)
495-
# Get consumption status for requested task
496496
consumption_status = consumption_status[partition_global_index]
497497

498498
return partition_global_index, consumption_status
@@ -527,10 +527,9 @@ def get_production_status_for_fields(self, field_names: list[str], mask:bool=Fal
527527

528528
production_status = self.production_status[:, col_mask]
529529

530+
partition_global_index = torch.tensor(sorted(self.global_indexes), dtype=torch.long)
531+
530532
if mask:
531-
# Get mask for target partition
532-
partition_global_index = Tensor(sorted(self.global_indexes), dtype=torch.long)
533-
# Get production status for requested fields
534533
production_status = production_status[partition_global_index]
535534

536535
return partition_global_index, production_status
@@ -561,7 +560,7 @@ def scan_data_status(self, field_names: list[str], task_name: str) -> list[int]:
561560
row_mask = torch.ones(self.allocated_samples_num, dtype=torch.bool)
562561

563562
# Apply consumption filter (exclude already consumed samples)
564-
consumption_status = self.get_consumption_status(task_name, mask=False)
563+
_, consumption_status = self.get_consumption_status(task_name, mask=False)
565564
if consumption_status is not None:
566565
unconsumed_mask = consumption_status == 0
567566
row_mask &= unconsumed_mask

0 commit comments

Comments
 (0)