Skip to content

Commit 6882f67

Browse files
committed
can ignore duplicates in OrderedTaskPreparation
1 parent d9c2f1c commit 6882f67

File tree

2 files changed

+28
-11
lines changed

2 files changed

+28
-11
lines changed

tests/trinity/utils/test_ordered_task_preparation.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,21 @@ async def test_no_prereq_tasks():
202202
assert finished == (2, 3)
203203

204204

205+
@pytest.mark.asyncio
206+
async def test_ignore_duplicates():
207+
ti = OrderedTaskPreparation(NoPrerequisites, identity, lambda x: x - 1)
208+
ti.set_finished_dependency(1)
209+
ti.register_tasks((2, ))
210+
# this will ignore the 2 task:
211+
ti.register_tasks((2, 3), ignore_duplicates=True)
212+
# this will be completely ignored:
213+
ti.register_tasks((2, 3), ignore_duplicates=True)
214+
215+
# with no prerequisites, tasks are *immediately* finished, as long as they are in order
216+
finished = await wait(ti.ready_tasks())
217+
assert finished == (2, 3)
218+
219+
205220
@pytest.mark.asyncio
206221
async def test_register_out_of_order():
207222
ti = OrderedTaskPreparation(OnePrereq, identity, lambda x: x - 1, accept_dangling_tasks=True)

trinity/utils/datastructures.py

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -503,7 +503,7 @@ def set_finished_dependency(self, finished_task: TTask) -> None:
503503
self._declared_finished.add(task_id)
504504
# note that this task is intentionally *not* added to self._unready
505505

506-
def register_tasks(self, tasks: Tuple[TTask, ...]) -> None:
506+
def register_tasks(self, tasks: Tuple[TTask, ...], ignore_duplicates: bool = False) -> None:
507507
"""
508508
Initiate a task into tracking. By default, each task must be registered
509509
*after* its dependency has been registered.
@@ -512,23 +512,25 @@ def register_tasks(self, tasks: Tuple[TTask, ...]) -> None:
512512
initialize this intance with: ``accept_dangling_tasks=True``.
513513
514514
:param tasks: the tasks to register, in iteration order
515+
:param ignore_duplicates: any tasks that have already been registered will be ignored,
516+
whether ready or not
515517
"""
516-
task_meta_info = tuple(
517-
(self._prereq_tracker(task), self._id_of(task), self._dependency_of(task))
518-
for task in tasks
519-
)
520-
521-
duplicates = tuple(
522-
tracker.task for tracker, task_id, _ in task_meta_info
523-
if task_id in self._tasks
524-
)
518+
identified_tasks = tuple((self._id_of(task), task) for task in tasks)
519+
duplicates = tuple(task for task_id, task in identified_tasks if task_id in self._tasks)
525520

526-
if duplicates:
521+
if duplicates and not ignore_duplicates:
527522
raise DuplicateTasks(
528523
f"Cannot re-register tasks: {duplicates!r} for completion",
529524
duplicates,
530525
)
531526

527+
task_meta_info = tuple(
528+
(self._prereq_tracker(task), task_id, self._dependency_of(task))
529+
for task_id, task in identified_tasks
530+
# when ignoring duplicates, must not try to re-add them
531+
if task_id not in self._tasks
532+
)
533+
532534
for prereq_tracker, task_id, dependency_id in task_meta_info:
533535
if not self._accept_dangling_tasks and dependency_id not in self._tasks:
534536
raise MissingDependency(

0 commit comments

Comments
 (0)