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() |