Gentoo Archives: gentoo-commits

From: "Zac Medico (zmedico)" <zmedico@g.o>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] portage r11263 - main/trunk/pym/_emerge
Date: Tue, 29 Jul 2008 14:35:00
Message-Id: E1KNqHx-0004Xp-AV@stork.gentoo.org
1 Author: zmedico
2 Date: 2008-07-29 14:34:55 +0000 (Tue, 29 Jul 2008)
3 New Revision: 11263
4
5 Modified:
6 main/trunk/pym/_emerge/__init__.py
7 Log:
8 During the first minute of entering the main scheduler loop, if --load-average
9 is enabled then limit the rate that new jobs are spawned, so that the load
10 average measurement has time to respond to the new load introduced by the
11 new jobs. The time between spawning new jobs is proportional to the number
12 of currently running jobs.
13
14
15 Modified: main/trunk/pym/_emerge/__init__.py
16 ===================================================================
17 --- main/trunk/pym/_emerge/__init__.py 2008-07-29 13:01:38 UTC (rev 11262)
18 +++ main/trunk/pym/_emerge/__init__.py 2008-07-29 14:34:55 UTC (rev 11263)
19 @@ -8860,6 +8860,17 @@
20
21 self._max_load = myopts.get("--load-average")
22
23 + # The load average takes some time to respond when new
24 + # jobs are added, so we need to limit the rate of adding
25 + # new jobs when emerge first starts.
26 + self._main_loop_init_delay_period = 60
27 + self._job_delay_factor = 0.5
28 +
29 + # State variables
30 + self._main_loop_init_delay = None
31 + self._previous_job_start_time = None
32 + self._main_loop_start_time = None
33 +
34 self._set_digraph(digraph)
35
36 # This is used to memoize the _choose_pkg() result when
37 @@ -9625,6 +9636,8 @@
38 self._config_pool[settings["ROOT"]].append(settings)
39
40 def _main_loop(self):
41 + self._main_loop_init_delay = self._max_load is not None
42 + self._main_loop_start_time = time.time()
43
44 # Only allow 1 job max if a restart is scheduled
45 # due to portage update.
46 @@ -9656,6 +9669,26 @@
47 self._status_display.display()
48 return remaining
49
50 + def _job_delay(self):
51 + """
52 + @rtype: bool
53 + @returns: True if job scheduling should be delayed, False otherwise.
54 + """
55 +
56 + if self._main_loop_init_delay and self._jobs:
57 +
58 + current_time = time.time()
59 +
60 + if current_time - self._main_loop_start_time > \
61 + self._main_loop_init_delay_period:
62 + self._main_loop_init_delay = False
63 +
64 + elif current_time - self._previous_job_start_time < \
65 + self._job_delay_factor * self._jobs:
66 + return True
67 +
68 + return False
69 +
70 def _schedule_tasks_imp(self):
71 """
72 @rtype: bool
73 @@ -9669,6 +9702,9 @@
74 if not self._pkg_queue or self._failed_pkgs:
75 return (False, state_change)
76
77 + if self._job_delay():
78 + return (True, state_change)
79 +
80 if self._choose_pkg_return_early or \
81 not self._can_add_job():
82 return (True, state_change)
83 @@ -9691,12 +9727,14 @@
84
85 elif pkg.built:
86 self._jobs += 1
87 + self._previous_job_start_time = time.time()
88 self._status_display.running = self._jobs
89 task.addExitListener(self._extract_exit)
90 self._task_queues.jobs.add(task)
91
92 else:
93 self._jobs += 1
94 + self._previous_job_start_time = time.time()
95 self._status_display.running = self._jobs
96 task.addExitListener(self._build_exit)
97 self._task_queues.jobs.add(task)