Gentoo Archives: gentoo-commits

From: Zac Medico <zmedico@g.o>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] proj/portage:master commit in: pym/_emerge/
Date: Sun, 08 May 2011 05:58:59
Message-Id: 8928df70eab1c7863d6ff0639418b6d25eb77c1e.zmedico@gentoo
1 commit: 8928df70eab1c7863d6ff0639418b6d25eb77c1e
2 Author: Zac Medico <zmedico <AT> gentoo <DOT> org>
3 AuthorDate: Sun May 8 05:58:33 2011 +0000
4 Commit: Zac Medico <zmedico <AT> gentoo <DOT> org>
5 CommitDate: Sun May 8 05:58:33 2011 +0000
6 URL: http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=8928df70
7
8 Be careful with system pkgs + parallel-install.
9
10 This should prevent FEATURES=parallel-install from interfering with
11 the fixes from bug #256616 and bug #259954.
12
13 ---
14 pym/_emerge/Scheduler.py | 28 ++++++++++++++++++----------
15 1 files changed, 18 insertions(+), 10 deletions(-)
16
17 diff --git a/pym/_emerge/Scheduler.py b/pym/_emerge/Scheduler.py
18 index 6c21c71..fbf2d2d 100644
19 --- a/pym/_emerge/Scheduler.py
20 +++ b/pym/_emerge/Scheduler.py
21 @@ -3,6 +3,7 @@
22
23 from __future__ import print_function
24
25 +from collections import deque
26 import gc
27 import gzip
28 import logging
29 @@ -176,8 +177,9 @@ class Scheduler(PollScheduler):
30
31 # Holds merges that will wait to be executed when no builds are
32 # executing. This is useful for system packages since dependencies
33 - # on system packages are frequently unspecified.
34 - self._merge_wait_queue = []
35 + # on system packages are frequently unspecified. For example, see
36 + # bug #256616.
37 + self._merge_wait_queue = deque()
38 # Holds merges that have been transfered from the merge_wait_queue to
39 # the actual merge queue. They are removed from this list upon
40 # completion. Other packages can start building only when this list is
41 @@ -1644,14 +1646,19 @@ class Scheduler(PollScheduler):
42
43 while True:
44
45 - # When the number of jobs drops to zero, process all waiting merges.
46 - if not self._jobs and self._merge_wait_queue:
47 - for task in self._merge_wait_queue:
48 - task.addExitListener(self._merge_wait_exit_handler)
49 - self._task_queues.merge.add(task)
50 + # When the number of jobs and merges drops to zero,
51 + # process a single merge from _merge_wait_queue if
52 + # it's not empty. We only process one since these are
53 + # special packages and we want to ensure that
54 + # parallel-install does not cause more than one of
55 + # them to install at the same time.
56 + if (self._merge_wait_queue and not self._jobs and
57 + not self._task_queues.merge):
58 + task = self._merge_wait_queue.popleft()
59 + task.addExitListener(self._merge_wait_exit_handler)
60 + self._task_queues.merge.add(task)
61 self._status_display.merges = len(self._task_queues.merge)
62 - self._merge_wait_scheduled.extend(self._merge_wait_queue)
63 - del self._merge_wait_queue[:]
64 + self._merge_wait_scheduled.append(task)
65
66 self._schedule_tasks_imp()
67 self._status_display.display()
68 @@ -1670,7 +1677,8 @@ class Scheduler(PollScheduler):
69 state_change += 1
70
71 if not (state_change or \
72 - (not self._jobs and self._merge_wait_queue)):
73 + (self._merge_wait_queue and not self._jobs and
74 + not self._task_queues.merge)):
75 break
76
77 return self._keep_scheduling()