From: "Zac Medico" <zmedico@gentoo.org>
To: gentoo-commits@lists.gentoo.org
Subject: [gentoo-commits] proj/portage:master commit in: lib/_emerge/
Date: Thu, 5 Mar 2020 08:26:07 +0000 (UTC) [thread overview]
Message-ID: <1583395579.d389b3b378d88b8c41dfaba2a90bc9643a9ba99e.zmedico@gentoo> (raw)
commit: d389b3b378d88b8c41dfaba2a90bc9643a9ba99e
Author: Zac Medico <zmedico <AT> gentoo <DOT> org>
AuthorDate: Thu Mar 5 06:46:26 2020 +0000
Commit: Zac Medico <zmedico <AT> gentoo <DOT> org>
CommitDate: Thu Mar 5 08:06:19 2020 +0000
URL: https://gitweb.gentoo.org/proj/portage.git/commit/?id=d389b3b3
Scheduler: use add_done_callback (bug 711322)
Use add_done_callback instead of addExistListener, in order to avoid
callback races like the SequentialTaskQueue exit listener race that
triggered bug 711322. The addExistListener method is prone to races
because its listeners are executed in quick succession. In contrast,
callbacks scheduled via add_done_callback are placed in a fifo
queue, ensuring that they execute in an order that is unsurprising
relative to other callbacks.
Bug: https://bugs.gentoo.org/711322
Signed-off-by: Zac Medico <zmedico <AT> gentoo.org>
lib/_emerge/Scheduler.py | 36 ++++++++++++++++++++++--------------
1 file changed, 22 insertions(+), 14 deletions(-)
diff --git a/lib/_emerge/Scheduler.py b/lib/_emerge/Scheduler.py
index 98eaf3bcc..98bc789ff 100644
--- a/lib/_emerge/Scheduler.py
+++ b/lib/_emerge/Scheduler.py
@@ -1,9 +1,10 @@
-# Copyright 1999-2019 Gentoo Authors
+# Copyright 1999-2020 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2
from __future__ import division, print_function, unicode_literals
from collections import deque
+import functools
import gc
import gzip
import logging
@@ -1259,11 +1260,13 @@ class Scheduler(PollScheduler):
child not in completed_tasks:
unsatisfied.add(child)
- def _merge_wait_exit_handler(self, task):
+ def _merge_wait_exit_handler(self, task, future):
+ future.cancelled() or future.result()
self._merge_wait_scheduled.remove(task)
- self._merge_exit(task)
+ self._merge_exit(task, future)
- def _merge_exit(self, merge):
+ def _merge_exit(self, merge, future):
+ future.cancelled() or future.result()
self._running_tasks.pop(id(merge), None)
self._do_merge_exit(merge)
self._deallocate_config(merge.merge.settings)
@@ -1327,7 +1330,8 @@ class Scheduler(PollScheduler):
del mtimedb["resume"]
mtimedb.commit()
- def _build_exit(self, build):
+ def _build_exit(self, build, future):
+ future.cancelled() or future.result()
self._running_tasks.pop(id(build), None)
if build.returncode == os.EX_OK and self._terminated_tasks:
# We've been interrupted, so we won't
@@ -1336,7 +1340,7 @@ class Scheduler(PollScheduler):
self._deallocate_config(build.settings)
elif build.returncode == os.EX_OK:
self.curval += 1
- merge = PackageMerge(merge=build)
+ merge = PackageMerge(merge=build, scheduler=self._sched_iface)
self._running_tasks[id(merge)] = merge
if not build.build_opts.buildpkgonly and \
build.pkg in self._deep_system_deps:
@@ -1345,8 +1349,8 @@ class Scheduler(PollScheduler):
self._merge_wait_queue.append(merge)
merge.addStartListener(self._system_merge_started)
else:
- merge.addExitListener(self._merge_exit)
self._task_queues.merge.add(merge)
+ merge.async_wait().add_done_callback(functools.partial(self._merge_exit, merge))
self._status_display.merges = len(self._task_queues.merge)
else:
settings = build.settings
@@ -1365,8 +1369,9 @@ class Scheduler(PollScheduler):
self._status_display.running = self._jobs
self._schedule()
- def _extract_exit(self, build):
- self._build_exit(build)
+ def _extract_exit(self, build, future):
+ future.cancelled() or future.result()
+ self._build_exit(build, future)
def _task_complete(self, pkg):
self._completed_tasks.add(pkg)
@@ -1580,9 +1585,10 @@ class Scheduler(PollScheduler):
if (self._merge_wait_queue and not self._jobs and
not self._task_queues.merge):
task = self._merge_wait_queue.popleft()
- task.addExitListener(self._merge_wait_exit_handler)
+ task.scheduler = self._sched_iface
self._merge_wait_scheduled.append(task)
self._task_queues.merge.add(task)
+ task.async_wait().add_done_callback(functools.partial(self._merge_wait_exit_handler, task))
self._status_display.merges = len(self._task_queues.merge)
state_change += 1
@@ -1699,26 +1705,28 @@ class Scheduler(PollScheduler):
task = self._task(pkg)
if pkg.installed:
- merge = PackageMerge(merge=task)
+ merge = PackageMerge(merge=task, scheduler=self._sched_iface)
self._running_tasks[id(merge)] = merge
- merge.addExitListener(self._merge_exit)
self._task_queues.merge.addFront(merge)
+ merge.async_wait().add_done_callback(functools.partial(self._merge_exit, merge))
elif pkg.built:
self._jobs += 1
self._previous_job_start_time = time.time()
self._status_display.running = self._jobs
self._running_tasks[id(task)] = task
- task.addExitListener(self._extract_exit)
+ task.scheduler = self._sched_iface
self._task_queues.jobs.add(task)
+ task.async_wait().add_done_callback(functools.partial(self._extract_exit, task))
else:
self._jobs += 1
self._previous_job_start_time = time.time()
self._status_display.running = self._jobs
self._running_tasks[id(task)] = task
- task.addExitListener(self._build_exit)
+ task.scheduler = self._sched_iface
self._task_queues.jobs.add(task)
+ task.async_wait().add_done_callback(functools.partial(self._build_exit, task))
return bool(state_change)
next reply other threads:[~2020-03-05 8:26 UTC|newest]
Thread overview: 167+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-03-05 8:26 Zac Medico [this message]
-- strict thread matches above, loose matches on Subject: below --
2025-01-16 21:04 [gentoo-commits] proj/portage:master commit in: lib/_emerge/ Sam James
2024-09-29 22:52 Zac Medico
2024-09-11 1:39 Sam James
2024-09-11 1:39 Sam James
2024-08-14 16:05 Zac Medico
2024-08-14 15:17 Zac Medico
2024-08-02 13:38 James Le Cuirot
2024-05-26 23:28 Sam James
2024-05-26 23:28 Sam James
2024-05-26 23:28 Sam James
2024-05-26 18:02 Zac Medico
2024-05-21 16:08 Zac Medico
2024-05-13 5:43 Sam James
2024-05-04 12:05 Sam James
2024-03-28 14:48 Zac Medico
2024-03-09 23:31 Zac Medico
2024-02-24 20:03 Zac Medico
2024-02-21 16:00 Zac Medico
2024-02-21 16:00 Zac Medico
2024-02-21 16:00 Zac Medico
2024-01-17 12:53 Zac Medico
2024-01-04 16:00 Zac Medico
2024-01-03 19:59 Sam James
2023-12-30 21:45 Zac Medico
2023-12-27 13:30 Sam James
2023-12-26 22:03 Zac Medico
2023-12-19 4:15 Zac Medico
2023-12-10 22:29 Sam James
2023-12-04 6:45 Sam James
2023-11-29 20:05 Zac Medico
2023-11-29 19:56 Zac Medico
2023-11-29 0:33 Zac Medico
2023-11-28 22:51 Zac Medico
2023-11-25 6:33 Zac Medico
2023-11-14 4:24 Zac Medico
2023-11-11 7:23 Sam James
2023-11-10 16:04 Zac Medico
2023-11-06 15:58 Sam James
2023-10-22 22:51 Zac Medico
2023-10-22 22:09 Sam James
2023-10-22 4:38 Zac Medico
2023-10-14 20:01 Zac Medico
2023-10-05 4:45 Zac Medico
2023-09-21 15:47 Sam James
2023-09-21 15:47 Sam James
2023-09-15 10:36 Sam James
2023-09-15 10:36 Sam James
2023-07-11 5:02 Sam James
2023-06-29 8:19 Sam James
2023-06-29 8:19 Sam James
2023-06-29 8:19 Sam James
2023-06-14 5:06 Sam James
2023-06-14 5:03 Sam James
2023-06-14 1:44 Sam James
2023-05-23 2:59 Sam James
2023-02-18 0:00 Sam James
2023-02-17 1:23 Sam James
2023-01-10 15:12 Sam James
2022-11-28 15:32 Zac Medico
2022-11-28 15:32 Zac Medico
2022-09-25 19:12 Mike Gilbert
2022-09-25 1:36 Sam James
2022-09-20 3:39 Sam James
2022-09-18 18:35 Mike Gilbert
2022-08-13 17:56 Sam James
2022-06-17 17:05 Mike Gilbert
2022-06-07 23:48 Mike Gilbert
2022-04-22 23:08 Mike Gilbert
2022-03-27 23:07 Sam James
2022-03-06 19:25 Zac Medico
2022-02-14 21:51 Sam James
2021-12-04 4:56 Michał Górny
2021-10-28 4:52 Sam James
2021-10-28 4:07 Sam James
2021-09-21 5:51 Zac Medico
2021-09-21 5:51 Zac Medico
2021-06-13 22:41 Zac Medico
2021-05-24 6:33 Zac Medico
2021-05-24 6:33 Zac Medico
2021-05-24 6:33 Zac Medico
2021-05-16 22:29 Zac Medico
2021-05-08 17:54 Zac Medico
2021-05-01 22:47 Zac Medico
2021-05-01 22:47 Zac Medico
2020-12-03 23:20 Zac Medico
2020-09-21 5:54 Zac Medico
2020-08-09 21:48 Zac Medico
2020-08-09 0:15 Zac Medico
2020-08-04 3:11 Zac Medico
2020-08-03 23:28 Zac Medico
2020-08-03 23:28 Zac Medico
2020-08-03 21:42 Zac Medico
2020-08-03 21:42 Zac Medico
2020-08-03 21:42 Zac Medico
2020-08-03 19:30 Zac Medico
2020-08-03 19:30 Zac Medico
2020-08-03 19:30 Zac Medico
2020-08-03 19:30 Zac Medico
2020-08-03 19:30 Zac Medico
2020-08-03 19:30 Zac Medico
2020-08-03 19:30 Zac Medico
2020-07-22 20:42 Zac Medico
2020-07-18 23:54 Zac Medico
2020-06-24 5:41 Zac Medico
2020-06-23 18:00 Zac Medico
2020-04-09 20:48 Zac Medico
2020-04-09 6:48 Zac Medico
2020-04-08 5:56 Zac Medico
2020-04-08 5:56 Zac Medico
2020-04-08 5:56 Zac Medico
2020-04-08 5:56 Zac Medico
2020-04-08 5:56 Zac Medico
2020-04-08 5:56 Zac Medico
2020-04-08 5:56 Zac Medico
2020-04-08 5:56 Zac Medico
2020-04-08 5:56 Zac Medico
2020-04-08 5:56 Zac Medico
2020-04-08 5:56 Zac Medico
2020-04-08 5:56 Zac Medico
2020-03-23 1:51 Zac Medico
2020-03-23 0:42 Zac Medico
2020-03-22 20:56 Zac Medico
2020-03-07 22:18 Zac Medico
2020-03-07 20:14 Zac Medico
2020-03-06 3:36 Zac Medico
2020-03-06 3:04 Zac Medico
2020-03-05 17:39 Zac Medico
2020-03-04 10:28 Zac Medico
2020-03-03 5:47 Zac Medico
2020-03-02 3:54 Zac Medico
2020-03-01 20:31 Zac Medico
2020-03-01 18:36 Zac Medico
2020-03-01 2:17 Zac Medico
2020-03-01 1:47 Zac Medico
2020-03-01 0:57 Zac Medico
2020-02-29 22:49 Zac Medico
2020-02-29 21:48 Zac Medico
2020-02-29 18:52 Zac Medico
2020-02-29 8:39 Zac Medico
2020-02-24 6:07 Zac Medico
2020-02-22 0:06 Zac Medico
2020-02-18 6:45 Zac Medico
2020-02-18 0:21 Zac Medico
2020-02-17 23:14 Zac Medico
2020-02-11 20:49 Zac Medico
2020-02-10 5:11 Zac Medico
2020-02-03 20:34 Zac Medico
2020-02-03 20:30 Zac Medico
2019-12-26 21:22 Zac Medico
2019-12-23 23:34 Zac Medico
2019-11-28 1:43 Zac Medico
2019-11-25 6:38 Zac Medico
2019-11-18 2:56 Zac Medico
2019-11-17 21:04 Zac Medico
2019-11-16 9:23 Zac Medico
2019-10-27 19:33 Zac Medico
2019-10-23 17:03 Zac Medico
2019-09-01 1:09 Zac Medico
2019-08-06 3:14 Zac Medico
2019-07-08 6:49 Zac Medico
2019-04-24 18:54 Zac Medico
2019-04-21 1:02 Zac Medico
2019-01-21 21:59 Zac Medico
2018-11-25 8:25 Zac Medico
2018-10-06 1:03 Zac Medico
2018-08-02 18:45 Zac Medico
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1583395579.d389b3b378d88b8c41dfaba2a90bc9643a9ba99e.zmedico@gentoo \
--to=zmedico@gentoo.org \
--cc=gentoo-commits@lists.gentoo.org \
--cc=gentoo-dev@lists.gentoo.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox