author | wenzelm |
Thu, 06 Jun 2024 11:53:52 +0200 | |
changeset 80266 | d52be75ae60b |
parent 80128 | 2fe244c4bb01 |
child 80274 | cff00b3dddf5 |
permissions | -rw-r--r-- |
79502 | 1 |
/* Title: Pure/Build/build_schedule.scala |
78845
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
2 |
Author: Fabian Huch, TU Muenchen |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
3 |
|
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
4 |
Build schedule generated by Heuristic methods, allowing for more efficient builds. |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
5 |
*/ |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
6 |
package isabelle |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
7 |
|
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
8 |
|
78846 | 9 |
import Host.Node_Info |
79911 | 10 |
|
78845
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
11 |
import scala.annotation.tailrec |
79182
6202d0ff36b4
added build schedule command-line wrapper;
Fabian Huch <huch@in.tum.de>
parents:
79181
diff
changeset
|
12 |
import scala.collection.mutable |
79910
fbfa7d25749a
tie-breaking in schedule optimization to pick best schedule even when run-time is dominated by large task (e.g., session with long timeout but no data yet);
Fabian Huch <huch@in.tum.de>
parents:
79909
diff
changeset
|
13 |
import scala.Ordering.Implicits.seqOrdering |
78845
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
14 |
|
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
15 |
|
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
16 |
object Build_Schedule { |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
17 |
/* organized historic timing information (extracted from build logs) */ |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
18 |
|
79593 | 19 |
case class Result(job_name: String, hostname: String, threads: Int, timing: Timing) { |
79085
cf51ccfd3e39
use full timing information in build schedule;
Fabian Huch <huch@in.tum.de>
parents:
79084
diff
changeset
|
20 |
def elapsed: Time = timing.elapsed |
79087
3620010c410a
use cpu time for approximation;
Fabian Huch <huch@in.tum.de>
parents:
79086
diff
changeset
|
21 |
def proper_cpu: Option[Time] = timing.cpu.proper_ms.map(Time.ms) |
79085
cf51ccfd3e39
use full timing information in build schedule;
Fabian Huch <huch@in.tum.de>
parents:
79084
diff
changeset
|
22 |
} |
79189 | 23 |
|
24 |
object Timing_Data { |
|
25 |
def median_timing(obs: List[Timing]): Timing = obs.sortBy(_.elapsed.ms).apply(obs.length / 2) |
|
26 |
||
27 |
def median_time(obs: List[Time]): Time = obs.sortBy(_.ms).apply(obs.length / 2) |
|
28 |
||
29 |
def mean_time(obs: Iterable[Time]): Time = Time.ms(obs.map(_.ms).sum / obs.size) |
|
30 |
||
31 |
private def dummy_entries(host: Host, host_factor: Double) = { |
|
32 |
val baseline = Time.minutes(5).scale(host_factor) |
|
33 |
val gc = Time.seconds(10).scale(host_factor) |
|
34 |
List( |
|
79593 | 35 |
Result("dummy", host.name, 1, Timing(baseline, baseline, gc)), |
36 |
Result("dummy", host.name, 8, Timing(baseline.scale(0.2), baseline, gc))) |
|
79189 | 37 |
} |
38 |
||
39 |
def make( |
|
40 |
host_infos: Host_Infos, |
|
41 |
build_history: List[(Build_Log.Meta_Info, Build_Log.Build_Info)], |
|
79877
9aef1d1535ff
use timeout as default build time predictor if no data is available;
Fabian Huch <huch@in.tum.de>
parents:
79871
diff
changeset
|
42 |
session_structure: Sessions.Structure, |
79189 | 43 |
): Timing_Data = { |
44 |
val hosts = host_infos.hosts |
|
45 |
val measurements = |
|
46 |
for { |
|
47 |
(meta_info, build_info) <- build_history |
|
79818
0c2a62a9f136
more operations for Build_Log.Meta_Info: prefer explicit types;
wenzelm
parents:
79805
diff
changeset
|
48 |
build_host = meta_info.get_build_host |
79189 | 49 |
(job_name, session_info) <- build_info.sessions.toList |
50 |
if build_info.finished_sessions.contains(job_name) |
|
51 |
hostname <- session_info.hostname.orElse(build_host).toList |
|
79880
a3d53f2bc41d
clarified build schedule host: proper module;
Fabian Huch <huch@in.tum.de>
parents:
79879
diff
changeset
|
52 |
host <- hosts.find(_.name == hostname).toList |
79927
4359257218ce
clarify use of num_threads vs. max_cpus;
Fabian Huch <huch@in.tum.de>
parents:
79926
diff
changeset
|
53 |
threads = session_info.threads.getOrElse(host.max_threads) |
79189 | 54 |
} yield (job_name, hostname, threads) -> session_info.timing |
55 |
||
56 |
val entries = |
|
57 |
if (measurements.isEmpty) { |
|
58 |
val default_host = host_infos.hosts.sorted(host_infos.host_speeds).last |
|
59 |
host_infos.hosts.flatMap(host => |
|
60 |
dummy_entries(host, host_infos.host_factor(default_host, host))) |
|
61 |
} |
|
62 |
else |
|
63 |
measurements.groupMap(_._1)(_._2).toList.map { |
|
64 |
case ((job_name, hostname, threads), timings) => |
|
79593 | 65 |
Result(job_name, hostname, threads, median_timing(timings)) |
79189 | 66 |
} |
67 |
||
79877
9aef1d1535ff
use timeout as default build time predictor if no data is available;
Fabian Huch <huch@in.tum.de>
parents:
79871
diff
changeset
|
68 |
new Timing_Data(new Facet(entries), host_infos, session_structure) |
79189 | 69 |
} |
70 |
||
79877
9aef1d1535ff
use timeout as default build time predictor if no data is available;
Fabian Huch <huch@in.tum.de>
parents:
79871
diff
changeset
|
71 |
def load( |
9aef1d1535ff
use timeout as default build time predictor if no data is available;
Fabian Huch <huch@in.tum.de>
parents:
79871
diff
changeset
|
72 |
host_infos: Host_Infos, |
9aef1d1535ff
use timeout as default build time predictor if no data is available;
Fabian Huch <huch@in.tum.de>
parents:
79871
diff
changeset
|
73 |
log_database: SQL.Database, |
9aef1d1535ff
use timeout as default build time predictor if no data is available;
Fabian Huch <huch@in.tum.de>
parents:
79871
diff
changeset
|
74 |
sessions_structure: Sessions.Structure |
9aef1d1535ff
use timeout as default build time predictor if no data is available;
Fabian Huch <huch@in.tum.de>
parents:
79871
diff
changeset
|
75 |
): Timing_Data = { |
79189 | 76 |
val build_history = |
77 |
for { |
|
78 |
log_name <- log_database.execute_query_statement( |
|
79 |
Build_Log.private_data.meta_info_table.select(List(Build_Log.Column.log_name)), |
|
80 |
List.from[String], res => res.string(Build_Log.Column.log_name)) |
|
81 |
meta_info <- Build_Log.private_data.read_meta_info(log_database, log_name) |
|
82 |
build_info = Build_Log.private_data.read_build_info(log_database, log_name) |
|
83 |
} yield (meta_info, build_info) |
|
84 |
||
79877
9aef1d1535ff
use timeout as default build time predictor if no data is available;
Fabian Huch <huch@in.tum.de>
parents:
79871
diff
changeset
|
85 |
make(host_infos, build_history, sessions_structure) |
79189 | 86 |
} |
79593 | 87 |
|
88 |
||
89 |
/* data facets */ |
|
90 |
||
91 |
object Facet { |
|
92 |
def unapply(facet: Facet): Option[List[Result]] = Some(facet.results) |
|
93 |
} |
|
94 |
||
95 |
class Facet private[Timing_Data](val results: List[Result]) { |
|
96 |
require(results.nonEmpty) |
|
97 |
||
79649
981cd49a3f90
more explicit types --- fewer warnings in IntelliJ IDEA;
wenzelm
parents:
79648
diff
changeset
|
98 |
def is_empty: Boolean = results.isEmpty |
79593 | 99 |
|
79713
d3a26436e679
tuned signature: more types, fewer warnings in IntelliJ IDEA;
wenzelm
parents:
79703
diff
changeset
|
100 |
def size: Int = results.length |
79593 | 101 |
|
79649
981cd49a3f90
more explicit types --- fewer warnings in IntelliJ IDEA;
wenzelm
parents:
79648
diff
changeset
|
102 |
lazy val by_job: Map[String, Facet] = results.groupBy(_.job_name).view.mapValues(new Facet(_)).toMap |
981cd49a3f90
more explicit types --- fewer warnings in IntelliJ IDEA;
wenzelm
parents:
79648
diff
changeset
|
103 |
lazy val by_threads: Map[Int, Facet] = results.groupBy(_.threads).view.mapValues(new Facet(_)).toMap |
981cd49a3f90
more explicit types --- fewer warnings in IntelliJ IDEA;
wenzelm
parents:
79648
diff
changeset
|
104 |
lazy val by_hostname: Map[String, Facet] = results.groupBy(_.hostname).view.mapValues(new Facet(_)).toMap |
79593 | 105 |
|
79913 | 106 |
def median_time: Time = Timing_Data.median_time(results.map(_.elapsed)) |
79593 | 107 |
|
108 |
def best_result: Result = results.minBy(_.elapsed.ms) |
|
109 |
} |
|
79189 | 110 |
} |
111 |
||
79877
9aef1d1535ff
use timeout as default build time predictor if no data is available;
Fabian Huch <huch@in.tum.de>
parents:
79871
diff
changeset
|
112 |
class Timing_Data private( |
9aef1d1535ff
use timeout as default build time predictor if no data is available;
Fabian Huch <huch@in.tum.de>
parents:
79871
diff
changeset
|
113 |
facet: Timing_Data.Facet, |
9aef1d1535ff
use timeout as default build time predictor if no data is available;
Fabian Huch <huch@in.tum.de>
parents:
79871
diff
changeset
|
114 |
val host_infos: Host_Infos, |
9aef1d1535ff
use timeout as default build time predictor if no data is available;
Fabian Huch <huch@in.tum.de>
parents:
79871
diff
changeset
|
115 |
val sessions_structure: Sessions.Structure |
9aef1d1535ff
use timeout as default build time predictor if no data is available;
Fabian Huch <huch@in.tum.de>
parents:
79871
diff
changeset
|
116 |
) { |
79025
f78ee2d48bf5
handle inflection point in interpolation with monotone prefix;
Fabian Huch <huch@in.tum.de>
parents:
79024
diff
changeset
|
117 |
private def inflection_point(last_mono: Int, next: Int): Int = |
f78ee2d48bf5
handle inflection point in interpolation with monotone prefix;
Fabian Huch <huch@in.tum.de>
parents:
79024
diff
changeset
|
118 |
last_mono + ((next - last_mono) / 2) |
f78ee2d48bf5
handle inflection point in interpolation with monotone prefix;
Fabian Huch <huch@in.tum.de>
parents:
79024
diff
changeset
|
119 |
|
79028
6bada416ba55
clarified timing data operations: proper estimation (instead of known points);
Fabian Huch <huch@in.tum.de>
parents:
79027
diff
changeset
|
120 |
def best_threads(job_name: String, max_threads: Int): Int = { |
6bada416ba55
clarified timing data operations: proper estimation (instead of known points);
Fabian Huch <huch@in.tum.de>
parents:
79027
diff
changeset
|
121 |
val worse_threads = |
79593 | 122 |
facet.by_job.get(job_name).toList.flatMap(_.by_hostname).flatMap { |
123 |
case (hostname, facet) => |
|
124 |
val best_threads = facet.best_result.threads |
|
79911 | 125 |
facet.by_threads.keys.toList.sorted.find(_ > best_threads).map( |
79028
6bada416ba55
clarified timing data operations: proper estimation (instead of known points);
Fabian Huch <huch@in.tum.de>
parents:
79027
diff
changeset
|
126 |
inflection_point(best_threads, _)) |
6bada416ba55
clarified timing data operations: proper estimation (instead of known points);
Fabian Huch <huch@in.tum.de>
parents:
79027
diff
changeset
|
127 |
} |
6bada416ba55
clarified timing data operations: proper estimation (instead of known points);
Fabian Huch <huch@in.tum.de>
parents:
79027
diff
changeset
|
128 |
(max_threads :: worse_threads).min |
6bada416ba55
clarified timing data operations: proper estimation (instead of known points);
Fabian Huch <huch@in.tum.de>
parents:
79027
diff
changeset
|
129 |
} |
78845
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
130 |
|
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
131 |
private def hostname_factor(from: String, to: String): Double = |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
132 |
host_infos.host_factor(host_infos.the_host(from), host_infos.the_host(to)) |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
133 |
|
79041 | 134 |
private def approximate_threads(entries_unsorted: List[(Int, Time)], threads: Int): Time = { |
135 |
val entries = entries_unsorted.sortBy(_._1) |
|
136 |
||
79036
be42ba4b4672
split actual approximation from data handling;
Fabian Huch <huch@in.tum.de>
parents:
79035
diff
changeset
|
137 |
def sorted_prefix[A](xs: List[A], f: A => Long): List[A] = |
be42ba4b4672
split actual approximation from data handling;
Fabian Huch <huch@in.tum.de>
parents:
79035
diff
changeset
|
138 |
xs match { |
be42ba4b4672
split actual approximation from data handling;
Fabian Huch <huch@in.tum.de>
parents:
79035
diff
changeset
|
139 |
case x1 :: x2 :: xs => |
be42ba4b4672
split actual approximation from data handling;
Fabian Huch <huch@in.tum.de>
parents:
79035
diff
changeset
|
140 |
if (f(x1) <= f(x2)) x1 :: sorted_prefix(x2 :: xs, f) else x1 :: Nil |
be42ba4b4672
split actual approximation from data handling;
Fabian Huch <huch@in.tum.de>
parents:
79035
diff
changeset
|
141 |
case xs => xs |
be42ba4b4672
split actual approximation from data handling;
Fabian Huch <huch@in.tum.de>
parents:
79035
diff
changeset
|
142 |
} |
be42ba4b4672
split actual approximation from data handling;
Fabian Huch <huch@in.tum.de>
parents:
79035
diff
changeset
|
143 |
|
be42ba4b4672
split actual approximation from data handling;
Fabian Huch <huch@in.tum.de>
parents:
79035
diff
changeset
|
144 |
def linear(p0: (Int, Time), p1: (Int, Time)): Time = { |
be42ba4b4672
split actual approximation from data handling;
Fabian Huch <huch@in.tum.de>
parents:
79035
diff
changeset
|
145 |
val a = (p1._2 - p0._2).scale(1.0 / (p1._1 - p0._1)) |
be42ba4b4672
split actual approximation from data handling;
Fabian Huch <huch@in.tum.de>
parents:
79035
diff
changeset
|
146 |
val b = p0._2 - a.scale(p0._1) |
79184 | 147 |
(a.scale(threads) + b) max Time.zero |
79036
be42ba4b4672
split actual approximation from data handling;
Fabian Huch <huch@in.tum.de>
parents:
79035
diff
changeset
|
148 |
} |
be42ba4b4672
split actual approximation from data handling;
Fabian Huch <huch@in.tum.de>
parents:
79035
diff
changeset
|
149 |
|
be42ba4b4672
split actual approximation from data handling;
Fabian Huch <huch@in.tum.de>
parents:
79035
diff
changeset
|
150 |
val mono_prefix = sorted_prefix(entries, e => -e._2.ms) |
be42ba4b4672
split actual approximation from data handling;
Fabian Huch <huch@in.tum.de>
parents:
79035
diff
changeset
|
151 |
|
be42ba4b4672
split actual approximation from data handling;
Fabian Huch <huch@in.tum.de>
parents:
79035
diff
changeset
|
152 |
val is_mono = entries == mono_prefix |
be42ba4b4672
split actual approximation from data handling;
Fabian Huch <huch@in.tum.de>
parents:
79035
diff
changeset
|
153 |
val in_prefix = mono_prefix.length > 1 && threads <= mono_prefix.last._1 |
be42ba4b4672
split actual approximation from data handling;
Fabian Huch <huch@in.tum.de>
parents:
79035
diff
changeset
|
154 |
val in_inflection = |
be42ba4b4672
split actual approximation from data handling;
Fabian Huch <huch@in.tum.de>
parents:
79035
diff
changeset
|
155 |
!is_mono && mono_prefix.length > 1 && threads < entries.drop(mono_prefix.length).head._1 |
be42ba4b4672
split actual approximation from data handling;
Fabian Huch <huch@in.tum.de>
parents:
79035
diff
changeset
|
156 |
if (is_mono || in_prefix || in_inflection) { |
be42ba4b4672
split actual approximation from data handling;
Fabian Huch <huch@in.tum.de>
parents:
79035
diff
changeset
|
157 |
// Model with Amdahl's law |
be42ba4b4672
split actual approximation from data handling;
Fabian Huch <huch@in.tum.de>
parents:
79035
diff
changeset
|
158 |
val t_p = |
be42ba4b4672
split actual approximation from data handling;
Fabian Huch <huch@in.tum.de>
parents:
79035
diff
changeset
|
159 |
Timing_Data.median_time(for { |
be42ba4b4672
split actual approximation from data handling;
Fabian Huch <huch@in.tum.de>
parents:
79035
diff
changeset
|
160 |
(n, t0) <- mono_prefix |
be42ba4b4672
split actual approximation from data handling;
Fabian Huch <huch@in.tum.de>
parents:
79035
diff
changeset
|
161 |
(m, t1) <- mono_prefix |
be42ba4b4672
split actual approximation from data handling;
Fabian Huch <huch@in.tum.de>
parents:
79035
diff
changeset
|
162 |
if m != n |
be42ba4b4672
split actual approximation from data handling;
Fabian Huch <huch@in.tum.de>
parents:
79035
diff
changeset
|
163 |
} yield (t0 - t1).scale(n.toDouble * m / (m - n))) |
be42ba4b4672
split actual approximation from data handling;
Fabian Huch <huch@in.tum.de>
parents:
79035
diff
changeset
|
164 |
val t_c = |
be42ba4b4672
split actual approximation from data handling;
Fabian Huch <huch@in.tum.de>
parents:
79035
diff
changeset
|
165 |
Timing_Data.median_time(for ((n, t) <- mono_prefix) yield t - t_p.scale(1.0 / n)) |
be42ba4b4672
split actual approximation from data handling;
Fabian Huch <huch@in.tum.de>
parents:
79035
diff
changeset
|
166 |
|
79184 | 167 |
def model(threads: Int): Time = (t_c + t_p.scale(1.0 / threads)) max Time.zero |
79036
be42ba4b4672
split actual approximation from data handling;
Fabian Huch <huch@in.tum.de>
parents:
79035
diff
changeset
|
168 |
|
be42ba4b4672
split actual approximation from data handling;
Fabian Huch <huch@in.tum.de>
parents:
79035
diff
changeset
|
169 |
if (is_mono || in_prefix) model(threads) |
be42ba4b4672
split actual approximation from data handling;
Fabian Huch <huch@in.tum.de>
parents:
79035
diff
changeset
|
170 |
else { |
be42ba4b4672
split actual approximation from data handling;
Fabian Huch <huch@in.tum.de>
parents:
79035
diff
changeset
|
171 |
val post_inflection = entries.drop(mono_prefix.length).head |
be42ba4b4672
split actual approximation from data handling;
Fabian Huch <huch@in.tum.de>
parents:
79035
diff
changeset
|
172 |
val inflection_threads = inflection_point(mono_prefix.last._1, post_inflection._1) |
be42ba4b4672
split actual approximation from data handling;
Fabian Huch <huch@in.tum.de>
parents:
79035
diff
changeset
|
173 |
|
be42ba4b4672
split actual approximation from data handling;
Fabian Huch <huch@in.tum.de>
parents:
79035
diff
changeset
|
174 |
if (threads <= inflection_threads) model(threads) |
be42ba4b4672
split actual approximation from data handling;
Fabian Huch <huch@in.tum.de>
parents:
79035
diff
changeset
|
175 |
else linear((inflection_threads, model(inflection_threads)), post_inflection) |
be42ba4b4672
split actual approximation from data handling;
Fabian Huch <huch@in.tum.de>
parents:
79035
diff
changeset
|
176 |
} |
be42ba4b4672
split actual approximation from data handling;
Fabian Huch <huch@in.tum.de>
parents:
79035
diff
changeset
|
177 |
} else { |
be42ba4b4672
split actual approximation from data handling;
Fabian Huch <huch@in.tum.de>
parents:
79035
diff
changeset
|
178 |
// Piecewise linear |
be42ba4b4672
split actual approximation from data handling;
Fabian Huch <huch@in.tum.de>
parents:
79035
diff
changeset
|
179 |
val (p0, p1) = |
79042 | 180 |
if (entries.head._1 < threads && threads < entries.last._1) { |
181 |
val split = entries.partition(_._1 < threads) |
|
79036
be42ba4b4672
split actual approximation from data handling;
Fabian Huch <huch@in.tum.de>
parents:
79035
diff
changeset
|
182 |
(split._1.last, split._2.head) |
be42ba4b4672
split actual approximation from data handling;
Fabian Huch <huch@in.tum.de>
parents:
79035
diff
changeset
|
183 |
} else { |
be42ba4b4672
split actual approximation from data handling;
Fabian Huch <huch@in.tum.de>
parents:
79035
diff
changeset
|
184 |
val piece = if (threads < entries.head._1) entries.take(2) else entries.takeRight(2) |
be42ba4b4672
split actual approximation from data handling;
Fabian Huch <huch@in.tum.de>
parents:
79035
diff
changeset
|
185 |
(piece.head, piece.last) |
be42ba4b4672
split actual approximation from data handling;
Fabian Huch <huch@in.tum.de>
parents:
79035
diff
changeset
|
186 |
} |
be42ba4b4672
split actual approximation from data handling;
Fabian Huch <huch@in.tum.de>
parents:
79035
diff
changeset
|
187 |
|
be42ba4b4672
split actual approximation from data handling;
Fabian Huch <huch@in.tum.de>
parents:
79035
diff
changeset
|
188 |
linear(p0, p1) |
be42ba4b4672
split actual approximation from data handling;
Fabian Huch <huch@in.tum.de>
parents:
79035
diff
changeset
|
189 |
} |
be42ba4b4672
split actual approximation from data handling;
Fabian Huch <huch@in.tum.de>
parents:
79035
diff
changeset
|
190 |
} |
be42ba4b4672
split actual approximation from data handling;
Fabian Huch <huch@in.tum.de>
parents:
79035
diff
changeset
|
191 |
|
79037
1b3a6cc4a2bf
clarified and tuned timing estimation;
Fabian Huch <huch@in.tum.de>
parents:
79036
diff
changeset
|
192 |
private def unify_hosts(job_name: String, on_host: String): List[(Int, Time)] = { |
79593 | 193 |
def unify(hostname: String, facet: Timing_Data.Facet) = |
79913 | 194 |
facet.median_time.scale(hostname_factor(hostname, on_host)) |
79037
1b3a6cc4a2bf
clarified and tuned timing estimation;
Fabian Huch <huch@in.tum.de>
parents:
79036
diff
changeset
|
195 |
|
1b3a6cc4a2bf
clarified and tuned timing estimation;
Fabian Huch <huch@in.tum.de>
parents:
79036
diff
changeset
|
196 |
for { |
79593 | 197 |
facet <- facet.by_job.get(job_name).toList |
198 |
(threads, facet) <- facet.by_threads |
|
199 |
entries = facet.by_hostname.toList.map(unify) |
|
79913 | 200 |
} yield threads -> Timing_Data.mean_time(entries) |
79037
1b3a6cc4a2bf
clarified and tuned timing estimation;
Fabian Huch <huch@in.tum.de>
parents:
79036
diff
changeset
|
201 |
} |
1b3a6cc4a2bf
clarified and tuned timing estimation;
Fabian Huch <huch@in.tum.de>
parents:
79036
diff
changeset
|
202 |
|
1b3a6cc4a2bf
clarified and tuned timing estimation;
Fabian Huch <huch@in.tum.de>
parents:
79036
diff
changeset
|
203 |
def estimate_threads(job_name: String, hostname: String, threads: Int): Option[Time] = { |
79593 | 204 |
def try_approximate(facet: Timing_Data.Facet): Option[Time] = { |
79087
3620010c410a
use cpu time for approximation;
Fabian Huch <huch@in.tum.de>
parents:
79086
diff
changeset
|
205 |
val entries = |
79593 | 206 |
facet.by_threads.toList match { |
207 |
case List((i, Timing_Data.Facet(List(result)))) if i != 1 => |
|
79913 | 208 |
(i, facet.median_time) :: result.proper_cpu.map(1 -> _).toList |
209 |
case entries => entries.map((threads, facet) => threads -> facet.median_time) |
|
79087
3620010c410a
use cpu time for approximation;
Fabian Huch <huch@in.tum.de>
parents:
79086
diff
changeset
|
210 |
} |
3620010c410a
use cpu time for approximation;
Fabian Huch <huch@in.tum.de>
parents:
79086
diff
changeset
|
211 |
if (entries.size < 2) None else Some(approximate_threads(entries, threads)) |
3620010c410a
use cpu time for approximation;
Fabian Huch <huch@in.tum.de>
parents:
79086
diff
changeset
|
212 |
} |
3620010c410a
use cpu time for approximation;
Fabian Huch <huch@in.tum.de>
parents:
79086
diff
changeset
|
213 |
|
79037
1b3a6cc4a2bf
clarified and tuned timing estimation;
Fabian Huch <huch@in.tum.de>
parents:
79036
diff
changeset
|
214 |
for { |
79593 | 215 |
facet <- facet.by_job.get(job_name) |
216 |
facet <- facet.by_hostname.get(hostname) |
|
79913 | 217 |
time <- facet.by_threads.get(threads).map(_.median_time).orElse(try_approximate(facet)) |
79037
1b3a6cc4a2bf
clarified and tuned timing estimation;
Fabian Huch <huch@in.tum.de>
parents:
79036
diff
changeset
|
218 |
} yield time |
1b3a6cc4a2bf
clarified and tuned timing estimation;
Fabian Huch <huch@in.tum.de>
parents:
79036
diff
changeset
|
219 |
} |
1b3a6cc4a2bf
clarified and tuned timing estimation;
Fabian Huch <huch@in.tum.de>
parents:
79036
diff
changeset
|
220 |
|
1b3a6cc4a2bf
clarified and tuned timing estimation;
Fabian Huch <huch@in.tum.de>
parents:
79036
diff
changeset
|
221 |
def global_threads_factor(from: Int, to: Int): Double = { |
1b3a6cc4a2bf
clarified and tuned timing estimation;
Fabian Huch <huch@in.tum.de>
parents:
79036
diff
changeset
|
222 |
def median(xs: Iterable[Double]): Double = xs.toList.sorted.apply(xs.size / 2) |
79036
be42ba4b4672
split actual approximation from data handling;
Fabian Huch <huch@in.tum.de>
parents:
79035
diff
changeset
|
223 |
|
79037
1b3a6cc4a2bf
clarified and tuned timing estimation;
Fabian Huch <huch@in.tum.de>
parents:
79036
diff
changeset
|
224 |
val estimates = |
1b3a6cc4a2bf
clarified and tuned timing estimation;
Fabian Huch <huch@in.tum.de>
parents:
79036
diff
changeset
|
225 |
for { |
79593 | 226 |
(hostname, facet) <- facet.by_hostname |
227 |
job_name <- facet.by_job.keys |
|
79037
1b3a6cc4a2bf
clarified and tuned timing estimation;
Fabian Huch <huch@in.tum.de>
parents:
79036
diff
changeset
|
228 |
from_time <- estimate_threads(job_name, hostname, from) |
1b3a6cc4a2bf
clarified and tuned timing estimation;
Fabian Huch <huch@in.tum.de>
parents:
79036
diff
changeset
|
229 |
to_time <- estimate_threads(job_name, hostname, to) |
1b3a6cc4a2bf
clarified and tuned timing estimation;
Fabian Huch <huch@in.tum.de>
parents:
79036
diff
changeset
|
230 |
} yield from_time.ms.toDouble / to_time.ms |
78845
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
231 |
|
79037
1b3a6cc4a2bf
clarified and tuned timing estimation;
Fabian Huch <huch@in.tum.de>
parents:
79036
diff
changeset
|
232 |
if (estimates.nonEmpty) median(estimates) |
1b3a6cc4a2bf
clarified and tuned timing estimation;
Fabian Huch <huch@in.tum.de>
parents:
79036
diff
changeset
|
233 |
else { |
1b3a6cc4a2bf
clarified and tuned timing estimation;
Fabian Huch <huch@in.tum.de>
parents:
79036
diff
changeset
|
234 |
// unify hosts |
1b3a6cc4a2bf
clarified and tuned timing estimation;
Fabian Huch <huch@in.tum.de>
parents:
79036
diff
changeset
|
235 |
val estimates = |
1b3a6cc4a2bf
clarified and tuned timing estimation;
Fabian Huch <huch@in.tum.de>
parents:
79036
diff
changeset
|
236 |
for { |
79593 | 237 |
(job_name, facet) <- facet.by_job |
238 |
hostname = facet.by_hostname.keys.head |
|
79037
1b3a6cc4a2bf
clarified and tuned timing estimation;
Fabian Huch <huch@in.tum.de>
parents:
79036
diff
changeset
|
239 |
entries = unify_hosts(job_name, hostname) |
1b3a6cc4a2bf
clarified and tuned timing estimation;
Fabian Huch <huch@in.tum.de>
parents:
79036
diff
changeset
|
240 |
if entries.length > 1 |
1b3a6cc4a2bf
clarified and tuned timing estimation;
Fabian Huch <huch@in.tum.de>
parents:
79036
diff
changeset
|
241 |
} yield |
1b3a6cc4a2bf
clarified and tuned timing estimation;
Fabian Huch <huch@in.tum.de>
parents:
79036
diff
changeset
|
242 |
approximate_threads(entries, from).ms.toDouble / approximate_threads(entries, to).ms |
78845
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
243 |
|
79037
1b3a6cc4a2bf
clarified and tuned timing estimation;
Fabian Huch <huch@in.tum.de>
parents:
79036
diff
changeset
|
244 |
if (estimates.nonEmpty) median(estimates) |
1b3a6cc4a2bf
clarified and tuned timing estimation;
Fabian Huch <huch@in.tum.de>
parents:
79036
diff
changeset
|
245 |
else from.toDouble / to.toDouble |
1b3a6cc4a2bf
clarified and tuned timing estimation;
Fabian Huch <huch@in.tum.de>
parents:
79036
diff
changeset
|
246 |
} |
78845
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
247 |
} |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
248 |
|
79178
96e5d12c82fd
performance tuning: cache estimates;
Fabian Huch <huch@in.tum.de>
parents:
79110
diff
changeset
|
249 |
private var cache: Map[(String, String, Int), Time] = Map.empty |
79911 | 250 |
|
251 |
||
79534
1dcc97227442
add approximation factors in build schedule to estimate build times more conservatively;
Fabian Huch <huch@in.tum.de>
parents:
79527
diff
changeset
|
252 |
/* approximation factors -- penalize estimations with less information */ |
79911 | 253 |
|
79534
1dcc97227442
add approximation factors in build schedule to estimate build times more conservatively;
Fabian Huch <huch@in.tum.de>
parents:
79527
diff
changeset
|
254 |
val FACTOR_NO_THREADS_GLOBAL_CURVE = 2.5 |
1dcc97227442
add approximation factors in build schedule to estimate build times more conservatively;
Fabian Huch <huch@in.tum.de>
parents:
79527
diff
changeset
|
255 |
val FACTOR_NO_THREADS_UNIFY_MACHINES = 1.7 |
1dcc97227442
add approximation factors in build schedule to estimate build times more conservatively;
Fabian Huch <huch@in.tum.de>
parents:
79527
diff
changeset
|
256 |
val FACTOR_NO_THREADS_OTHER_MACHINE = 1.5 |
1dcc97227442
add approximation factors in build schedule to estimate build times more conservatively;
Fabian Huch <huch@in.tum.de>
parents:
79527
diff
changeset
|
257 |
val FACTOR_NO_THREADS_SAME_MACHINE = 1.4 |
1dcc97227442
add approximation factors in build schedule to estimate build times more conservatively;
Fabian Huch <huch@in.tum.de>
parents:
79527
diff
changeset
|
258 |
val FACTOR_THREADS_OTHER_MACHINE = 1.2 |
1dcc97227442
add approximation factors in build schedule to estimate build times more conservatively;
Fabian Huch <huch@in.tum.de>
parents:
79527
diff
changeset
|
259 |
|
79178
96e5d12c82fd
performance tuning: cache estimates;
Fabian Huch <huch@in.tum.de>
parents:
79110
diff
changeset
|
260 |
def estimate(job_name: String, hostname: String, threads: Int): Time = { |
96e5d12c82fd
performance tuning: cache estimates;
Fabian Huch <huch@in.tum.de>
parents:
79110
diff
changeset
|
261 |
def estimate: Time = |
79593 | 262 |
facet.by_job.get(job_name) match { |
79178
96e5d12c82fd
performance tuning: cache estimates;
Fabian Huch <huch@in.tum.de>
parents:
79110
diff
changeset
|
263 |
case None => |
79877
9aef1d1535ff
use timeout as default build time predictor if no data is available;
Fabian Huch <huch@in.tum.de>
parents:
79871
diff
changeset
|
264 |
// no data for job, use timeout as esimation for single-threaded job on worst host |
79895
4ec26ed6f481
proper check (amending 9aef1d1535ff);
Fabian Huch <huch@in.tum.de>
parents:
79892
diff
changeset
|
265 |
val default_time = sessions_structure.get(job_name).map(_.timeout).getOrElse(Time.zero) |
79877
9aef1d1535ff
use timeout as default build time predictor if no data is available;
Fabian Huch <huch@in.tum.de>
parents:
79871
diff
changeset
|
266 |
if (default_time > Time.zero) { |
9aef1d1535ff
use timeout as default build time predictor if no data is available;
Fabian Huch <huch@in.tum.de>
parents:
79871
diff
changeset
|
267 |
val default_host = host_infos.hosts.sorted(host_infos.host_speeds).head |
9aef1d1535ff
use timeout as default build time predictor if no data is available;
Fabian Huch <huch@in.tum.de>
parents:
79871
diff
changeset
|
268 |
default_time |
9aef1d1535ff
use timeout as default build time predictor if no data is available;
Fabian Huch <huch@in.tum.de>
parents:
79871
diff
changeset
|
269 |
.scale(global_threads_factor(1, threads)) |
9aef1d1535ff
use timeout as default build time predictor if no data is available;
Fabian Huch <huch@in.tum.de>
parents:
79871
diff
changeset
|
270 |
.scale(hostname_factor(default_host.name, hostname)) |
9aef1d1535ff
use timeout as default build time predictor if no data is available;
Fabian Huch <huch@in.tum.de>
parents:
79871
diff
changeset
|
271 |
} |
79178
96e5d12c82fd
performance tuning: cache estimates;
Fabian Huch <huch@in.tum.de>
parents:
79110
diff
changeset
|
272 |
else { |
79877
9aef1d1535ff
use timeout as default build time predictor if no data is available;
Fabian Huch <huch@in.tum.de>
parents:
79871
diff
changeset
|
273 |
// no timeout, take average of other jobs for given threads |
9aef1d1535ff
use timeout as default build time predictor if no data is available;
Fabian Huch <huch@in.tum.de>
parents:
79871
diff
changeset
|
274 |
val job_estimates = facet.by_job.keys.flatMap(estimate_threads(_, hostname, threads)) |
9aef1d1535ff
use timeout as default build time predictor if no data is available;
Fabian Huch <huch@in.tum.de>
parents:
79871
diff
changeset
|
275 |
if (job_estimates.nonEmpty) Timing_Data.mean_time(job_estimates) |
9aef1d1535ff
use timeout as default build time predictor if no data is available;
Fabian Huch <huch@in.tum.de>
parents:
79871
diff
changeset
|
276 |
else { |
9aef1d1535ff
use timeout as default build time predictor if no data is available;
Fabian Huch <huch@in.tum.de>
parents:
79871
diff
changeset
|
277 |
// no other job to estimate from, use global curve to approximate any other job |
9aef1d1535ff
use timeout as default build time predictor if no data is available;
Fabian Huch <huch@in.tum.de>
parents:
79871
diff
changeset
|
278 |
val (threads1, facet1) = facet.by_threads.head |
79913 | 279 |
facet1.median_time.scale(global_threads_factor(threads1, threads)) |
79877
9aef1d1535ff
use timeout as default build time predictor if no data is available;
Fabian Huch <huch@in.tum.de>
parents:
79871
diff
changeset
|
280 |
} |
79178
96e5d12c82fd
performance tuning: cache estimates;
Fabian Huch <huch@in.tum.de>
parents:
79110
diff
changeset
|
281 |
} |
79038
cd7c1acc9cf2
better estimation for unknown jobs;
Fabian Huch <huch@in.tum.de>
parents:
79037
diff
changeset
|
282 |
|
79593 | 283 |
case Some(facet) => |
284 |
facet.by_threads.get(threads) match { |
|
79178
96e5d12c82fd
performance tuning: cache estimates;
Fabian Huch <huch@in.tum.de>
parents:
79110
diff
changeset
|
285 |
case None => // interpolate threads |
79534
1dcc97227442
add approximation factors in build schedule to estimate build times more conservatively;
Fabian Huch <huch@in.tum.de>
parents:
79527
diff
changeset
|
286 |
estimate_threads(job_name, hostname, threads).map(_.scale( |
1dcc97227442
add approximation factors in build schedule to estimate build times more conservatively;
Fabian Huch <huch@in.tum.de>
parents:
79527
diff
changeset
|
287 |
FACTOR_NO_THREADS_SAME_MACHINE)).getOrElse { |
79178
96e5d12c82fd
performance tuning: cache estimates;
Fabian Huch <huch@in.tum.de>
parents:
79110
diff
changeset
|
288 |
// per machine, try to approximate config for threads |
96e5d12c82fd
performance tuning: cache estimates;
Fabian Huch <huch@in.tum.de>
parents:
79110
diff
changeset
|
289 |
val approximated = |
96e5d12c82fd
performance tuning: cache estimates;
Fabian Huch <huch@in.tum.de>
parents:
79110
diff
changeset
|
290 |
for { |
79593 | 291 |
hostname1 <- facet.by_hostname.keys |
79178
96e5d12c82fd
performance tuning: cache estimates;
Fabian Huch <huch@in.tum.de>
parents:
79110
diff
changeset
|
292 |
estimate <- estimate_threads(job_name, hostname1, threads) |
96e5d12c82fd
performance tuning: cache estimates;
Fabian Huch <huch@in.tum.de>
parents:
79110
diff
changeset
|
293 |
factor = hostname_factor(hostname1, hostname) |
96e5d12c82fd
performance tuning: cache estimates;
Fabian Huch <huch@in.tum.de>
parents:
79110
diff
changeset
|
294 |
} yield estimate.scale(factor) |
78845
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
295 |
|
79911 | 296 |
if (approximated.nonEmpty) |
79534
1dcc97227442
add approximation factors in build schedule to estimate build times more conservatively;
Fabian Huch <huch@in.tum.de>
parents:
79527
diff
changeset
|
297 |
Timing_Data.mean_time(approximated).scale(FACTOR_NO_THREADS_OTHER_MACHINE) |
79178
96e5d12c82fd
performance tuning: cache estimates;
Fabian Huch <huch@in.tum.de>
parents:
79110
diff
changeset
|
298 |
else { |
96e5d12c82fd
performance tuning: cache estimates;
Fabian Huch <huch@in.tum.de>
parents:
79110
diff
changeset
|
299 |
// no single machine where config can be approximated, unify data points |
96e5d12c82fd
performance tuning: cache estimates;
Fabian Huch <huch@in.tum.de>
parents:
79110
diff
changeset
|
300 |
val unified_entries = unify_hosts(job_name, hostname) |
79037
1b3a6cc4a2bf
clarified and tuned timing estimation;
Fabian Huch <huch@in.tum.de>
parents:
79036
diff
changeset
|
301 |
|
79534
1dcc97227442
add approximation factors in build schedule to estimate build times more conservatively;
Fabian Huch <huch@in.tum.de>
parents:
79527
diff
changeset
|
302 |
if (unified_entries.length > 1) |
1dcc97227442
add approximation factors in build schedule to estimate build times more conservatively;
Fabian Huch <huch@in.tum.de>
parents:
79527
diff
changeset
|
303 |
approximate_threads(unified_entries, threads).scale( |
1dcc97227442
add approximation factors in build schedule to estimate build times more conservatively;
Fabian Huch <huch@in.tum.de>
parents:
79527
diff
changeset
|
304 |
FACTOR_NO_THREADS_UNIFY_MACHINES) |
79178
96e5d12c82fd
performance tuning: cache estimates;
Fabian Huch <huch@in.tum.de>
parents:
79110
diff
changeset
|
305 |
else { |
96e5d12c82fd
performance tuning: cache estimates;
Fabian Huch <huch@in.tum.de>
parents:
79110
diff
changeset
|
306 |
// only single data point, use global curve to approximate |
96e5d12c82fd
performance tuning: cache estimates;
Fabian Huch <huch@in.tum.de>
parents:
79110
diff
changeset
|
307 |
val (job_threads, job_time) = unified_entries.head |
79534
1dcc97227442
add approximation factors in build schedule to estimate build times more conservatively;
Fabian Huch <huch@in.tum.de>
parents:
79527
diff
changeset
|
308 |
job_time.scale(global_threads_factor(job_threads, threads)).scale( |
1dcc97227442
add approximation factors in build schedule to estimate build times more conservatively;
Fabian Huch <huch@in.tum.de>
parents:
79527
diff
changeset
|
309 |
FACTOR_NO_THREADS_GLOBAL_CURVE) |
79178
96e5d12c82fd
performance tuning: cache estimates;
Fabian Huch <huch@in.tum.de>
parents:
79110
diff
changeset
|
310 |
} |
78845
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
311 |
} |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
312 |
} |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
313 |
|
79593 | 314 |
case Some(facet) => // time for job/thread exists, interpolate machine if necessary |
79913 | 315 |
facet.by_hostname.get(hostname).map(_.median_time).getOrElse { |
316 |
Timing_Data.mean_time( |
|
79593 | 317 |
facet.by_hostname.toList.map((hostname1, facet) => |
79913 | 318 |
facet.median_time.scale(hostname_factor(hostname1, hostname)))).scale( |
79534
1dcc97227442
add approximation factors in build schedule to estimate build times more conservatively;
Fabian Huch <huch@in.tum.de>
parents:
79527
diff
changeset
|
319 |
FACTOR_THREADS_OTHER_MACHINE) |
79178
96e5d12c82fd
performance tuning: cache estimates;
Fabian Huch <huch@in.tum.de>
parents:
79110
diff
changeset
|
320 |
} |
96e5d12c82fd
performance tuning: cache estimates;
Fabian Huch <huch@in.tum.de>
parents:
79110
diff
changeset
|
321 |
} |
96e5d12c82fd
performance tuning: cache estimates;
Fabian Huch <huch@in.tum.de>
parents:
79110
diff
changeset
|
322 |
} |
96e5d12c82fd
performance tuning: cache estimates;
Fabian Huch <huch@in.tum.de>
parents:
79110
diff
changeset
|
323 |
|
96e5d12c82fd
performance tuning: cache estimates;
Fabian Huch <huch@in.tum.de>
parents:
79110
diff
changeset
|
324 |
cache.get(job_name, hostname, threads) match { |
96e5d12c82fd
performance tuning: cache estimates;
Fabian Huch <huch@in.tum.de>
parents:
79110
diff
changeset
|
325 |
case Some(time) => time |
96e5d12c82fd
performance tuning: cache estimates;
Fabian Huch <huch@in.tum.de>
parents:
79110
diff
changeset
|
326 |
case None => |
96e5d12c82fd
performance tuning: cache estimates;
Fabian Huch <huch@in.tum.de>
parents:
79110
diff
changeset
|
327 |
val time = estimate |
96e5d12c82fd
performance tuning: cache estimates;
Fabian Huch <huch@in.tum.de>
parents:
79110
diff
changeset
|
328 |
cache = cache + ((job_name, hostname, threads) -> time) |
96e5d12c82fd
performance tuning: cache estimates;
Fabian Huch <huch@in.tum.de>
parents:
79110
diff
changeset
|
329 |
time |
78845
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
330 |
} |
79178
96e5d12c82fd
performance tuning: cache estimates;
Fabian Huch <huch@in.tum.de>
parents:
79110
diff
changeset
|
331 |
} |
78845
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
332 |
} |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
333 |
|
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
334 |
|
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
335 |
/* host information */ |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
336 |
|
79925 | 337 |
object Host { |
79926
dc4a387a6f02
clarified host: pre-load max threads;
Fabian Huch <huch@in.tum.de>
parents:
79925
diff
changeset
|
338 |
def load(options: Options, build_host: Build_Cluster.Host, host_db: SQL.Database): Host = { |
79925 | 339 |
val name = build_host.name |
340 |
val info = |
|
341 |
isabelle.Host.read_info(host_db, name).getOrElse(error("No info for host " + quote(name))) |
|
79926
dc4a387a6f02
clarified host: pre-load max threads;
Fabian Huch <huch@in.tum.de>
parents:
79925
diff
changeset
|
342 |
val max_threads = (options ++ build_host.options).threads(default = info.num_cpus) |
79925 | 343 |
val score = info.benchmark_score.getOrElse(error("No benchmark for " + quote(name))) |
344 |
||
345 |
Host( |
|
346 |
name = name, |
|
347 |
num_cpus = info.num_cpus, |
|
348 |
max_jobs = build_host.jobs, |
|
79926
dc4a387a6f02
clarified host: pre-load max threads;
Fabian Huch <huch@in.tum.de>
parents:
79925
diff
changeset
|
349 |
max_threads = max_threads, |
79925 | 350 |
numa = build_host.numa, |
351 |
numa_nodes = info.numa_nodes, |
|
352 |
benchmark_score = score, |
|
353 |
options = build_host.options) |
|
354 |
} |
|
355 |
} |
|
356 |
||
79880
a3d53f2bc41d
clarified build schedule host: proper module;
Fabian Huch <huch@in.tum.de>
parents:
79879
diff
changeset
|
357 |
case class Host( |
a3d53f2bc41d
clarified build schedule host: proper module;
Fabian Huch <huch@in.tum.de>
parents:
79879
diff
changeset
|
358 |
name: String, |
a3d53f2bc41d
clarified build schedule host: proper module;
Fabian Huch <huch@in.tum.de>
parents:
79879
diff
changeset
|
359 |
num_cpus: Int, |
a3d53f2bc41d
clarified build schedule host: proper module;
Fabian Huch <huch@in.tum.de>
parents:
79879
diff
changeset
|
360 |
max_jobs: Int, |
79926
dc4a387a6f02
clarified host: pre-load max threads;
Fabian Huch <huch@in.tum.de>
parents:
79925
diff
changeset
|
361 |
max_threads: Int, |
79880
a3d53f2bc41d
clarified build schedule host: proper module;
Fabian Huch <huch@in.tum.de>
parents:
79879
diff
changeset
|
362 |
benchmark_score: Double, |
a3d53f2bc41d
clarified build schedule host: proper module;
Fabian Huch <huch@in.tum.de>
parents:
79879
diff
changeset
|
363 |
numa: Boolean = false, |
a3d53f2bc41d
clarified build schedule host: proper module;
Fabian Huch <huch@in.tum.de>
parents:
79879
diff
changeset
|
364 |
numa_nodes: List[Int] = Nil, |
79926
dc4a387a6f02
clarified host: pre-load max threads;
Fabian Huch <huch@in.tum.de>
parents:
79925
diff
changeset
|
365 |
options: List[Options.Spec] = Nil) |
78845
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
366 |
|
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
367 |
object Host_Infos { |
79926
dc4a387a6f02
clarified host: pre-load max threads;
Fabian Huch <huch@in.tum.de>
parents:
79925
diff
changeset
|
368 |
def load( |
dc4a387a6f02
clarified host: pre-load max threads;
Fabian Huch <huch@in.tum.de>
parents:
79925
diff
changeset
|
369 |
options: Options, |
dc4a387a6f02
clarified host: pre-load max threads;
Fabian Huch <huch@in.tum.de>
parents:
79925
diff
changeset
|
370 |
build_hosts: List[Build_Cluster.Host], |
dc4a387a6f02
clarified host: pre-load max threads;
Fabian Huch <huch@in.tum.de>
parents:
79925
diff
changeset
|
371 |
host_db: SQL.Database |
dc4a387a6f02
clarified host: pre-load max threads;
Fabian Huch <huch@in.tum.de>
parents:
79925
diff
changeset
|
372 |
): Host_Infos = new Host_Infos(build_hosts.map(Host.load(options, _, host_db))) |
78845
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
373 |
} |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
374 |
|
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
375 |
class Host_Infos private(val hosts: List[Host]) { |
79040 | 376 |
require(hosts.nonEmpty) |
377 |
||
79103
883f61f0beda
clarified build schedule host: more operations;
Fabian Huch <huch@in.tum.de>
parents:
79102
diff
changeset
|
378 |
private val by_hostname = hosts.map(host => host.name -> host).toMap |
78845
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
379 |
|
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
380 |
def host_factor(from: Host, to: Host): Double = |
79880
a3d53f2bc41d
clarified build schedule host: proper module;
Fabian Huch <huch@in.tum.de>
parents:
79879
diff
changeset
|
381 |
from.benchmark_score / to.benchmark_score |
78845
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
382 |
|
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
383 |
val host_speeds: Ordering[Host] = |
79084 | 384 |
Ordering.fromLessThan((host1, host2) => host_factor(host1, host2) < 1) |
78845
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
385 |
|
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
386 |
def the_host(hostname: String): Host = |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
387 |
by_hostname.getOrElse(hostname, error("Unknown host " + quote(hostname))) |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
388 |
def the_host(node_info: Node_Info): Host = the_host(node_info.hostname) |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
389 |
|
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
390 |
def num_threads(node_info: Node_Info): Int = |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
391 |
if (node_info.rel_cpus.nonEmpty) node_info.rel_cpus.length |
79927
4359257218ce
clarify use of num_threads vs. max_cpus;
Fabian Huch <huch@in.tum.de>
parents:
79926
diff
changeset
|
392 |
else the_host(node_info).max_threads |
78845
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
393 |
|
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
394 |
def available(state: Build_Process.State): Resources = { |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
395 |
val allocated = |
79594 | 396 |
state.running.values.map(_.node_info).groupMapReduce(_.hostname)(List(_))(_ ::: _) |
397 |
new Resources(this, allocated) |
|
78845
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
398 |
} |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
399 |
} |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
400 |
|
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
401 |
|
79029 | 402 |
/* offline tracking of job configurations and resource allocations */ |
403 |
||
404 |
case class Config(job_name: String, node_info: Node_Info) { |
|
405 |
def job_of(start_time: Time): Build_Process.Job = |
|
406 |
Build_Process.Job(job_name, "", "", node_info, Date(start_time), None) |
|
407 |
} |
|
78845
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
408 |
|
79594 | 409 |
class Resources( |
410 |
val host_infos: Host_Infos, |
|
411 |
allocated_nodes: Map[String, List[Node_Info]] |
|
78845
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
412 |
) { |
79106 | 413 |
def unused_nodes(host: Host, threads: Int): List[Node_Info] = |
414 |
if (!available(host, threads)) Nil |
|
415 |
else { |
|
416 |
val node = next_node(host, threads) |
|
417 |
node :: allocate(node).unused_nodes(host, threads) |
|
418 |
} |
|
419 |
||
420 |
def unused_nodes(threads: Int): List[Node_Info] = |
|
421 |
host_infos.hosts.flatMap(unused_nodes(_, threads)) |
|
78845
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
422 |
|
79594 | 423 |
def allocated(host: Host): List[Node_Info] = allocated_nodes.getOrElse(host.name, Nil) |
78845
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
424 |
|
79593 | 425 |
def allocate(node_info: Node_Info): Resources = { |
426 |
val host = host_infos.the_host(node_info) |
|
79594 | 427 |
new Resources(host_infos, allocated_nodes + (host.name -> (node_info :: allocated(host)))) |
78845
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
428 |
} |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
429 |
|
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
430 |
def try_allocate_tasks( |
78971
f930d24f1548
scheduled build: allocate cpus more aggressively, to avoid idle threads;
Fabian Huch <huch@in.tum.de>
parents:
78970
diff
changeset
|
431 |
hosts: List[(Host, Int)], |
f930d24f1548
scheduled build: allocate cpus more aggressively, to avoid idle threads;
Fabian Huch <huch@in.tum.de>
parents:
78970
diff
changeset
|
432 |
tasks: List[(Build_Process.Task, Int, Int)], |
78845
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
433 |
): (List[Config], Resources) = |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
434 |
tasks match { |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
435 |
case Nil => (Nil, this) |
78971
f930d24f1548
scheduled build: allocate cpus more aggressively, to avoid idle threads;
Fabian Huch <huch@in.tum.de>
parents:
78970
diff
changeset
|
436 |
case (task, min_threads, max_threads) :: tasks => |
78845
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
437 |
val (config, resources) = |
78971
f930d24f1548
scheduled build: allocate cpus more aggressively, to avoid idle threads;
Fabian Huch <huch@in.tum.de>
parents:
78970
diff
changeset
|
438 |
hosts.find((host, _) => available(host, min_threads)) match { |
f930d24f1548
scheduled build: allocate cpus more aggressively, to avoid idle threads;
Fabian Huch <huch@in.tum.de>
parents:
78970
diff
changeset
|
439 |
case Some((host, host_max_threads)) => |
79927
4359257218ce
clarify use of num_threads vs. max_cpus;
Fabian Huch <huch@in.tum.de>
parents:
79926
diff
changeset
|
440 |
val free_threads = host.max_threads - ((host.max_jobs - 1) * host_max_threads) |
78971
f930d24f1548
scheduled build: allocate cpus more aggressively, to avoid idle threads;
Fabian Huch <huch@in.tum.de>
parents:
78970
diff
changeset
|
441 |
val node_info = next_node(host, (min_threads max free_threads) min max_threads) |
78845
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
442 |
(Some(Config(task.name, node_info)), allocate(node_info)) |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
443 |
case None => (None, this) |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
444 |
} |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
445 |
val (configs, resources1) = resources.try_allocate_tasks(hosts, tasks) |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
446 |
(configs ++ config, resources1) |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
447 |
} |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
448 |
|
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
449 |
def next_node(host: Host, threads: Int): Node_Info = { |
79880
a3d53f2bc41d
clarified build schedule host: proper module;
Fabian Huch <huch@in.tum.de>
parents:
79879
diff
changeset
|
450 |
val numa_node_num_cpus = host.num_cpus / (host.numa_nodes.length max 1) |
78845
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
451 |
def explicit_cpus(node_info: Node_Info): List[Int] = |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
452 |
if (node_info.rel_cpus.nonEmpty) node_info.rel_cpus else (0 until numa_node_num_cpus).toList |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
453 |
|
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
454 |
val used_nodes = allocated(host).groupMapReduce(_.numa_node)(explicit_cpus)(_ ::: _) |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
455 |
|
79880
a3d53f2bc41d
clarified build schedule host: proper module;
Fabian Huch <huch@in.tum.de>
parents:
79879
diff
changeset
|
456 |
val available_nodes = host.numa_nodes |
78845
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
457 |
val numa_node = |
79880
a3d53f2bc41d
clarified build schedule host: proper module;
Fabian Huch <huch@in.tum.de>
parents:
79879
diff
changeset
|
458 |
if (!host.numa) None |
78845
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
459 |
else available_nodes.sortBy(n => used_nodes.getOrElse(Some(n), Nil).length).headOption |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
460 |
|
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
461 |
val used_cpus = used_nodes.getOrElse(numa_node, Nil).toSet |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
462 |
val available_cpus = (0 until numa_node_num_cpus).filterNot(used_cpus.contains).toList |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
463 |
|
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
464 |
val rel_cpus = if (available_cpus.length >= threads) available_cpus.take(threads) else Nil |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
465 |
|
79103
883f61f0beda
clarified build schedule host: more operations;
Fabian Huch <huch@in.tum.de>
parents:
79102
diff
changeset
|
466 |
Node_Info(host.name, numa_node, rel_cpus) |
78845
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
467 |
} |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
468 |
|
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
469 |
def available(host: Host, threads: Int): Boolean = { |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
470 |
val used = allocated(host) |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
471 |
|
79880
a3d53f2bc41d
clarified build schedule host: proper module;
Fabian Huch <huch@in.tum.de>
parents:
79879
diff
changeset
|
472 |
if (used.length >= host.max_jobs) false |
78845
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
473 |
else { |
80109
dbcd6dc7f70f
back to static numa_nodes (reverting part of c2c59de57df9);
wenzelm
parents:
80056
diff
changeset
|
474 |
if (host.numa_nodes.length <= 1) { |
79927
4359257218ce
clarify use of num_threads vs. max_cpus;
Fabian Huch <huch@in.tum.de>
parents:
79926
diff
changeset
|
475 |
used.map(host_infos.num_threads).sum + threads <= host.max_threads |
80109
dbcd6dc7f70f
back to static numa_nodes (reverting part of c2c59de57df9);
wenzelm
parents:
80056
diff
changeset
|
476 |
} |
78845
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
477 |
else { |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
478 |
def node_threads(n: Int): Int = |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
479 |
used.filter(_.numa_node.contains(n)).map(host_infos.num_threads).sum |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
480 |
|
79880
a3d53f2bc41d
clarified build schedule host: proper module;
Fabian Huch <huch@in.tum.de>
parents:
79879
diff
changeset
|
481 |
host.numa_nodes.exists( |
a3d53f2bc41d
clarified build schedule host: proper module;
Fabian Huch <huch@in.tum.de>
parents:
79879
diff
changeset
|
482 |
node_threads(_) + threads <= host.num_cpus / host.numa_nodes.length) |
78845
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
483 |
} |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
484 |
} |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
485 |
} |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
486 |
} |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
487 |
|
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
488 |
|
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
489 |
/* schedule generation */ |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
490 |
|
79073
b3fee0dafd72
generated build schedule explicitly (e.g., for further analysis);
Fabian Huch <huch@in.tum.de>
parents:
79064
diff
changeset
|
491 |
object Schedule { |
b3fee0dafd72
generated build schedule explicitly (e.g., for further analysis);
Fabian Huch <huch@in.tum.de>
parents:
79064
diff
changeset
|
492 |
case class Node(job_name: String, node_info: Node_Info, start: Date, duration: Time) { |
b3fee0dafd72
generated build schedule explicitly (e.g., for further analysis);
Fabian Huch <huch@in.tum.de>
parents:
79064
diff
changeset
|
493 |
def end: Date = Date(start.time + duration) |
b3fee0dafd72
generated build schedule explicitly (e.g., for further analysis);
Fabian Huch <huch@in.tum.de>
parents:
79064
diff
changeset
|
494 |
} |
b3fee0dafd72
generated build schedule explicitly (e.g., for further analysis);
Fabian Huch <huch@in.tum.de>
parents:
79064
diff
changeset
|
495 |
|
b3fee0dafd72
generated build schedule explicitly (e.g., for further analysis);
Fabian Huch <huch@in.tum.de>
parents:
79064
diff
changeset
|
496 |
type Graph = isabelle.Graph[String, Node] |
79183
32d00ec387f4
use schedule directly instead of extra cache;
Fabian Huch <huch@in.tum.de>
parents:
79182
diff
changeset
|
497 |
|
79185 | 498 |
def init(build_uuid: String): Schedule = Schedule(build_uuid, "none", Date.now(), Graph.empty) |
79914
9da3019e1ee5
file representation for schedule (e.g., for generating from external tool);
Fabian Huch <huch@in.tum.de>
parents:
79913
diff
changeset
|
499 |
|
9da3019e1ee5
file representation for schedule (e.g., for generating from external tool);
Fabian Huch <huch@in.tum.de>
parents:
79913
diff
changeset
|
500 |
|
9da3019e1ee5
file representation for schedule (e.g., for generating from external tool);
Fabian Huch <huch@in.tum.de>
parents:
79913
diff
changeset
|
501 |
/* file representation */ |
9da3019e1ee5
file representation for schedule (e.g., for generating from external tool);
Fabian Huch <huch@in.tum.de>
parents:
79913
diff
changeset
|
502 |
|
9da3019e1ee5
file representation for schedule (e.g., for generating from external tool);
Fabian Huch <huch@in.tum.de>
parents:
79913
diff
changeset
|
503 |
def write(value: Schedule, file: Path): Unit = { |
9da3019e1ee5
file representation for schedule (e.g., for generating from external tool);
Fabian Huch <huch@in.tum.de>
parents:
79913
diff
changeset
|
504 |
import XML.Encode._ |
9da3019e1ee5
file representation for schedule (e.g., for generating from external tool);
Fabian Huch <huch@in.tum.de>
parents:
79913
diff
changeset
|
505 |
|
9da3019e1ee5
file representation for schedule (e.g., for generating from external tool);
Fabian Huch <huch@in.tum.de>
parents:
79913
diff
changeset
|
506 |
def time: T[Time] = (time => long(time.ms)) |
79916
cfeb3a8f241d
read/write proper schedule date (amending 9da3019e1ee5);
Fabian Huch <huch@in.tum.de>
parents:
79915
diff
changeset
|
507 |
def date: T[Date] = (date => time(date.time)) |
79914
9da3019e1ee5
file representation for schedule (e.g., for generating from external tool);
Fabian Huch <huch@in.tum.de>
parents:
79913
diff
changeset
|
508 |
def node_info: T[Node_Info] = |
9da3019e1ee5
file representation for schedule (e.g., for generating from external tool);
Fabian Huch <huch@in.tum.de>
parents:
79913
diff
changeset
|
509 |
(node_info => triple(string, option(int), list(int))( |
9da3019e1ee5
file representation for schedule (e.g., for generating from external tool);
Fabian Huch <huch@in.tum.de>
parents:
79913
diff
changeset
|
510 |
(node_info.hostname, node_info.numa_node, node_info.rel_cpus))) |
9da3019e1ee5
file representation for schedule (e.g., for generating from external tool);
Fabian Huch <huch@in.tum.de>
parents:
79913
diff
changeset
|
511 |
def node: T[Node] = |
9da3019e1ee5
file representation for schedule (e.g., for generating from external tool);
Fabian Huch <huch@in.tum.de>
parents:
79913
diff
changeset
|
512 |
(node => pair(string, pair(node_info, pair(date, time)))( |
9da3019e1ee5
file representation for schedule (e.g., for generating from external tool);
Fabian Huch <huch@in.tum.de>
parents:
79913
diff
changeset
|
513 |
(node.job_name, (node.node_info, (node.start, node.duration))))) |
9da3019e1ee5
file representation for schedule (e.g., for generating from external tool);
Fabian Huch <huch@in.tum.de>
parents:
79913
diff
changeset
|
514 |
def schedule: T[Schedule] = |
9da3019e1ee5
file representation for schedule (e.g., for generating from external tool);
Fabian Huch <huch@in.tum.de>
parents:
79913
diff
changeset
|
515 |
(schedule => |
9da3019e1ee5
file representation for schedule (e.g., for generating from external tool);
Fabian Huch <huch@in.tum.de>
parents:
79913
diff
changeset
|
516 |
pair(string, pair(string, pair(date, pair(Graph.encode(string, node), long))))(( |
9da3019e1ee5
file representation for schedule (e.g., for generating from external tool);
Fabian Huch <huch@in.tum.de>
parents:
79913
diff
changeset
|
517 |
schedule.build_uuid, (schedule.generator, (schedule.start, (schedule.graph, |
9da3019e1ee5
file representation for schedule (e.g., for generating from external tool);
Fabian Huch <huch@in.tum.de>
parents:
79913
diff
changeset
|
518 |
schedule.serial)))))) |
9da3019e1ee5
file representation for schedule (e.g., for generating from external tool);
Fabian Huch <huch@in.tum.de>
parents:
79913
diff
changeset
|
519 |
|
9da3019e1ee5
file representation for schedule (e.g., for generating from external tool);
Fabian Huch <huch@in.tum.de>
parents:
79913
diff
changeset
|
520 |
File.write(file, YXML.string_of_body(schedule(value))) |
9da3019e1ee5
file representation for schedule (e.g., for generating from external tool);
Fabian Huch <huch@in.tum.de>
parents:
79913
diff
changeset
|
521 |
} |
9da3019e1ee5
file representation for schedule (e.g., for generating from external tool);
Fabian Huch <huch@in.tum.de>
parents:
79913
diff
changeset
|
522 |
|
9da3019e1ee5
file representation for schedule (e.g., for generating from external tool);
Fabian Huch <huch@in.tum.de>
parents:
79913
diff
changeset
|
523 |
def read(file: Path): Schedule = { |
9da3019e1ee5
file representation for schedule (e.g., for generating from external tool);
Fabian Huch <huch@in.tum.de>
parents:
79913
diff
changeset
|
524 |
import XML.Decode._ |
9da3019e1ee5
file representation for schedule (e.g., for generating from external tool);
Fabian Huch <huch@in.tum.de>
parents:
79913
diff
changeset
|
525 |
|
9da3019e1ee5
file representation for schedule (e.g., for generating from external tool);
Fabian Huch <huch@in.tum.de>
parents:
79913
diff
changeset
|
526 |
def time: T[Time] = { body => Time.ms(long(body)) } |
79916
cfeb3a8f241d
read/write proper schedule date (amending 9da3019e1ee5);
Fabian Huch <huch@in.tum.de>
parents:
79915
diff
changeset
|
527 |
def date: T[Date] = { body => Date(time(body)) } |
79914
9da3019e1ee5
file representation for schedule (e.g., for generating from external tool);
Fabian Huch <huch@in.tum.de>
parents:
79913
diff
changeset
|
528 |
def node_info: T[Node_Info] = |
9da3019e1ee5
file representation for schedule (e.g., for generating from external tool);
Fabian Huch <huch@in.tum.de>
parents:
79913
diff
changeset
|
529 |
{ body => |
9da3019e1ee5
file representation for schedule (e.g., for generating from external tool);
Fabian Huch <huch@in.tum.de>
parents:
79913
diff
changeset
|
530 |
val (hostname, numa_node, rel_cpus) = triple(string, option(int), list(int))(body) |
9da3019e1ee5
file representation for schedule (e.g., for generating from external tool);
Fabian Huch <huch@in.tum.de>
parents:
79913
diff
changeset
|
531 |
Node_Info(hostname, numa_node, rel_cpus) |
9da3019e1ee5
file representation for schedule (e.g., for generating from external tool);
Fabian Huch <huch@in.tum.de>
parents:
79913
diff
changeset
|
532 |
} |
9da3019e1ee5
file representation for schedule (e.g., for generating from external tool);
Fabian Huch <huch@in.tum.de>
parents:
79913
diff
changeset
|
533 |
val node: T[Schedule.Node] = |
9da3019e1ee5
file representation for schedule (e.g., for generating from external tool);
Fabian Huch <huch@in.tum.de>
parents:
79913
diff
changeset
|
534 |
{ body => |
9da3019e1ee5
file representation for schedule (e.g., for generating from external tool);
Fabian Huch <huch@in.tum.de>
parents:
79913
diff
changeset
|
535 |
val (job_name, (info, (start, duration))) = |
9da3019e1ee5
file representation for schedule (e.g., for generating from external tool);
Fabian Huch <huch@in.tum.de>
parents:
79913
diff
changeset
|
536 |
pair(string, pair(node_info, pair(date, time)))(body) |
9da3019e1ee5
file representation for schedule (e.g., for generating from external tool);
Fabian Huch <huch@in.tum.de>
parents:
79913
diff
changeset
|
537 |
Node(job_name, info, start, duration) |
9da3019e1ee5
file representation for schedule (e.g., for generating from external tool);
Fabian Huch <huch@in.tum.de>
parents:
79913
diff
changeset
|
538 |
} |
9da3019e1ee5
file representation for schedule (e.g., for generating from external tool);
Fabian Huch <huch@in.tum.de>
parents:
79913
diff
changeset
|
539 |
def schedule: T[Schedule] = |
9da3019e1ee5
file representation for schedule (e.g., for generating from external tool);
Fabian Huch <huch@in.tum.de>
parents:
79913
diff
changeset
|
540 |
{ body => |
9da3019e1ee5
file representation for schedule (e.g., for generating from external tool);
Fabian Huch <huch@in.tum.de>
parents:
79913
diff
changeset
|
541 |
val (build_uuid, (generator, (start, (graph, serial)))) = |
9da3019e1ee5
file representation for schedule (e.g., for generating from external tool);
Fabian Huch <huch@in.tum.de>
parents:
79913
diff
changeset
|
542 |
pair(string, pair(string, (pair(date, pair(Graph.decode(string, node), long)))))(body) |
9da3019e1ee5
file representation for schedule (e.g., for generating from external tool);
Fabian Huch <huch@in.tum.de>
parents:
79913
diff
changeset
|
543 |
Schedule(build_uuid, generator, start, graph, serial) |
9da3019e1ee5
file representation for schedule (e.g., for generating from external tool);
Fabian Huch <huch@in.tum.de>
parents:
79913
diff
changeset
|
544 |
} |
9da3019e1ee5
file representation for schedule (e.g., for generating from external tool);
Fabian Huch <huch@in.tum.de>
parents:
79913
diff
changeset
|
545 |
|
9da3019e1ee5
file representation for schedule (e.g., for generating from external tool);
Fabian Huch <huch@in.tum.de>
parents:
79913
diff
changeset
|
546 |
schedule(YXML.parse_body(File.read(file))) |
9da3019e1ee5
file representation for schedule (e.g., for generating from external tool);
Fabian Huch <huch@in.tum.de>
parents:
79913
diff
changeset
|
547 |
} |
79073
b3fee0dafd72
generated build schedule explicitly (e.g., for further analysis);
Fabian Huch <huch@in.tum.de>
parents:
79064
diff
changeset
|
548 |
} |
b3fee0dafd72
generated build schedule explicitly (e.g., for further analysis);
Fabian Huch <huch@in.tum.de>
parents:
79064
diff
changeset
|
549 |
|
79190
2039f3609884
add serial for build schedule to avoid unnecessary db read/writes;
Fabian Huch <huch@in.tum.de>
parents:
79189
diff
changeset
|
550 |
case class Schedule( |
2039f3609884
add serial for build schedule to avoid unnecessary db read/writes;
Fabian Huch <huch@in.tum.de>
parents:
79189
diff
changeset
|
551 |
build_uuid: String, |
2039f3609884
add serial for build schedule to avoid unnecessary db read/writes;
Fabian Huch <huch@in.tum.de>
parents:
79189
diff
changeset
|
552 |
generator: String, |
2039f3609884
add serial for build schedule to avoid unnecessary db read/writes;
Fabian Huch <huch@in.tum.de>
parents:
79189
diff
changeset
|
553 |
start: Date, |
2039f3609884
add serial for build schedule to avoid unnecessary db read/writes;
Fabian Huch <huch@in.tum.de>
parents:
79189
diff
changeset
|
554 |
graph: Schedule.Graph, |
2039f3609884
add serial for build schedule to avoid unnecessary db read/writes;
Fabian Huch <huch@in.tum.de>
parents:
79189
diff
changeset
|
555 |
serial: Long = 0, |
2039f3609884
add serial for build schedule to avoid unnecessary db read/writes;
Fabian Huch <huch@in.tum.de>
parents:
79189
diff
changeset
|
556 |
) { |
79835 | 557 |
def next_serial: Long = Build_Process.State.inc_serial(serial) |
558 |
||
79073
b3fee0dafd72
generated build schedule explicitly (e.g., for further analysis);
Fabian Huch <huch@in.tum.de>
parents:
79064
diff
changeset
|
559 |
def end: Date = |
b3fee0dafd72
generated build schedule explicitly (e.g., for further analysis);
Fabian Huch <huch@in.tum.de>
parents:
79064
diff
changeset
|
560 |
if (graph.is_empty) start |
79897 | 561 |
else graph.maximals.map(graph.get_node).map(_.end).max(Date.Ordering) |
79073
b3fee0dafd72
generated build schedule explicitly (e.g., for further analysis);
Fabian Huch <huch@in.tum.de>
parents:
79064
diff
changeset
|
562 |
|
79819 | 563 |
def duration: Time = end - start |
79910
fbfa7d25749a
tie-breaking in schedule optimization to pick best schedule even when run-time is dominated by large task (e.g., session with long timeout but no data yet);
Fabian Huch <huch@in.tum.de>
parents:
79909
diff
changeset
|
564 |
def durations: List[Time] = graph.keys.map(graph.get_node(_).end - start) |
79109
c1255d9870f6
clarified heuristics toString;
Fabian Huch <huch@in.tum.de>
parents:
79108
diff
changeset
|
565 |
def message: String = "Estimated " + duration.message_hms + " build time with " + generator |
79183
32d00ec387f4
use schedule directly instead of extra cache;
Fabian Huch <huch@in.tum.de>
parents:
79182
diff
changeset
|
566 |
|
79819 | 567 |
def deviation(other: Schedule): Time = Time.ms((end - other.end).ms.abs) |
79192
5db03f9276e2
clarified: build schedules may be outdated when empty, after some time, or due to build progress;
Fabian Huch <huch@in.tum.de>
parents:
79191
diff
changeset
|
568 |
|
5db03f9276e2
clarified: build schedules may be outdated when empty, after some time, or due to build progress;
Fabian Huch <huch@in.tum.de>
parents:
79191
diff
changeset
|
569 |
def num_built(state: Build_Process.State): Int = graph.keys.count(state.results.contains) |
5db03f9276e2
clarified: build schedules may be outdated when empty, after some time, or due to build progress;
Fabian Huch <huch@in.tum.de>
parents:
79191
diff
changeset
|
570 |
def elapsed(): Time = Time.now() - start.time |
79293 | 571 |
def is_empty: Boolean = graph.is_empty |
79289
7c1faa16554b
add delay and limit options for when schedule is considered outdated;
Fabian Huch <huch@in.tum.de>
parents:
79288
diff
changeset
|
572 |
def is_outdated(options: Options, state: Build_Process.State): Boolean = |
79293 | 573 |
if (is_empty) true |
79912
fe96a842f065
remove schedule outdated limit: delay is sufficient;
Fabian Huch <huch@in.tum.de>
parents:
79911
diff
changeset
|
574 |
else elapsed() > options.seconds("build_schedule_outdated_delay") |
79183
32d00ec387f4
use schedule directly instead of extra cache;
Fabian Huch <huch@in.tum.de>
parents:
79182
diff
changeset
|
575 |
|
79921
1966578feff8
start scheduled jobs earlier, if possible;
Fabian Huch <huch@in.tum.de>
parents:
79916
diff
changeset
|
576 |
def next(hostname: String, state: Build_Process.State): List[String] = { |
79946
05e034a54924
only start jobs early if they are due (cf. 1966578feff8);
Fabian Huch <huch@in.tum.de>
parents:
79935
diff
changeset
|
577 |
val now = Time.now() |
05e034a54924
only start jobs early if they are due (cf. 1966578feff8);
Fabian Huch <huch@in.tum.de>
parents:
79935
diff
changeset
|
578 |
|
79921
1966578feff8
start scheduled jobs earlier, if possible;
Fabian Huch <huch@in.tum.de>
parents:
79916
diff
changeset
|
579 |
val next_nodes = |
1966578feff8
start scheduled jobs earlier, if possible;
Fabian Huch <huch@in.tum.de>
parents:
79916
diff
changeset
|
580 |
for { |
1966578feff8
start scheduled jobs earlier, if possible;
Fabian Huch <huch@in.tum.de>
parents:
79916
diff
changeset
|
581 |
task <- state.next_ready |
79931
f08e5a234c1b
always check if node is defined, e.g. for exists_next operation wit empty schedule;
Fabian Huch <huch@in.tum.de>
parents:
79928
diff
changeset
|
582 |
if graph.defined(task.name) |
79921
1966578feff8
start scheduled jobs earlier, if possible;
Fabian Huch <huch@in.tum.de>
parents:
79916
diff
changeset
|
583 |
node = graph.get_node(task.name) |
1966578feff8
start scheduled jobs earlier, if possible;
Fabian Huch <huch@in.tum.de>
parents:
79916
diff
changeset
|
584 |
if hostname == node.node_info.hostname |
1966578feff8
start scheduled jobs earlier, if possible;
Fabian Huch <huch@in.tum.de>
parents:
79916
diff
changeset
|
585 |
} yield node |
1966578feff8
start scheduled jobs earlier, if possible;
Fabian Huch <huch@in.tum.de>
parents:
79916
diff
changeset
|
586 |
|
79946
05e034a54924
only start jobs early if they are due (cf. 1966578feff8);
Fabian Huch <huch@in.tum.de>
parents:
79935
diff
changeset
|
587 |
val (ready, other) = |
79921
1966578feff8
start scheduled jobs earlier, if possible;
Fabian Huch <huch@in.tum.de>
parents:
79916
diff
changeset
|
588 |
next_nodes.partition(node => graph.imm_preds(node.job_name).subsetOf(state.results.keySet)) |
79946
05e034a54924
only start jobs early if they are due (cf. 1966578feff8);
Fabian Huch <huch@in.tum.de>
parents:
79935
diff
changeset
|
589 |
|
05e034a54924
only start jobs early if they are due (cf. 1966578feff8);
Fabian Huch <huch@in.tum.de>
parents:
79935
diff
changeset
|
590 |
val waiting = other.filter(_.start.time <= now) |
79921
1966578feff8
start scheduled jobs earlier, if possible;
Fabian Huch <huch@in.tum.de>
parents:
79916
diff
changeset
|
591 |
val running = state.running.values.toList.map(_.node_info).filter(_.hostname == hostname) |
1966578feff8
start scheduled jobs earlier, if possible;
Fabian Huch <huch@in.tum.de>
parents:
79916
diff
changeset
|
592 |
|
1966578feff8
start scheduled jobs earlier, if possible;
Fabian Huch <huch@in.tum.de>
parents:
79916
diff
changeset
|
593 |
def try_run(ready: List[Schedule.Node], next: Schedule.Node): List[Schedule.Node] = { |
1966578feff8
start scheduled jobs earlier, if possible;
Fabian Huch <huch@in.tum.de>
parents:
79916
diff
changeset
|
594 |
val existing = ready.map(_.node_info) ::: running |
1966578feff8
start scheduled jobs earlier, if possible;
Fabian Huch <huch@in.tum.de>
parents:
79916
diff
changeset
|
595 |
val is_distinct = existing.forall(_.rel_cpus.intersect(next.node_info.rel_cpus).isEmpty) |
1966578feff8
start scheduled jobs earlier, if possible;
Fabian Huch <huch@in.tum.de>
parents:
79916
diff
changeset
|
596 |
if (existing.forall(_.rel_cpus.nonEmpty) && is_distinct) next :: ready else ready |
1966578feff8
start scheduled jobs earlier, if possible;
Fabian Huch <huch@in.tum.de>
parents:
79916
diff
changeset
|
597 |
} |
1966578feff8
start scheduled jobs earlier, if possible;
Fabian Huch <huch@in.tum.de>
parents:
79916
diff
changeset
|
598 |
|
1966578feff8
start scheduled jobs earlier, if possible;
Fabian Huch <huch@in.tum.de>
parents:
79916
diff
changeset
|
599 |
waiting.foldLeft(ready)(try_run).map(_.job_name) |
1966578feff8
start scheduled jobs earlier, if possible;
Fabian Huch <huch@in.tum.de>
parents:
79916
diff
changeset
|
600 |
} |
79193
d1d6dbab2901
compare previous build schedule with new one, to prevent regressions;
Fabian Huch <huch@in.tum.de>
parents:
79192
diff
changeset
|
601 |
|
79910
fbfa7d25749a
tie-breaking in schedule optimization to pick best schedule even when run-time is dominated by large task (e.g., session with long timeout but no data yet);
Fabian Huch <huch@in.tum.de>
parents:
79909
diff
changeset
|
602 |
def exists_next(hostname: String, state: Build_Process.State): Boolean = |
79896
2c9c5ae99a09
proper IPC for scheduled builds, following 7ae25372ab04;
Fabian Huch <huch@in.tum.de>
parents:
79895
diff
changeset
|
603 |
next(hostname, state).nonEmpty |
79911 | 604 |
|
79193
d1d6dbab2901
compare previous build schedule with new one, to prevent regressions;
Fabian Huch <huch@in.tum.de>
parents:
79192
diff
changeset
|
605 |
def update(state: Build_Process.State): Schedule = { |
d1d6dbab2901
compare previous build schedule with new one, to prevent regressions;
Fabian Huch <huch@in.tum.de>
parents:
79192
diff
changeset
|
606 |
val start1 = Date.now() |
d1d6dbab2901
compare previous build schedule with new one, to prevent regressions;
Fabian Huch <huch@in.tum.de>
parents:
79192
diff
changeset
|
607 |
|
d1d6dbab2901
compare previous build schedule with new one, to prevent regressions;
Fabian Huch <huch@in.tum.de>
parents:
79192
diff
changeset
|
608 |
def shift_elapsed(graph: Schedule.Graph, name: String): Schedule.Graph = |
d1d6dbab2901
compare previous build schedule with new one, to prevent regressions;
Fabian Huch <huch@in.tum.de>
parents:
79192
diff
changeset
|
609 |
graph.map_node(name, { node => |
79819 | 610 |
val elapsed = start1 - state.running(name).start_date |
79897 | 611 |
node.copy(duration = (node.duration - elapsed).max(Time.zero)) |
79193
d1d6dbab2901
compare previous build schedule with new one, to prevent regressions;
Fabian Huch <huch@in.tum.de>
parents:
79192
diff
changeset
|
612 |
}) |
d1d6dbab2901
compare previous build schedule with new one, to prevent regressions;
Fabian Huch <huch@in.tum.de>
parents:
79192
diff
changeset
|
613 |
|
d1d6dbab2901
compare previous build schedule with new one, to prevent regressions;
Fabian Huch <huch@in.tum.de>
parents:
79192
diff
changeset
|
614 |
def shift_starts(graph: Schedule.Graph, name: String): Schedule.Graph = |
d1d6dbab2901
compare previous build schedule with new one, to prevent regressions;
Fabian Huch <huch@in.tum.de>
parents:
79192
diff
changeset
|
615 |
graph.map_node(name, { node => |
d1d6dbab2901
compare previous build schedule with new one, to prevent regressions;
Fabian Huch <huch@in.tum.de>
parents:
79192
diff
changeset
|
616 |
val starts = start1 :: graph.imm_preds(node.job_name).toList.map(graph.get_node(_).end) |
d1d6dbab2901
compare previous build schedule with new one, to prevent regressions;
Fabian Huch <huch@in.tum.de>
parents:
79192
diff
changeset
|
617 |
node.copy(start = starts.max(Date.Ordering)) |
d1d6dbab2901
compare previous build schedule with new one, to prevent regressions;
Fabian Huch <huch@in.tum.de>
parents:
79192
diff
changeset
|
618 |
}) |
d1d6dbab2901
compare previous build schedule with new one, to prevent regressions;
Fabian Huch <huch@in.tum.de>
parents:
79192
diff
changeset
|
619 |
|
79828
5969ead9f900
clarified data representation: more uniform treatment of State.Pending vs. State.Running;
wenzelm
parents:
79819
diff
changeset
|
620 |
val graph0 = |
5969ead9f900
clarified data representation: more uniform treatment of State.Pending vs. State.Running;
wenzelm
parents:
79819
diff
changeset
|
621 |
state.running.keys.foldLeft(graph.restrict(state.pending.isDefinedAt))(shift_elapsed) |
79193
d1d6dbab2901
compare previous build schedule with new one, to prevent regressions;
Fabian Huch <huch@in.tum.de>
parents:
79192
diff
changeset
|
622 |
val graph1 = graph0.topological_order.foldLeft(graph0)(shift_starts) |
d1d6dbab2901
compare previous build schedule with new one, to prevent regressions;
Fabian Huch <huch@in.tum.de>
parents:
79192
diff
changeset
|
623 |
|
d1d6dbab2901
compare previous build schedule with new one, to prevent regressions;
Fabian Huch <huch@in.tum.de>
parents:
79192
diff
changeset
|
624 |
copy(start = start1, graph = graph1) |
d1d6dbab2901
compare previous build schedule with new one, to prevent regressions;
Fabian Huch <huch@in.tum.de>
parents:
79192
diff
changeset
|
625 |
} |
79073
b3fee0dafd72
generated build schedule explicitly (e.g., for further analysis);
Fabian Huch <huch@in.tum.de>
parents:
79064
diff
changeset
|
626 |
} |
b3fee0dafd72
generated build schedule explicitly (e.g., for further analysis);
Fabian Huch <huch@in.tum.de>
parents:
79064
diff
changeset
|
627 |
|
b3fee0dafd72
generated build schedule explicitly (e.g., for further analysis);
Fabian Huch <huch@in.tum.de>
parents:
79064
diff
changeset
|
628 |
case class State(build_state: Build_Process.State, current_time: Time, finished: Schedule) { |
78845
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
629 |
def start(config: Config): State = |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
630 |
copy(build_state = |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
631 |
build_state.copy(running = build_state.running + |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
632 |
(config.job_name -> config.job_of(current_time)))) |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
633 |
|
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
634 |
def step(timing_data: Timing_Data): State = { |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
635 |
val remaining = |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
636 |
build_state.running.values.toList.map { job => |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
637 |
val elapsed = current_time - job.start_date.time |
79026
6585acdd6505
clarified time estimation: does not use config;
Fabian Huch <huch@in.tum.de>
parents:
79025
diff
changeset
|
638 |
val threads = timing_data.host_infos.num_threads(job.node_info) |
6585acdd6505
clarified time estimation: does not use config;
Fabian Huch <huch@in.tum.de>
parents:
79025
diff
changeset
|
639 |
val predicted = timing_data.estimate(job.name, job.node_info.hostname, threads) |
78845
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
640 |
val remaining = if (elapsed > predicted) Time.zero else predicted - elapsed |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
641 |
job -> remaining |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
642 |
} |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
643 |
|
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
644 |
if (remaining.isEmpty) error("Schedule step without running sessions") |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
645 |
else { |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
646 |
val (job, elapsed) = remaining.minBy(_._2.ms) |
79073
b3fee0dafd72
generated build schedule explicitly (e.g., for further analysis);
Fabian Huch <huch@in.tum.de>
parents:
79064
diff
changeset
|
647 |
val now = current_time + elapsed |
b3fee0dafd72
generated build schedule explicitly (e.g., for further analysis);
Fabian Huch <huch@in.tum.de>
parents:
79064
diff
changeset
|
648 |
val node = Schedule.Node(job.name, job.node_info, job.start_date, now - job.start_date.time) |
b3fee0dafd72
generated build schedule explicitly (e.g., for further analysis);
Fabian Huch <huch@in.tum.de>
parents:
79064
diff
changeset
|
649 |
|
79191
ee405c40db72
store previous build jobs in graph so schedules can be used later in the build process;
Fabian Huch <huch@in.tum.de>
parents:
79190
diff
changeset
|
650 |
val host_preds = |
ee405c40db72
store previous build jobs in graph so schedules can be used later in the build process;
Fabian Huch <huch@in.tum.de>
parents:
79190
diff
changeset
|
651 |
for { |
79594 | 652 |
name <- finished.graph.keys |
653 |
pred_node = finished.graph.get_node(name) |
|
79236
6dc4fd89987f
filter predecessors properly (amending ee405c40db72);
Fabian Huch <huch@in.tum.de>
parents:
79235
diff
changeset
|
654 |
if pred_node.node_info.hostname == job.node_info.hostname |
6dc4fd89987f
filter predecessors properly (amending ee405c40db72);
Fabian Huch <huch@in.tum.de>
parents:
79235
diff
changeset
|
655 |
if pred_node.end.time <= node.start.time |
79191
ee405c40db72
store previous build jobs in graph so schedules can be used later in the build process;
Fabian Huch <huch@in.tum.de>
parents:
79190
diff
changeset
|
656 |
} yield name |
ee405c40db72
store previous build jobs in graph so schedules can be used later in the build process;
Fabian Huch <huch@in.tum.de>
parents:
79190
diff
changeset
|
657 |
val build_preds = |
79073
b3fee0dafd72
generated build schedule explicitly (e.g., for further analysis);
Fabian Huch <huch@in.tum.de>
parents:
79064
diff
changeset
|
658 |
build_state.sessions.graph.imm_preds(job.name).filter(finished.graph.defined) |
79191
ee405c40db72
store previous build jobs in graph so schedules can be used later in the build process;
Fabian Huch <huch@in.tum.de>
parents:
79190
diff
changeset
|
659 |
val preds = build_preds ++ host_preds |
ee405c40db72
store previous build jobs in graph so schedules can be used later in the build process;
Fabian Huch <huch@in.tum.de>
parents:
79190
diff
changeset
|
660 |
|
ee405c40db72
store previous build jobs in graph so schedules can be used later in the build process;
Fabian Huch <huch@in.tum.de>
parents:
79190
diff
changeset
|
661 |
val graph = preds.foldLeft(finished.graph.new_node(job.name, node))(_.add_edge(_, job.name)) |
79073
b3fee0dafd72
generated build schedule explicitly (e.g., for further analysis);
Fabian Huch <huch@in.tum.de>
parents:
79064
diff
changeset
|
662 |
|
b3fee0dafd72
generated build schedule explicitly (e.g., for further analysis);
Fabian Huch <huch@in.tum.de>
parents:
79064
diff
changeset
|
663 |
val build_state1 = build_state.remove_running(job.name).remove_pending(job.name) |
b3fee0dafd72
generated build schedule explicitly (e.g., for further analysis);
Fabian Huch <huch@in.tum.de>
parents:
79064
diff
changeset
|
664 |
State(build_state1, now, finished.copy(graph = graph)) |
78845
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
665 |
} |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
666 |
} |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
667 |
|
79073
b3fee0dafd72
generated build schedule explicitly (e.g., for further analysis);
Fabian Huch <huch@in.tum.de>
parents:
79064
diff
changeset
|
668 |
def is_finished: Boolean = build_state.pending.isEmpty && build_state.running.isEmpty |
78845
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
669 |
} |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
670 |
|
79592
7db599be70cc
clarified scheduler: proper split into scheduler, generator, and priority rules (following 32d00ec387f4);
Fabian Huch <huch@in.tum.de>
parents:
79534
diff
changeset
|
671 |
trait Scheduler { def schedule(build_state: Build_Process.State): Schedule } |
7db599be70cc
clarified scheduler: proper split into scheduler, generator, and priority rules (following 32d00ec387f4);
Fabian Huch <huch@in.tum.de>
parents:
79534
diff
changeset
|
672 |
|
7db599be70cc
clarified scheduler: proper split into scheduler, generator, and priority rules (following 32d00ec387f4);
Fabian Huch <huch@in.tum.de>
parents:
79534
diff
changeset
|
673 |
trait Priority_Rule { def select_next(state: Build_Process.State): List[Config] } |
78931
26841d3c568c
performance tuning for build schedule: explicit schedule generation, without mixing heuristics;
Fabian Huch <huch@in.tum.de>
parents:
78930
diff
changeset
|
674 |
|
79592
7db599be70cc
clarified scheduler: proper split into scheduler, generator, and priority rules (following 32d00ec387f4);
Fabian Huch <huch@in.tum.de>
parents:
79534
diff
changeset
|
675 |
case class Generation_Scheme( |
7db599be70cc
clarified scheduler: proper split into scheduler, generator, and priority rules (following 32d00ec387f4);
Fabian Huch <huch@in.tum.de>
parents:
79534
diff
changeset
|
676 |
priority_rule: Priority_Rule, |
7db599be70cc
clarified scheduler: proper split into scheduler, generator, and priority rules (following 32d00ec387f4);
Fabian Huch <huch@in.tum.de>
parents:
79534
diff
changeset
|
677 |
timing_data: Timing_Data, |
7db599be70cc
clarified scheduler: proper split into scheduler, generator, and priority rules (following 32d00ec387f4);
Fabian Huch <huch@in.tum.de>
parents:
79534
diff
changeset
|
678 |
build_uuid: String |
7db599be70cc
clarified scheduler: proper split into scheduler, generator, and priority rules (following 32d00ec387f4);
Fabian Huch <huch@in.tum.de>
parents:
79534
diff
changeset
|
679 |
) extends Scheduler { |
7db599be70cc
clarified scheduler: proper split into scheduler, generator, and priority rules (following 32d00ec387f4);
Fabian Huch <huch@in.tum.de>
parents:
79534
diff
changeset
|
680 |
def schedule(build_state: Build_Process.State): Schedule = { |
78845
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
681 |
@tailrec |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
682 |
def simulate(state: State): State = |
79073
b3fee0dafd72
generated build schedule explicitly (e.g., for further analysis);
Fabian Huch <huch@in.tum.de>
parents:
79064
diff
changeset
|
683 |
if (state.is_finished) state |
78845
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
684 |
else { |
79592
7db599be70cc
clarified scheduler: proper split into scheduler, generator, and priority rules (following 32d00ec387f4);
Fabian Huch <huch@in.tum.de>
parents:
79534
diff
changeset
|
685 |
val state1 = |
7db599be70cc
clarified scheduler: proper split into scheduler, generator, and priority rules (following 32d00ec387f4);
Fabian Huch <huch@in.tum.de>
parents:
79534
diff
changeset
|
686 |
priority_rule |
7db599be70cc
clarified scheduler: proper split into scheduler, generator, and priority rules (following 32d00ec387f4);
Fabian Huch <huch@in.tum.de>
parents:
79534
diff
changeset
|
687 |
.select_next(state.build_state) |
7db599be70cc
clarified scheduler: proper split into scheduler, generator, and priority rules (following 32d00ec387f4);
Fabian Huch <huch@in.tum.de>
parents:
79534
diff
changeset
|
688 |
.foldLeft(state)(_.start(_)) |
7db599be70cc
clarified scheduler: proper split into scheduler, generator, and priority rules (following 32d00ec387f4);
Fabian Huch <huch@in.tum.de>
parents:
79534
diff
changeset
|
689 |
.step(timing_data) |
78845
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
690 |
simulate(state1) |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
691 |
} |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
692 |
|
79073
b3fee0dafd72
generated build schedule explicitly (e.g., for further analysis);
Fabian Huch <huch@in.tum.de>
parents:
79064
diff
changeset
|
693 |
val start = Date.now() |
79592
7db599be70cc
clarified scheduler: proper split into scheduler, generator, and priority rules (following 32d00ec387f4);
Fabian Huch <huch@in.tum.de>
parents:
79534
diff
changeset
|
694 |
val name = "generation scheme (" + priority_rule + ")" |
79109
c1255d9870f6
clarified heuristics toString;
Fabian Huch <huch@in.tum.de>
parents:
79108
diff
changeset
|
695 |
val end_state = |
79592
7db599be70cc
clarified scheduler: proper split into scheduler, generator, and priority rules (following 32d00ec387f4);
Fabian Huch <huch@in.tum.de>
parents:
79534
diff
changeset
|
696 |
simulate(State(build_state, start.time, Schedule(build_uuid, name, start, Graph.empty))) |
79073
b3fee0dafd72
generated build schedule explicitly (e.g., for further analysis);
Fabian Huch <huch@in.tum.de>
parents:
79064
diff
changeset
|
697 |
|
b3fee0dafd72
generated build schedule explicitly (e.g., for further analysis);
Fabian Huch <huch@in.tum.de>
parents:
79064
diff
changeset
|
698 |
end_state.finished |
78845
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
699 |
} |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
700 |
} |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
701 |
|
79928
cdc87eed26c7
allow specifying initial schedule;
Fabian Huch <huch@in.tum.de>
parents:
79927
diff
changeset
|
702 |
case class Optimizer(schedulers: List[Scheduler], schedules: List[Schedule]) extends Scheduler { |
79592
7db599be70cc
clarified scheduler: proper split into scheduler, generator, and priority rules (following 32d00ec387f4);
Fabian Huch <huch@in.tum.de>
parents:
79534
diff
changeset
|
703 |
require(schedulers.nonEmpty) |
7db599be70cc
clarified scheduler: proper split into scheduler, generator, and priority rules (following 32d00ec387f4);
Fabian Huch <huch@in.tum.de>
parents:
79534
diff
changeset
|
704 |
|
79805
45198ea3f0b3
parallelize schedule optimization;
Fabian Huch <huch@in.tum.de>
parents:
79785
diff
changeset
|
705 |
def schedule(state: Build_Process.State): Schedule = { |
45198ea3f0b3
parallelize schedule optimization;
Fabian Huch <huch@in.tum.de>
parents:
79785
diff
changeset
|
706 |
def main(scheduler: Scheduler): Schedule = scheduler.schedule(state) |
79928
cdc87eed26c7
allow specifying initial schedule;
Fabian Huch <huch@in.tum.de>
parents:
79927
diff
changeset
|
707 |
(Par_List.map(main, schedulers) ::: schedules.map(_.update(state))).minBy(schedule => |
cdc87eed26c7
allow specifying initial schedule;
Fabian Huch <huch@in.tum.de>
parents:
79927
diff
changeset
|
708 |
schedule.durations.map(_.ms).sorted.reverse) |
79805
45198ea3f0b3
parallelize schedule optimization;
Fabian Huch <huch@in.tum.de>
parents:
79785
diff
changeset
|
709 |
} |
79592
7db599be70cc
clarified scheduler: proper split into scheduler, generator, and priority rules (following 32d00ec387f4);
Fabian Huch <huch@in.tum.de>
parents:
79534
diff
changeset
|
710 |
} |
7db599be70cc
clarified scheduler: proper split into scheduler, generator, and priority rules (following 32d00ec387f4);
Fabian Huch <huch@in.tum.de>
parents:
79534
diff
changeset
|
711 |
|
7db599be70cc
clarified scheduler: proper split into scheduler, generator, and priority rules (following 32d00ec387f4);
Fabian Huch <huch@in.tum.de>
parents:
79534
diff
changeset
|
712 |
|
7db599be70cc
clarified scheduler: proper split into scheduler, generator, and priority rules (following 32d00ec387f4);
Fabian Huch <huch@in.tum.de>
parents:
79534
diff
changeset
|
713 |
/* priority rules */ |
7db599be70cc
clarified scheduler: proper split into scheduler, generator, and priority rules (following 32d00ec387f4);
Fabian Huch <huch@in.tum.de>
parents:
79534
diff
changeset
|
714 |
|
79926
dc4a387a6f02
clarified host: pre-load max threads;
Fabian Huch <huch@in.tum.de>
parents:
79925
diff
changeset
|
715 |
class Default_Heuristic(host_infos: Host_Infos) extends Priority_Rule { |
79592
7db599be70cc
clarified scheduler: proper split into scheduler, generator, and priority rules (following 32d00ec387f4);
Fabian Huch <huch@in.tum.de>
parents:
79534
diff
changeset
|
716 |
override def toString: String = "default heuristic" |
79107
f5a2f956b531
add heuristic for non-scheduled (standard) build behaviour;
Fabian Huch <huch@in.tum.de>
parents:
79106
diff
changeset
|
717 |
|
f5a2f956b531
add heuristic for non-scheduled (standard) build behaviour;
Fabian Huch <huch@in.tum.de>
parents:
79106
diff
changeset
|
718 |
def next_jobs(resources: Resources, sorted_jobs: List[String], host: Host): List[Config] = |
79926
dc4a387a6f02
clarified host: pre-load max threads;
Fabian Huch <huch@in.tum.de>
parents:
79925
diff
changeset
|
719 |
sorted_jobs.zip(resources.unused_nodes(host, host.max_threads)).map(Config(_, _)) |
79107
f5a2f956b531
add heuristic for non-scheduled (standard) build behaviour;
Fabian Huch <huch@in.tum.de>
parents:
79106
diff
changeset
|
720 |
|
79592
7db599be70cc
clarified scheduler: proper split into scheduler, generator, and priority rules (following 32d00ec387f4);
Fabian Huch <huch@in.tum.de>
parents:
79534
diff
changeset
|
721 |
def select_next(state: Build_Process.State): List[Config] = { |
79107
f5a2f956b531
add heuristic for non-scheduled (standard) build behaviour;
Fabian Huch <huch@in.tum.de>
parents:
79106
diff
changeset
|
722 |
val sorted_jobs = state.next_ready.sortBy(_.name)(state.sessions.ordering).map(_.name) |
f5a2f956b531
add heuristic for non-scheduled (standard) build behaviour;
Fabian Huch <huch@in.tum.de>
parents:
79106
diff
changeset
|
723 |
val resources = host_infos.available(state) |
f5a2f956b531
add heuristic for non-scheduled (standard) build behaviour;
Fabian Huch <huch@in.tum.de>
parents:
79106
diff
changeset
|
724 |
|
f5a2f956b531
add heuristic for non-scheduled (standard) build behaviour;
Fabian Huch <huch@in.tum.de>
parents:
79106
diff
changeset
|
725 |
host_infos.hosts.foldLeft((sorted_jobs, List.empty[Config])) { |
f5a2f956b531
add heuristic for non-scheduled (standard) build behaviour;
Fabian Huch <huch@in.tum.de>
parents:
79106
diff
changeset
|
726 |
case ((jobs, res), host) => |
f5a2f956b531
add heuristic for non-scheduled (standard) build behaviour;
Fabian Huch <huch@in.tum.de>
parents:
79106
diff
changeset
|
727 |
val configs = next_jobs(resources, jobs, host) |
f5a2f956b531
add heuristic for non-scheduled (standard) build behaviour;
Fabian Huch <huch@in.tum.de>
parents:
79106
diff
changeset
|
728 |
val config_jobs = configs.map(_.job_name).toSet |
f5a2f956b531
add heuristic for non-scheduled (standard) build behaviour;
Fabian Huch <huch@in.tum.de>
parents:
79106
diff
changeset
|
729 |
(jobs.filterNot(config_jobs.contains), configs ::: res) |
f5a2f956b531
add heuristic for non-scheduled (standard) build behaviour;
Fabian Huch <huch@in.tum.de>
parents:
79106
diff
changeset
|
730 |
}._2 |
f5a2f956b531
add heuristic for non-scheduled (standard) build behaviour;
Fabian Huch <huch@in.tum.de>
parents:
79106
diff
changeset
|
731 |
} |
f5a2f956b531
add heuristic for non-scheduled (standard) build behaviour;
Fabian Huch <huch@in.tum.de>
parents:
79106
diff
changeset
|
732 |
} |
f5a2f956b531
add heuristic for non-scheduled (standard) build behaviour;
Fabian Huch <huch@in.tum.de>
parents:
79106
diff
changeset
|
733 |
|
79592
7db599be70cc
clarified scheduler: proper split into scheduler, generator, and priority rules (following 32d00ec387f4);
Fabian Huch <huch@in.tum.de>
parents:
79534
diff
changeset
|
734 |
object Path_Time_Heuristic { |
7db599be70cc
clarified scheduler: proper split into scheduler, generator, and priority rules (following 32d00ec387f4);
Fabian Huch <huch@in.tum.de>
parents:
79534
diff
changeset
|
735 |
sealed trait Critical_Criterion |
7db599be70cc
clarified scheduler: proper split into scheduler, generator, and priority rules (following 32d00ec387f4);
Fabian Huch <huch@in.tum.de>
parents:
79534
diff
changeset
|
736 |
case class Absolute_Time(time: Time) extends Critical_Criterion { |
7db599be70cc
clarified scheduler: proper split into scheduler, generator, and priority rules (following 32d00ec387f4);
Fabian Huch <huch@in.tum.de>
parents:
79534
diff
changeset
|
737 |
override def toString: String = "absolute time (" + time.message_hms + ")" |
7db599be70cc
clarified scheduler: proper split into scheduler, generator, and priority rules (following 32d00ec387f4);
Fabian Huch <huch@in.tum.de>
parents:
79534
diff
changeset
|
738 |
} |
7db599be70cc
clarified scheduler: proper split into scheduler, generator, and priority rules (following 32d00ec387f4);
Fabian Huch <huch@in.tum.de>
parents:
79534
diff
changeset
|
739 |
case class Relative_Time(factor: Double) extends Critical_Criterion { |
7db599be70cc
clarified scheduler: proper split into scheduler, generator, and priority rules (following 32d00ec387f4);
Fabian Huch <huch@in.tum.de>
parents:
79534
diff
changeset
|
740 |
override def toString: String = "relative time (" + factor + ")" |
7db599be70cc
clarified scheduler: proper split into scheduler, generator, and priority rules (following 32d00ec387f4);
Fabian Huch <huch@in.tum.de>
parents:
79534
diff
changeset
|
741 |
} |
78931
26841d3c568c
performance tuning for build schedule: explicit schedule generation, without mixing heuristics;
Fabian Huch <huch@in.tum.de>
parents:
78930
diff
changeset
|
742 |
|
79592
7db599be70cc
clarified scheduler: proper split into scheduler, generator, and priority rules (following 32d00ec387f4);
Fabian Huch <huch@in.tum.de>
parents:
79534
diff
changeset
|
743 |
sealed trait Parallel_Strategy |
7db599be70cc
clarified scheduler: proper split into scheduler, generator, and priority rules (following 32d00ec387f4);
Fabian Huch <huch@in.tum.de>
parents:
79534
diff
changeset
|
744 |
case class Fixed_Thread(threads: Int) extends Parallel_Strategy { |
7db599be70cc
clarified scheduler: proper split into scheduler, generator, and priority rules (following 32d00ec387f4);
Fabian Huch <huch@in.tum.de>
parents:
79534
diff
changeset
|
745 |
override def toString: String = "fixed threads (" + threads + ")" |
7db599be70cc
clarified scheduler: proper split into scheduler, generator, and priority rules (following 32d00ec387f4);
Fabian Huch <huch@in.tum.de>
parents:
79534
diff
changeset
|
746 |
} |
7db599be70cc
clarified scheduler: proper split into scheduler, generator, and priority rules (following 32d00ec387f4);
Fabian Huch <huch@in.tum.de>
parents:
79534
diff
changeset
|
747 |
case class Time_Based_Threads(f: Time => Int) extends Parallel_Strategy { |
7db599be70cc
clarified scheduler: proper split into scheduler, generator, and priority rules (following 32d00ec387f4);
Fabian Huch <huch@in.tum.de>
parents:
79534
diff
changeset
|
748 |
override def toString: String = "time based threads" |
7db599be70cc
clarified scheduler: proper split into scheduler, generator, and priority rules (following 32d00ec387f4);
Fabian Huch <huch@in.tum.de>
parents:
79534
diff
changeset
|
749 |
} |
78931
26841d3c568c
performance tuning for build schedule: explicit schedule generation, without mixing heuristics;
Fabian Huch <huch@in.tum.de>
parents:
78930
diff
changeset
|
750 |
|
79592
7db599be70cc
clarified scheduler: proper split into scheduler, generator, and priority rules (following 32d00ec387f4);
Fabian Huch <huch@in.tum.de>
parents:
79534
diff
changeset
|
751 |
sealed trait Host_Criterion |
7db599be70cc
clarified scheduler: proper split into scheduler, generator, and priority rules (following 32d00ec387f4);
Fabian Huch <huch@in.tum.de>
parents:
79534
diff
changeset
|
752 |
case object Critical_Nodes extends Host_Criterion { |
7db599be70cc
clarified scheduler: proper split into scheduler, generator, and priority rules (following 32d00ec387f4);
Fabian Huch <huch@in.tum.de>
parents:
79534
diff
changeset
|
753 |
override def toString: String = "per critical node" |
7db599be70cc
clarified scheduler: proper split into scheduler, generator, and priority rules (following 32d00ec387f4);
Fabian Huch <huch@in.tum.de>
parents:
79534
diff
changeset
|
754 |
} |
7db599be70cc
clarified scheduler: proper split into scheduler, generator, and priority rules (following 32d00ec387f4);
Fabian Huch <huch@in.tum.de>
parents:
79534
diff
changeset
|
755 |
case class Fixed_Fraction(fraction: Double) extends Host_Criterion { |
7db599be70cc
clarified scheduler: proper split into scheduler, generator, and priority rules (following 32d00ec387f4);
Fabian Huch <huch@in.tum.de>
parents:
79534
diff
changeset
|
756 |
override def toString: String = "fixed fraction (" + fraction + ")" |
7db599be70cc
clarified scheduler: proper split into scheduler, generator, and priority rules (following 32d00ec387f4);
Fabian Huch <huch@in.tum.de>
parents:
79534
diff
changeset
|
757 |
} |
7db599be70cc
clarified scheduler: proper split into scheduler, generator, and priority rules (following 32d00ec387f4);
Fabian Huch <huch@in.tum.de>
parents:
79534
diff
changeset
|
758 |
case class Host_Speed(min_factor: Double) extends Host_Criterion { |
7db599be70cc
clarified scheduler: proper split into scheduler, generator, and priority rules (following 32d00ec387f4);
Fabian Huch <huch@in.tum.de>
parents:
79534
diff
changeset
|
759 |
override def toString: String = "host speed (" + min_factor + ")" |
7db599be70cc
clarified scheduler: proper split into scheduler, generator, and priority rules (following 32d00ec387f4);
Fabian Huch <huch@in.tum.de>
parents:
79534
diff
changeset
|
760 |
} |
78931
26841d3c568c
performance tuning for build schedule: explicit schedule generation, without mixing heuristics;
Fabian Huch <huch@in.tum.de>
parents:
78930
diff
changeset
|
761 |
} |
26841d3c568c
performance tuning for build schedule: explicit schedule generation, without mixing heuristics;
Fabian Huch <huch@in.tum.de>
parents:
78930
diff
changeset
|
762 |
|
79592
7db599be70cc
clarified scheduler: proper split into scheduler, generator, and priority rules (following 32d00ec387f4);
Fabian Huch <huch@in.tum.de>
parents:
79534
diff
changeset
|
763 |
class Path_Time_Heuristic( |
7db599be70cc
clarified scheduler: proper split into scheduler, generator, and priority rules (following 32d00ec387f4);
Fabian Huch <huch@in.tum.de>
parents:
79534
diff
changeset
|
764 |
is_critical: Path_Time_Heuristic.Critical_Criterion, |
7db599be70cc
clarified scheduler: proper split into scheduler, generator, and priority rules (following 32d00ec387f4);
Fabian Huch <huch@in.tum.de>
parents:
79534
diff
changeset
|
765 |
parallel_threads: Path_Time_Heuristic.Parallel_Strategy, |
7db599be70cc
clarified scheduler: proper split into scheduler, generator, and priority rules (following 32d00ec387f4);
Fabian Huch <huch@in.tum.de>
parents:
79534
diff
changeset
|
766 |
host_criterion: Path_Time_Heuristic.Host_Criterion, |
79027
d08fb157e300
use proper max threads (limited by available hardware) in heuristics;
Fabian Huch <huch@in.tum.de>
parents:
79026
diff
changeset
|
767 |
timing_data: Timing_Data, |
d08fb157e300
use proper max threads (limited by available hardware) in heuristics;
Fabian Huch <huch@in.tum.de>
parents:
79026
diff
changeset
|
768 |
sessions_structure: Sessions.Structure, |
79592
7db599be70cc
clarified scheduler: proper split into scheduler, generator, and priority rules (following 32d00ec387f4);
Fabian Huch <huch@in.tum.de>
parents:
79534
diff
changeset
|
769 |
max_threads_limit: Int = 8 |
7db599be70cc
clarified scheduler: proper split into scheduler, generator, and priority rules (following 32d00ec387f4);
Fabian Huch <huch@in.tum.de>
parents:
79534
diff
changeset
|
770 |
) extends Priority_Rule { |
7db599be70cc
clarified scheduler: proper split into scheduler, generator, and priority rules (following 32d00ec387f4);
Fabian Huch <huch@in.tum.de>
parents:
79534
diff
changeset
|
771 |
import Path_Time_Heuristic.* |
7db599be70cc
clarified scheduler: proper split into scheduler, generator, and priority rules (following 32d00ec387f4);
Fabian Huch <huch@in.tum.de>
parents:
79534
diff
changeset
|
772 |
|
7db599be70cc
clarified scheduler: proper split into scheduler, generator, and priority rules (following 32d00ec387f4);
Fabian Huch <huch@in.tum.de>
parents:
79534
diff
changeset
|
773 |
override def toString: Node = { |
7db599be70cc
clarified scheduler: proper split into scheduler, generator, and priority rules (following 32d00ec387f4);
Fabian Huch <huch@in.tum.de>
parents:
79534
diff
changeset
|
774 |
val params = |
7db599be70cc
clarified scheduler: proper split into scheduler, generator, and priority rules (following 32d00ec387f4);
Fabian Huch <huch@in.tum.de>
parents:
79534
diff
changeset
|
775 |
List( |
7db599be70cc
clarified scheduler: proper split into scheduler, generator, and priority rules (following 32d00ec387f4);
Fabian Huch <huch@in.tum.de>
parents:
79534
diff
changeset
|
776 |
"critical: " + is_critical, |
7db599be70cc
clarified scheduler: proper split into scheduler, generator, and priority rules (following 32d00ec387f4);
Fabian Huch <huch@in.tum.de>
parents:
79534
diff
changeset
|
777 |
"parallel: " + parallel_threads, |
7db599be70cc
clarified scheduler: proper split into scheduler, generator, and priority rules (following 32d00ec387f4);
Fabian Huch <huch@in.tum.de>
parents:
79534
diff
changeset
|
778 |
"fast hosts: " + host_criterion) |
7db599be70cc
clarified scheduler: proper split into scheduler, generator, and priority rules (following 32d00ec387f4);
Fabian Huch <huch@in.tum.de>
parents:
79534
diff
changeset
|
779 |
"path time heuristic (" + params.mkString(", ") + ")" |
7db599be70cc
clarified scheduler: proper split into scheduler, generator, and priority rules (following 32d00ec387f4);
Fabian Huch <huch@in.tum.de>
parents:
79534
diff
changeset
|
780 |
} |
7db599be70cc
clarified scheduler: proper split into scheduler, generator, and priority rules (following 32d00ec387f4);
Fabian Huch <huch@in.tum.de>
parents:
79534
diff
changeset
|
781 |
|
78929
df323f23dfde
performance tuning for timing heuristic: pre-calculate graph operations;
Fabian Huch <huch@in.tum.de>
parents:
78928
diff
changeset
|
782 |
/* pre-computed properties for efficient heuristic */ |
79713
d3a26436e679
tuned signature: more types, fewer warnings in IntelliJ IDEA;
wenzelm
parents:
79703
diff
changeset
|
783 |
val host_infos: Host_Infos = timing_data.host_infos |
d3a26436e679
tuned signature: more types, fewer warnings in IntelliJ IDEA;
wenzelm
parents:
79703
diff
changeset
|
784 |
val ordered_hosts: List[Host] = host_infos.hosts.sorted(host_infos.host_speeds) |
78929
df323f23dfde
performance tuning for timing heuristic: pre-calculate graph operations;
Fabian Huch <huch@in.tum.de>
parents:
78928
diff
changeset
|
785 |
|
79927
4359257218ce
clarify use of num_threads vs. max_cpus;
Fabian Huch <huch@in.tum.de>
parents:
79926
diff
changeset
|
786 |
val max_threads: Int = host_infos.hosts.map(_.max_threads).max min max_threads_limit |
79102 | 787 |
|
78929
df323f23dfde
performance tuning for timing heuristic: pre-calculate graph operations;
Fabian Huch <huch@in.tum.de>
parents:
78928
diff
changeset
|
788 |
type Node = String |
79713
d3a26436e679
tuned signature: more types, fewer warnings in IntelliJ IDEA;
wenzelm
parents:
79703
diff
changeset
|
789 |
val build_graph: Graph[Node, Sessions.Info] = sessions_structure.build_graph |
79101
4e47b34fbb8e
clarified graph operations in timing heuristic;
Fabian Huch <huch@in.tum.de>
parents:
79091
diff
changeset
|
790 |
|
79713
d3a26436e679
tuned signature: more types, fewer warnings in IntelliJ IDEA;
wenzelm
parents:
79703
diff
changeset
|
791 |
val minimals: List[Node] = build_graph.minimals |
d3a26436e679
tuned signature: more types, fewer warnings in IntelliJ IDEA;
wenzelm
parents:
79703
diff
changeset
|
792 |
val maximals: List[Node] = build_graph.maximals |
79101
4e47b34fbb8e
clarified graph operations in timing heuristic;
Fabian Huch <huch@in.tum.de>
parents:
79091
diff
changeset
|
793 |
|
79713
d3a26436e679
tuned signature: more types, fewer warnings in IntelliJ IDEA;
wenzelm
parents:
79703
diff
changeset
|
794 |
val best_threads: Map[Node, Int] = |
79594 | 795 |
build_graph.keys.map(node => node -> timing_data.best_threads(node, max_threads)).toMap |
796 |
||
79102 | 797 |
def best_time(node: Node): Time = { |
798 |
val host = ordered_hosts.last |
|
79927
4359257218ce
clarify use of num_threads vs. max_cpus;
Fabian Huch <huch@in.tum.de>
parents:
79926
diff
changeset
|
799 |
val threads = best_threads(node) min host.max_threads |
79103
883f61f0beda
clarified build schedule host: more operations;
Fabian Huch <huch@in.tum.de>
parents:
79102
diff
changeset
|
800 |
timing_data.estimate(node, host.name, threads) |
79102 | 801 |
} |
79713
d3a26436e679
tuned signature: more types, fewer warnings in IntelliJ IDEA;
wenzelm
parents:
79703
diff
changeset
|
802 |
val best_times: Map[Node, Time] = build_graph.keys.map(node => node -> best_time(node)).toMap |
78929
df323f23dfde
performance tuning for timing heuristic: pre-calculate graph operations;
Fabian Huch <huch@in.tum.de>
parents:
78928
diff
changeset
|
803 |
|
79713
d3a26436e679
tuned signature: more types, fewer warnings in IntelliJ IDEA;
wenzelm
parents:
79703
diff
changeset
|
804 |
val succs_max_time_ms: Map[Node, Long] = build_graph.node_height(best_times(_).ms) |
79101
4e47b34fbb8e
clarified graph operations in timing heuristic;
Fabian Huch <huch@in.tum.de>
parents:
79091
diff
changeset
|
805 |
def max_time(node: Node): Time = Time.ms(succs_max_time_ms(node)) + best_times(node) |
4e47b34fbb8e
clarified graph operations in timing heuristic;
Fabian Huch <huch@in.tum.de>
parents:
79091
diff
changeset
|
806 |
def max_time(task: Build_Process.Task): Time = max_time(task.name) |
78929
df323f23dfde
performance tuning for timing heuristic: pre-calculate graph operations;
Fabian Huch <huch@in.tum.de>
parents:
78928
diff
changeset
|
807 |
|
79101
4e47b34fbb8e
clarified graph operations in timing heuristic;
Fabian Huch <huch@in.tum.de>
parents:
79091
diff
changeset
|
808 |
def path_times(minimals: List[Node]): Map[Node, Time] = { |
4e47b34fbb8e
clarified graph operations in timing heuristic;
Fabian Huch <huch@in.tum.de>
parents:
79091
diff
changeset
|
809 |
def time_ms(node: Node): Long = best_times(node).ms |
4e47b34fbb8e
clarified graph operations in timing heuristic;
Fabian Huch <huch@in.tum.de>
parents:
79091
diff
changeset
|
810 |
val path_times_ms = build_graph.reachable_length(time_ms, build_graph.imm_succs, minimals) |
4e47b34fbb8e
clarified graph operations in timing heuristic;
Fabian Huch <huch@in.tum.de>
parents:
79091
diff
changeset
|
811 |
path_times_ms.view.mapValues(Time.ms).toMap |
78929
df323f23dfde
performance tuning for timing heuristic: pre-calculate graph operations;
Fabian Huch <huch@in.tum.de>
parents:
78928
diff
changeset
|
812 |
} |
df323f23dfde
performance tuning for timing heuristic: pre-calculate graph operations;
Fabian Huch <huch@in.tum.de>
parents:
78928
diff
changeset
|
813 |
|
79101
4e47b34fbb8e
clarified graph operations in timing heuristic;
Fabian Huch <huch@in.tum.de>
parents:
79091
diff
changeset
|
814 |
def path_max_times(minimals: List[Node]): Map[Node, Time] = |
4e47b34fbb8e
clarified graph operations in timing heuristic;
Fabian Huch <huch@in.tum.de>
parents:
79091
diff
changeset
|
815 |
path_times(minimals).toList.map((node, time) => node -> (time + max_time(node))).toMap |
4e47b34fbb8e
clarified graph operations in timing heuristic;
Fabian Huch <huch@in.tum.de>
parents:
79091
diff
changeset
|
816 |
|
79713
d3a26436e679
tuned signature: more types, fewer warnings in IntelliJ IDEA;
wenzelm
parents:
79703
diff
changeset
|
817 |
val node_degrees: Map[Node, Int] = |
79594 | 818 |
build_graph.keys.map(node => node -> build_graph.imm_succs(node).size).toMap |
78972
7a39f151e9a7
proper parallel paths for timing heuristic;
Fabian Huch <huch@in.tum.de>
parents:
78971
diff
changeset
|
819 |
|
79594 | 820 |
def parallel_paths( |
821 |
running: List[(Node, Time)], |
|
822 |
nodes: Set[Node] = build_graph.keys.toSet, |
|
823 |
max: Int = Int.MaxValue |
|
824 |
): Int = |
|
825 |
if (nodes.nonEmpty && nodes.map(node_degrees.apply).max > max) max |
|
826 |
else { |
|
827 |
def start(node: Node): (Node, Time) = node -> best_times(node) |
|
828 |
||
829 |
def pass_time(elapsed: Time)(node: Node, time: Time): (Node, Time) = |
|
830 |
node -> (time - elapsed) |
|
78972
7a39f151e9a7
proper parallel paths for timing heuristic;
Fabian Huch <huch@in.tum.de>
parents:
78971
diff
changeset
|
831 |
|
79594 | 832 |
def parallel_paths(running: Map[Node, Time]): (Int, Map[Node, Time]) = |
833 |
if (running.size >= max) (max, running) |
|
834 |
else if (running.isEmpty) (0, running) |
|
835 |
else { |
|
836 |
def get_next(node: Node): List[Node] = |
|
837 |
build_graph.imm_succs(node).intersect(nodes).filter( |
|
838 |
build_graph.imm_preds(_).intersect(running.keySet) == Set(node)).toList |
|
78972
7a39f151e9a7
proper parallel paths for timing heuristic;
Fabian Huch <huch@in.tum.de>
parents:
78971
diff
changeset
|
839 |
|
79594 | 840 |
val (next, elapsed) = running.minBy(_._2.ms) |
841 |
val (remaining, finished) = |
|
842 |
running.toList.map(pass_time(elapsed)).partition(_._2 > Time.zero) |
|
78972
7a39f151e9a7
proper parallel paths for timing heuristic;
Fabian Huch <huch@in.tum.de>
parents:
78971
diff
changeset
|
843 |
|
79594 | 844 |
val running1 = |
845 |
remaining.map(pass_time(elapsed)).toMap ++ |
|
846 |
finished.map(_._1).flatMap(get_next).map(start) |
|
847 |
val (res, running2) = parallel_paths(running1) |
|
848 |
(res max running.size, running2) |
|
849 |
} |
|
850 |
||
851 |
parallel_paths(running.toMap)._1 |
|
852 |
} |
|
78929
df323f23dfde
performance tuning for timing heuristic: pre-calculate graph operations;
Fabian Huch <huch@in.tum.de>
parents:
78928
diff
changeset
|
853 |
|
79592
7db599be70cc
clarified scheduler: proper split into scheduler, generator, and priority rules (following 32d00ec387f4);
Fabian Huch <huch@in.tum.de>
parents:
79534
diff
changeset
|
854 |
def select_next(state: Build_Process.State): List[Config] = { |
78845
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
855 |
val resources = host_infos.available(state) |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
856 |
|
79594 | 857 |
def best_threads(task: Build_Process.Task): Int = this.best_threads(task.name) |
78971
f930d24f1548
scheduled build: allocate cpus more aggressively, to avoid idle threads;
Fabian Huch <huch@in.tum.de>
parents:
78970
diff
changeset
|
858 |
|
79028
6bada416ba55
clarified timing data operations: proper estimation (instead of known points);
Fabian Huch <huch@in.tum.de>
parents:
79027
diff
changeset
|
859 |
val rev_ordered_hosts = ordered_hosts.reverse.map(_ -> max_threads) |
78845
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
860 |
|
79180
229f49204603
clarified build heuristics parameters;
Fabian Huch <huch@in.tum.de>
parents:
79179
diff
changeset
|
861 |
val available_nodes = |
229f49204603
clarified build heuristics parameters;
Fabian Huch <huch@in.tum.de>
parents:
79179
diff
changeset
|
862 |
host_infos.available(state.copy(running = Map.empty)) |
229f49204603
clarified build heuristics parameters;
Fabian Huch <huch@in.tum.de>
parents:
79179
diff
changeset
|
863 |
.unused_nodes(max_threads) |
229f49204603
clarified build heuristics parameters;
Fabian Huch <huch@in.tum.de>
parents:
79179
diff
changeset
|
864 |
.sortBy(node => host_infos.the_host(node))(host_infos.host_speeds).reverse |
79179
7ed43417770f
proper parallel paths: factor in elapsed time;
Fabian Huch <huch@in.tum.de>
parents:
79178
diff
changeset
|
865 |
|
7ed43417770f
proper parallel paths: factor in elapsed time;
Fabian Huch <huch@in.tum.de>
parents:
79178
diff
changeset
|
866 |
def remaining_time(node: Node): (Node, Time) = |
7ed43417770f
proper parallel paths: factor in elapsed time;
Fabian Huch <huch@in.tum.de>
parents:
79178
diff
changeset
|
867 |
state.running.get(node) match { |
79594 | 868 |
case None => node -> best_times(node) |
79179
7ed43417770f
proper parallel paths: factor in elapsed time;
Fabian Huch <huch@in.tum.de>
parents:
79178
diff
changeset
|
869 |
case Some(job) => |
7ed43417770f
proper parallel paths: factor in elapsed time;
Fabian Huch <huch@in.tum.de>
parents:
79178
diff
changeset
|
870 |
val estimate = |
7ed43417770f
proper parallel paths: factor in elapsed time;
Fabian Huch <huch@in.tum.de>
parents:
79178
diff
changeset
|
871 |
timing_data.estimate(job.name, job.node_info.hostname, |
7ed43417770f
proper parallel paths: factor in elapsed time;
Fabian Huch <huch@in.tum.de>
parents:
79178
diff
changeset
|
872 |
host_infos.num_threads(job.node_info)) |
79184 | 873 |
node -> ((Time.now() - job.start_date.time + estimate) max Time.zero) |
79179
7ed43417770f
proper parallel paths: factor in elapsed time;
Fabian Huch <huch@in.tum.de>
parents:
79178
diff
changeset
|
874 |
} |
7ed43417770f
proper parallel paths: factor in elapsed time;
Fabian Huch <huch@in.tum.de>
parents:
79178
diff
changeset
|
875 |
|
79101
4e47b34fbb8e
clarified graph operations in timing heuristic;
Fabian Huch <huch@in.tum.de>
parents:
79091
diff
changeset
|
876 |
val next_sorted = state.next_ready.sortBy(max_time(_).ms).reverse |
79594 | 877 |
val is_parallelizable = |
878 |
available_nodes.length >= parallel_paths( |
|
879 |
state.ready.map(_.name).map(remaining_time), |
|
880 |
max = available_nodes.length + 1) |
|
79088 | 881 |
|
79594 | 882 |
if (is_parallelizable) { |
79101
4e47b34fbb8e
clarified graph operations in timing heuristic;
Fabian Huch <huch@in.tum.de>
parents:
79091
diff
changeset
|
883 |
val all_tasks = next_sorted.map(task => (task, best_threads(task), best_threads(task))) |
79028
6bada416ba55
clarified timing data operations: proper estimation (instead of known points);
Fabian Huch <huch@in.tum.de>
parents:
79027
diff
changeset
|
884 |
resources.try_allocate_tasks(rev_ordered_hosts, all_tasks)._1 |
78971
f930d24f1548
scheduled build: allocate cpus more aggressively, to avoid idle threads;
Fabian Huch <huch@in.tum.de>
parents:
78970
diff
changeset
|
885 |
} |
78845
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
886 |
else { |
79110
ff68cbfa3550
clarified path time heuristic: configurable parameters for larger search space;
Fabian Huch <huch@in.tum.de>
parents:
79109
diff
changeset
|
887 |
def is_critical(time: Time): Boolean = |
ff68cbfa3550
clarified path time heuristic: configurable parameters for larger search space;
Fabian Huch <huch@in.tum.de>
parents:
79109
diff
changeset
|
888 |
this.is_critical match { |
ff68cbfa3550
clarified path time heuristic: configurable parameters for larger search space;
Fabian Huch <huch@in.tum.de>
parents:
79109
diff
changeset
|
889 |
case Absolute_Time(threshold) => time > threshold |
ff68cbfa3550
clarified path time heuristic: configurable parameters for larger search space;
Fabian Huch <huch@in.tum.de>
parents:
79109
diff
changeset
|
890 |
case Relative_Time(factor) => time > minimals.map(max_time).maxBy(_.ms).scale(factor) |
ff68cbfa3550
clarified path time heuristic: configurable parameters for larger search space;
Fabian Huch <huch@in.tum.de>
parents:
79109
diff
changeset
|
891 |
} |
ff68cbfa3550
clarified path time heuristic: configurable parameters for larger search space;
Fabian Huch <huch@in.tum.de>
parents:
79109
diff
changeset
|
892 |
|
ff68cbfa3550
clarified path time heuristic: configurable parameters for larger search space;
Fabian Huch <huch@in.tum.de>
parents:
79109
diff
changeset
|
893 |
val critical_minimals = state.ready.filter(task => is_critical(max_time(task))).map(_.name) |
ff68cbfa3550
clarified path time heuristic: configurable parameters for larger search space;
Fabian Huch <huch@in.tum.de>
parents:
79109
diff
changeset
|
894 |
val critical_nodes = |
ff68cbfa3550
clarified path time heuristic: configurable parameters for larger search space;
Fabian Huch <huch@in.tum.de>
parents:
79109
diff
changeset
|
895 |
path_max_times(critical_minimals).filter((_, time) => is_critical(time)).keySet |
78845
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
896 |
|
79101
4e47b34fbb8e
clarified graph operations in timing heuristic;
Fabian Huch <huch@in.tum.de>
parents:
79091
diff
changeset
|
897 |
val (critical, other) = next_sorted.partition(task => critical_nodes.contains(task.name)) |
78845
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
898 |
|
78971
f930d24f1548
scheduled build: allocate cpus more aggressively, to avoid idle threads;
Fabian Huch <huch@in.tum.de>
parents:
78970
diff
changeset
|
899 |
val critical_tasks = critical.map(task => (task, best_threads(task), best_threads(task))) |
79110
ff68cbfa3550
clarified path time heuristic: configurable parameters for larger search space;
Fabian Huch <huch@in.tum.de>
parents:
79109
diff
changeset
|
900 |
|
ff68cbfa3550
clarified path time heuristic: configurable parameters for larger search space;
Fabian Huch <huch@in.tum.de>
parents:
79109
diff
changeset
|
901 |
def parallel_threads(task: Build_Process.Task): Int = |
ff68cbfa3550
clarified path time heuristic: configurable parameters for larger search space;
Fabian Huch <huch@in.tum.de>
parents:
79109
diff
changeset
|
902 |
this.parallel_threads match { |
ff68cbfa3550
clarified path time heuristic: configurable parameters for larger search space;
Fabian Huch <huch@in.tum.de>
parents:
79109
diff
changeset
|
903 |
case Fixed_Thread(threads) => threads |
79594 | 904 |
case Time_Based_Threads(f) => f(best_times(task.name)) |
79110
ff68cbfa3550
clarified path time heuristic: configurable parameters for larger search space;
Fabian Huch <huch@in.tum.de>
parents:
79109
diff
changeset
|
905 |
} |
ff68cbfa3550
clarified path time heuristic: configurable parameters for larger search space;
Fabian Huch <huch@in.tum.de>
parents:
79109
diff
changeset
|
906 |
|
ff68cbfa3550
clarified path time heuristic: configurable parameters for larger search space;
Fabian Huch <huch@in.tum.de>
parents:
79109
diff
changeset
|
907 |
val other_tasks = other.map(task => (task, parallel_threads(task), best_threads(task))) |
78971
f930d24f1548
scheduled build: allocate cpus more aggressively, to avoid idle threads;
Fabian Huch <huch@in.tum.de>
parents:
78970
diff
changeset
|
908 |
|
79179
7ed43417770f
proper parallel paths: factor in elapsed time;
Fabian Huch <huch@in.tum.de>
parents:
79178
diff
changeset
|
909 |
val max_critical_parallel = |
79594 | 910 |
parallel_paths(critical_minimals.map(remaining_time), critical_nodes) |
79180
229f49204603
clarified build heuristics parameters;
Fabian Huch <huch@in.tum.de>
parents:
79179
diff
changeset
|
911 |
val max_critical_hosts = |
229f49204603
clarified build heuristics parameters;
Fabian Huch <huch@in.tum.de>
parents:
79179
diff
changeset
|
912 |
available_nodes.take(max_critical_parallel).map(_.hostname).distinct.length |
229f49204603
clarified build heuristics parameters;
Fabian Huch <huch@in.tum.de>
parents:
79179
diff
changeset
|
913 |
|
229f49204603
clarified build heuristics parameters;
Fabian Huch <huch@in.tum.de>
parents:
79179
diff
changeset
|
914 |
val split = |
229f49204603
clarified build heuristics parameters;
Fabian Huch <huch@in.tum.de>
parents:
79179
diff
changeset
|
915 |
this.host_criterion match { |
229f49204603
clarified build heuristics parameters;
Fabian Huch <huch@in.tum.de>
parents:
79179
diff
changeset
|
916 |
case Critical_Nodes => max_critical_hosts |
229f49204603
clarified build heuristics parameters;
Fabian Huch <huch@in.tum.de>
parents:
79179
diff
changeset
|
917 |
case Fixed_Fraction(fraction) => |
229f49204603
clarified build heuristics parameters;
Fabian Huch <huch@in.tum.de>
parents:
79179
diff
changeset
|
918 |
((rev_ordered_hosts.length * fraction).ceil.toInt max 1) min max_critical_hosts |
229f49204603
clarified build heuristics parameters;
Fabian Huch <huch@in.tum.de>
parents:
79179
diff
changeset
|
919 |
case Host_Speed(min_factor) => |
79880
a3d53f2bc41d
clarified build schedule host: proper module;
Fabian Huch <huch@in.tum.de>
parents:
79879
diff
changeset
|
920 |
val best = rev_ordered_hosts.head._1.benchmark_score |
79180
229f49204603
clarified build heuristics parameters;
Fabian Huch <huch@in.tum.de>
parents:
79179
diff
changeset
|
921 |
val num_fast = |
79880
a3d53f2bc41d
clarified build schedule host: proper module;
Fabian Huch <huch@in.tum.de>
parents:
79879
diff
changeset
|
922 |
rev_ordered_hosts.count(_._1.benchmark_score >= best * min_factor) |
79180
229f49204603
clarified build heuristics parameters;
Fabian Huch <huch@in.tum.de>
parents:
79179
diff
changeset
|
923 |
num_fast min max_critical_hosts |
229f49204603
clarified build heuristics parameters;
Fabian Huch <huch@in.tum.de>
parents:
79179
diff
changeset
|
924 |
} |
229f49204603
clarified build heuristics parameters;
Fabian Huch <huch@in.tum.de>
parents:
79179
diff
changeset
|
925 |
|
229f49204603
clarified build heuristics parameters;
Fabian Huch <huch@in.tum.de>
parents:
79179
diff
changeset
|
926 |
val (critical_hosts, other_hosts) = rev_ordered_hosts.splitAt(split) |
78845
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
927 |
|
78971
f930d24f1548
scheduled build: allocate cpus more aggressively, to avoid idle threads;
Fabian Huch <huch@in.tum.de>
parents:
78970
diff
changeset
|
928 |
val (configs1, resources1) = resources.try_allocate_tasks(critical_hosts, critical_tasks) |
f930d24f1548
scheduled build: allocate cpus more aggressively, to avoid idle threads;
Fabian Huch <huch@in.tum.de>
parents:
78970
diff
changeset
|
929 |
val (configs2, _) = resources1.try_allocate_tasks(other_hosts, other_tasks) |
78845
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
930 |
|
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
931 |
configs1 ::: configs2 |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
932 |
} |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
933 |
} |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
934 |
} |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
935 |
|
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
936 |
|
79290
9deadc9d8872
separate build processes for scheduler and scheduled;
Fabian Huch <huch@in.tum.de>
parents:
79289
diff
changeset
|
937 |
/* master and slave processes for scheduled build */ |
78845
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
938 |
|
79290
9deadc9d8872
separate build processes for scheduler and scheduled;
Fabian Huch <huch@in.tum.de>
parents:
79289
diff
changeset
|
939 |
class Scheduled_Build_Process( |
78845
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
940 |
build_context: Build.Context, |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
941 |
build_progress: Progress, |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
942 |
server: SSH.Server, |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
943 |
) extends Build_Process(build_context, build_progress, server) { |
79186
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
944 |
/* global state: internal var vs. external database */ |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
945 |
|
79649
981cd49a3f90
more explicit types --- fewer warnings in IntelliJ IDEA;
wenzelm
parents:
79648
diff
changeset
|
946 |
protected var _schedule: Schedule = Schedule.init(build_uuid) |
79186
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
947 |
|
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
948 |
override protected def synchronized_database[A](label: String)(body: => A): A = |
79527
f1f08ca40d96
make build process state protected to avoid copying in subclasses (e.g. for database connections);
Fabian Huch <huch@in.tum.de>
parents:
79502
diff
changeset
|
949 |
synchronized { |
79186
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
950 |
_build_database match { |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
951 |
case None => body |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
952 |
case Some(db) => |
79761 | 953 |
db.transaction_lock(Build_Schedule.private_data.all_tables, label = label) { |
79871
630a82f87310
database performance tuning: pull changed entries only, based on recorded updates (see 98d65411bfdb);
wenzelm
parents:
79867
diff
changeset
|
954 |
val old_state = |
79904 | 955 |
Build_Process.private_data.pull_state(db, build_id, worker_uuid, _state) |
79186
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
956 |
val old_schedule = Build_Schedule.private_data.pull_schedule(db, _schedule) |
79527
f1f08ca40d96
make build process state protected to avoid copying in subclasses (e.g. for database connections);
Fabian Huch <huch@in.tum.de>
parents:
79502
diff
changeset
|
957 |
_state = old_state |
79186
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
958 |
_schedule = old_schedule |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
959 |
val res = body |
79527
f1f08ca40d96
make build process state protected to avoid copying in subclasses (e.g. for database connections);
Fabian Huch <huch@in.tum.de>
parents:
79502
diff
changeset
|
960 |
_state = |
79904 | 961 |
Build_Process.private_data.push_state( |
79850
8ffcaf563745
maintain short build_id vs. build_uuid, similar to Database_Progress context/context_uuid;
wenzelm
parents:
79844
diff
changeset
|
962 |
db, build_id, worker_uuid, _state, old_state) |
79904 | 963 |
_schedule = Build_Schedule.private_data.pull_schedule(db, _schedule, old_schedule) |
79186
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
964 |
res |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
965 |
} |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
966 |
} |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
967 |
} |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
968 |
|
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
969 |
|
79290
9deadc9d8872
separate build processes for scheduler and scheduled;
Fabian Huch <huch@in.tum.de>
parents:
79289
diff
changeset
|
970 |
/* build process */ |
9deadc9d8872
separate build processes for scheduler and scheduled;
Fabian Huch <huch@in.tum.de>
parents:
79289
diff
changeset
|
971 |
|
9deadc9d8872
separate build processes for scheduler and scheduled;
Fabian Huch <huch@in.tum.de>
parents:
79289
diff
changeset
|
972 |
override def next_node_info(state: Build_Process.State, session_name: String): Node_Info = |
9deadc9d8872
separate build processes for scheduler and scheduled;
Fabian Huch <huch@in.tum.de>
parents:
79289
diff
changeset
|
973 |
_schedule.graph.get_node(session_name).node_info |
9deadc9d8872
separate build processes for scheduler and scheduled;
Fabian Huch <huch@in.tum.de>
parents:
79289
diff
changeset
|
974 |
|
9deadc9d8872
separate build processes for scheduler and scheduled;
Fabian Huch <huch@in.tum.de>
parents:
79289
diff
changeset
|
975 |
override def next_jobs(state: Build_Process.State): List[String] = |
79294
ae0a2cb42b05
continue build while waiting for updated schedule;
Fabian Huch <huch@in.tum.de>
parents:
79293
diff
changeset
|
976 |
if (progress.stopped || _schedule.is_empty) Nil else _schedule.next(hostname, state) |
79896
2c9c5ae99a09
proper IPC for scheduled builds, following 7ae25372ab04;
Fabian Huch <huch@in.tum.de>
parents:
79895
diff
changeset
|
977 |
|
2c9c5ae99a09
proper IPC for scheduled builds, following 7ae25372ab04;
Fabian Huch <huch@in.tum.de>
parents:
79895
diff
changeset
|
978 |
private var _build_tick: Long = 0L |
2c9c5ae99a09
proper IPC for scheduled builds, following 7ae25372ab04;
Fabian Huch <huch@in.tum.de>
parents:
79895
diff
changeset
|
979 |
|
2c9c5ae99a09
proper IPC for scheduled builds, following 7ae25372ab04;
Fabian Huch <huch@in.tum.de>
parents:
79895
diff
changeset
|
980 |
protected override def build_action(): Boolean = |
2c9c5ae99a09
proper IPC for scheduled builds, following 7ae25372ab04;
Fabian Huch <huch@in.tum.de>
parents:
79895
diff
changeset
|
981 |
Isabelle_Thread.interrupt_handler(_ => progress.stop()) { |
2c9c5ae99a09
proper IPC for scheduled builds, following 7ae25372ab04;
Fabian Huch <huch@in.tum.de>
parents:
79895
diff
changeset
|
982 |
val received = build_receive(n => n.channel == Build_Process.private_data.channel) |
2c9c5ae99a09
proper IPC for scheduled builds, following 7ae25372ab04;
Fabian Huch <huch@in.tum.de>
parents:
79895
diff
changeset
|
983 |
val ready = received.contains(Build_Schedule.private_data.channel_ready(hostname)) |
2c9c5ae99a09
proper IPC for scheduled builds, following 7ae25372ab04;
Fabian Huch <huch@in.tum.de>
parents:
79895
diff
changeset
|
984 |
|
2c9c5ae99a09
proper IPC for scheduled builds, following 7ae25372ab04;
Fabian Huch <huch@in.tum.de>
parents:
79895
diff
changeset
|
985 |
val finished = synchronized { _state.finished_running() } |
2c9c5ae99a09
proper IPC for scheduled builds, following 7ae25372ab04;
Fabian Huch <huch@in.tum.de>
parents:
79895
diff
changeset
|
986 |
|
2c9c5ae99a09
proper IPC for scheduled builds, following 7ae25372ab04;
Fabian Huch <huch@in.tum.de>
parents:
79895
diff
changeset
|
987 |
def sleep: Boolean = { |
2c9c5ae99a09
proper IPC for scheduled builds, following 7ae25372ab04;
Fabian Huch <huch@in.tum.de>
parents:
79895
diff
changeset
|
988 |
build_delay.sleep() |
2c9c5ae99a09
proper IPC for scheduled builds, following 7ae25372ab04;
Fabian Huch <huch@in.tum.de>
parents:
79895
diff
changeset
|
989 |
val expired = synchronized { _build_tick += 1; _build_tick % build_expire == 0 } |
2c9c5ae99a09
proper IPC for scheduled builds, following 7ae25372ab04;
Fabian Huch <huch@in.tum.de>
parents:
79895
diff
changeset
|
990 |
expired || ready || progress.stopped |
2c9c5ae99a09
proper IPC for scheduled builds, following 7ae25372ab04;
Fabian Huch <huch@in.tum.de>
parents:
79895
diff
changeset
|
991 |
} |
2c9c5ae99a09
proper IPC for scheduled builds, following 7ae25372ab04;
Fabian Huch <huch@in.tum.de>
parents:
79895
diff
changeset
|
992 |
|
2c9c5ae99a09
proper IPC for scheduled builds, following 7ae25372ab04;
Fabian Huch <huch@in.tum.de>
parents:
79895
diff
changeset
|
993 |
finished || sleep |
2c9c5ae99a09
proper IPC for scheduled builds, following 7ae25372ab04;
Fabian Huch <huch@in.tum.de>
parents:
79895
diff
changeset
|
994 |
} |
79290
9deadc9d8872
separate build processes for scheduler and scheduled;
Fabian Huch <huch@in.tum.de>
parents:
79289
diff
changeset
|
995 |
} |
9deadc9d8872
separate build processes for scheduler and scheduled;
Fabian Huch <huch@in.tum.de>
parents:
79289
diff
changeset
|
996 |
|
9deadc9d8872
separate build processes for scheduler and scheduled;
Fabian Huch <huch@in.tum.de>
parents:
79289
diff
changeset
|
997 |
abstract class Scheduler_Build_Process( |
9deadc9d8872
separate build processes for scheduler and scheduled;
Fabian Huch <huch@in.tum.de>
parents:
79289
diff
changeset
|
998 |
build_context: Build.Context, |
9deadc9d8872
separate build processes for scheduler and scheduled;
Fabian Huch <huch@in.tum.de>
parents:
79289
diff
changeset
|
999 |
build_progress: Progress, |
9deadc9d8872
separate build processes for scheduler and scheduled;
Fabian Huch <huch@in.tum.de>
parents:
79289
diff
changeset
|
1000 |
server: SSH.Server, |
9deadc9d8872
separate build processes for scheduler and scheduled;
Fabian Huch <huch@in.tum.de>
parents:
79289
diff
changeset
|
1001 |
) extends Scheduled_Build_Process(build_context, build_progress, server) { |
9deadc9d8872
separate build processes for scheduler and scheduled;
Fabian Huch <huch@in.tum.de>
parents:
79289
diff
changeset
|
1002 |
require(build_context.master) |
9deadc9d8872
separate build processes for scheduler and scheduled;
Fabian Huch <huch@in.tum.de>
parents:
79289
diff
changeset
|
1003 |
|
79527
f1f08ca40d96
make build process state protected to avoid copying in subclasses (e.g. for database connections);
Fabian Huch <huch@in.tum.de>
parents:
79502
diff
changeset
|
1004 |
for (db <- _build_database) { |
f1f08ca40d96
make build process state protected to avoid copying in subclasses (e.g. for database connections);
Fabian Huch <huch@in.tum.de>
parents:
79502
diff
changeset
|
1005 |
Build_Schedule.private_data.transaction_lock( |
f1f08ca40d96
make build process state protected to avoid copying in subclasses (e.g. for database connections);
Fabian Huch <huch@in.tum.de>
parents:
79502
diff
changeset
|
1006 |
db, |
f1f08ca40d96
make build process state protected to avoid copying in subclasses (e.g. for database connections);
Fabian Huch <huch@in.tum.de>
parents:
79502
diff
changeset
|
1007 |
create = true, |
f1f08ca40d96
make build process state protected to avoid copying in subclasses (e.g. for database connections);
Fabian Huch <huch@in.tum.de>
parents:
79502
diff
changeset
|
1008 |
label = "Scheduler_Build_Process.create" |
f1f08ca40d96
make build process state protected to avoid copying in subclasses (e.g. for database connections);
Fabian Huch <huch@in.tum.de>
parents:
79502
diff
changeset
|
1009 |
) { Build_Schedule.private_data.clean_build_schedules(db) } |
f1f08ca40d96
make build process state protected to avoid copying in subclasses (e.g. for database connections);
Fabian Huch <huch@in.tum.de>
parents:
79502
diff
changeset
|
1010 |
db.vacuum(Build_Schedule.private_data.tables.list) |
f1f08ca40d96
make build process state protected to avoid copying in subclasses (e.g. for database connections);
Fabian Huch <huch@in.tum.de>
parents:
79502
diff
changeset
|
1011 |
} |
f1f08ca40d96
make build process state protected to avoid copying in subclasses (e.g. for database connections);
Fabian Huch <huch@in.tum.de>
parents:
79502
diff
changeset
|
1012 |
|
f1f08ca40d96
make build process state protected to avoid copying in subclasses (e.g. for database connections);
Fabian Huch <huch@in.tum.de>
parents:
79502
diff
changeset
|
1013 |
|
79290
9deadc9d8872
separate build processes for scheduler and scheduled;
Fabian Huch <huch@in.tum.de>
parents:
79289
diff
changeset
|
1014 |
def init_scheduler(timing_data: Timing_Data): Scheduler |
9deadc9d8872
separate build processes for scheduler and scheduled;
Fabian Huch <huch@in.tum.de>
parents:
79289
diff
changeset
|
1015 |
|
9deadc9d8872
separate build processes for scheduler and scheduled;
Fabian Huch <huch@in.tum.de>
parents:
79289
diff
changeset
|
1016 |
|
9deadc9d8872
separate build processes for scheduler and scheduled;
Fabian Huch <huch@in.tum.de>
parents:
79289
diff
changeset
|
1017 |
/* global resources with common close() operation */ |
9deadc9d8872
separate build processes for scheduler and scheduled;
Fabian Huch <huch@in.tum.de>
parents:
79289
diff
changeset
|
1018 |
|
79934
502525a82d9f
remove laziness: no need, and errors during initialization loop with close();
Fabian Huch <huch@in.tum.de>
parents:
79931
diff
changeset
|
1019 |
private final val _log_store: Build_Log.Store = Build_Log.store(build_options) |
502525a82d9f
remove laziness: no need, and errors during initialization loop with close();
Fabian Huch <huch@in.tum.de>
parents:
79931
diff
changeset
|
1020 |
private final val _log_database: SQL.Database = |
79290
9deadc9d8872
separate build processes for scheduler and scheduled;
Fabian Huch <huch@in.tum.de>
parents:
79289
diff
changeset
|
1021 |
try { |
9deadc9d8872
separate build processes for scheduler and scheduled;
Fabian Huch <huch@in.tum.de>
parents:
79289
diff
changeset
|
1022 |
val db = _log_store.open_database(server = this.server) |
9deadc9d8872
separate build processes for scheduler and scheduled;
Fabian Huch <huch@in.tum.de>
parents:
79289
diff
changeset
|
1023 |
_log_store.init_database(db) |
9deadc9d8872
separate build processes for scheduler and scheduled;
Fabian Huch <huch@in.tum.de>
parents:
79289
diff
changeset
|
1024 |
db |
9deadc9d8872
separate build processes for scheduler and scheduled;
Fabian Huch <huch@in.tum.de>
parents:
79289
diff
changeset
|
1025 |
} |
9deadc9d8872
separate build processes for scheduler and scheduled;
Fabian Huch <huch@in.tum.de>
parents:
79289
diff
changeset
|
1026 |
catch { case exn: Throwable => close(); throw exn } |
9deadc9d8872
separate build processes for scheduler and scheduled;
Fabian Huch <huch@in.tum.de>
parents:
79289
diff
changeset
|
1027 |
|
9deadc9d8872
separate build processes for scheduler and scheduled;
Fabian Huch <huch@in.tum.de>
parents:
79289
diff
changeset
|
1028 |
override def close(): Unit = { |
9deadc9d8872
separate build processes for scheduler and scheduled;
Fabian Huch <huch@in.tum.de>
parents:
79289
diff
changeset
|
1029 |
Option(_log_database).foreach(_.close()) |
9deadc9d8872
separate build processes for scheduler and scheduled;
Fabian Huch <huch@in.tum.de>
parents:
79289
diff
changeset
|
1030 |
super.close() |
9deadc9d8872
separate build processes for scheduler and scheduled;
Fabian Huch <huch@in.tum.de>
parents:
79289
diff
changeset
|
1031 |
} |
9deadc9d8872
separate build processes for scheduler and scheduled;
Fabian Huch <huch@in.tum.de>
parents:
79289
diff
changeset
|
1032 |
|
9deadc9d8872
separate build processes for scheduler and scheduled;
Fabian Huch <huch@in.tum.de>
parents:
79289
diff
changeset
|
1033 |
|
78845
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
1034 |
/* previous results via build log */ |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
1035 |
|
79765
a478fc5cd5bd
partially revert f1f08ca40d96: benchmark data needs to be present before timing data is loaded;
Fabian Huch <huch@in.tum.de>
parents:
79761
diff
changeset
|
1036 |
override def open_build_cluster(): Build_Cluster = { |
a478fc5cd5bd
partially revert f1f08ca40d96: benchmark data needs to be present before timing data is loaded;
Fabian Huch <huch@in.tum.de>
parents:
79761
diff
changeset
|
1037 |
val build_cluster = super.open_build_cluster() |
a478fc5cd5bd
partially revert f1f08ca40d96: benchmark data needs to be present before timing data is loaded;
Fabian Huch <huch@in.tum.de>
parents:
79761
diff
changeset
|
1038 |
build_cluster.init() |
a478fc5cd5bd
partially revert f1f08ca40d96: benchmark data needs to be present before timing data is loaded;
Fabian Huch <huch@in.tum.de>
parents:
79761
diff
changeset
|
1039 |
|
a478fc5cd5bd
partially revert f1f08ca40d96: benchmark data needs to be present before timing data is loaded;
Fabian Huch <huch@in.tum.de>
parents:
79761
diff
changeset
|
1040 |
Build_Benchmark.benchmark_requirements(build_options) |
a478fc5cd5bd
partially revert f1f08ca40d96: benchmark data needs to be present before timing data is loaded;
Fabian Huch <huch@in.tum.de>
parents:
79761
diff
changeset
|
1041 |
|
a478fc5cd5bd
partially revert f1f08ca40d96: benchmark data needs to be present before timing data is loaded;
Fabian Huch <huch@in.tum.de>
parents:
79761
diff
changeset
|
1042 |
if (build_context.worker) { |
a478fc5cd5bd
partially revert f1f08ca40d96: benchmark data needs to be present before timing data is loaded;
Fabian Huch <huch@in.tum.de>
parents:
79761
diff
changeset
|
1043 |
val benchmark_options = build_options.string("build_hostname") = hostname |
79947
5eb90c1ce653
add hosts option to run benchmark on the cluster from the command-line;
Fabian Huch <huch@in.tum.de>
parents:
79946
diff
changeset
|
1044 |
Build_Benchmark.run_benchmark(benchmark_options, progress) |
79765
a478fc5cd5bd
partially revert f1f08ca40d96: benchmark data needs to be present before timing data is loaded;
Fabian Huch <huch@in.tum.de>
parents:
79761
diff
changeset
|
1045 |
} |
a478fc5cd5bd
partially revert f1f08ca40d96: benchmark data needs to be present before timing data is loaded;
Fabian Huch <huch@in.tum.de>
parents:
79761
diff
changeset
|
1046 |
|
a478fc5cd5bd
partially revert f1f08ca40d96: benchmark data needs to be present before timing data is loaded;
Fabian Huch <huch@in.tum.de>
parents:
79761
diff
changeset
|
1047 |
build_cluster.benchmark() |
a478fc5cd5bd
partially revert f1f08ca40d96: benchmark data needs to be present before timing data is loaded;
Fabian Huch <huch@in.tum.de>
parents:
79761
diff
changeset
|
1048 |
} |
a478fc5cd5bd
partially revert f1f08ca40d96: benchmark data needs to be present before timing data is loaded;
Fabian Huch <huch@in.tum.de>
parents:
79761
diff
changeset
|
1049 |
|
78845
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
1050 |
private val timing_data: Timing_Data = { |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
1051 |
val cluster_hosts: List[Build_Cluster.Host] = |
79878 | 1052 |
if (!build_context.worker) build_context.build_hosts |
78845
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
1053 |
else { |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
1054 |
val local_build_host = |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
1055 |
Build_Cluster.Host( |
79616 | 1056 |
hostname, jobs = build_context.jobs, numa = build_context.numa_shuffling) |
78845
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
1057 |
local_build_host :: build_context.build_hosts |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
1058 |
} |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
1059 |
|
79926
dc4a387a6f02
clarified host: pre-load max threads;
Fabian Huch <huch@in.tum.de>
parents:
79925
diff
changeset
|
1060 |
val host_infos = Host_Infos.load(build_options, cluster_hosts, _host_database) |
79877
9aef1d1535ff
use timeout as default build time predictor if no data is available;
Fabian Huch <huch@in.tum.de>
parents:
79871
diff
changeset
|
1061 |
Timing_Data.load(host_infos, _log_database, build_context.sessions_structure) |
78845
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
1062 |
} |
78928
6c2c60b852e0
move timing data into scheduler for more efficient heuristics (e.g., with pre-calculated values);
Fabian Huch <huch@in.tum.de>
parents:
78888
diff
changeset
|
1063 |
private val scheduler = init_scheduler(timing_data) |
78845
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
1064 |
|
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
1065 |
def write_build_log(results: Build.Results, state: Build_Process.State.Results): Unit = { |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
1066 |
val sessions = |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
1067 |
for { |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
1068 |
(session_name, result) <- state.toList |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
1069 |
if !result.current |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
1070 |
} yield { |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
1071 |
val info = build_context.sessions_structure(session_name) |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
1072 |
val entry = |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
1073 |
if (!results.cancelled(session_name)) { |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
1074 |
val status = |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
1075 |
if (result.ok) Build_Log.Session_Status.finished |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
1076 |
else Build_Log.Session_Status.failed |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
1077 |
|
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
1078 |
Build_Log.Session_Entry( |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
1079 |
chapter = info.chapter, |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
1080 |
groups = info.groups, |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
1081 |
hostname = Some(result.node_info.hostname), |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
1082 |
threads = Some(timing_data.host_infos.num_threads(result.node_info)), |
79892
c793de82db34
track start in build job results (following 9d484c5d3a63), so it can directly be written to build log database;
Fabian Huch <huch@in.tum.de>
parents:
79891
diff
changeset
|
1083 |
start = Some(result.start_date - build_start), |
78845
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
1084 |
timing = result.process_result.timing, |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
1085 |
sources = Some(result.output_shasum.digest.toString), |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
1086 |
status = Some(status)) |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
1087 |
} |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
1088 |
else |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
1089 |
Build_Log.Session_Entry( |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
1090 |
chapter = info.chapter, |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
1091 |
groups = info.groups, |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
1092 |
status = Some(Build_Log.Session_Status.cancelled)) |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
1093 |
session_name -> entry |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
1094 |
} |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
1095 |
|
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
1096 |
val settings = |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
1097 |
Build_Log.Settings.all_settings.map(_.name).map(name => |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
1098 |
name -> Isabelle_System.getenv(name)) |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
1099 |
val props = |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
1100 |
List( |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
1101 |
Build_Log.Prop.build_id.name -> build_context.build_uuid, |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
1102 |
Build_Log.Prop.build_engine.name -> build_context.engine.name, |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
1103 |
Build_Log.Prop.build_host.name -> hostname, |
79891
d8b4bfe82bb5
use inherited build_start, following d9fc2cc37694;
Fabian Huch <huch@in.tum.de>
parents:
79880
diff
changeset
|
1104 |
Build_Log.Prop.build_start.name -> Build_Log.print_date(build_start)) |
78845
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
1105 |
|
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
1106 |
val meta_info = Build_Log.Meta_Info(props, settings) |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
1107 |
val build_info = Build_Log.Build_Info(sessions.toMap) |
79891
d8b4bfe82bb5
use inherited build_start, following d9fc2cc37694;
Fabian Huch <huch@in.tum.de>
parents:
79880
diff
changeset
|
1108 |
val log_name = Build_Log.log_filename(engine = build_context.engine.name, date = build_start) |
78845
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
1109 |
|
79062
6977fb0153fb
clarified modules: Build_Log.private_data provides raw data access without transaction_lock;
wenzelm
parents:
79042
diff
changeset
|
1110 |
Build_Log.private_data.update_sessions( |
6977fb0153fb
clarified modules: Build_Log.private_data provides raw data access without transaction_lock;
wenzelm
parents:
79042
diff
changeset
|
1111 |
_log_database, _log_store.cache.compress, log_name.file_name, build_info) |
6977fb0153fb
clarified modules: Build_Log.private_data provides raw data access without transaction_lock;
wenzelm
parents:
79042
diff
changeset
|
1112 |
Build_Log.private_data.update_meta_info(_log_database, log_name.file_name, meta_info) |
78845
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
1113 |
} |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
1114 |
|
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
1115 |
|
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
1116 |
/* build process */ |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
1117 |
|
78969
1b05c2b10c9f
finalize current sessions before generating schedule;
Fabian Huch <huch@in.tum.de>
parents:
78968
diff
changeset
|
1118 |
def is_current(state: Build_Process.State, session_name: String): Boolean = |
1b05c2b10c9f
finalize current sessions before generating schedule;
Fabian Huch <huch@in.tum.de>
parents:
78968
diff
changeset
|
1119 |
state.ancestor_results(session_name) match { |
1b05c2b10c9f
finalize current sessions before generating schedule;
Fabian Huch <huch@in.tum.de>
parents:
78968
diff
changeset
|
1120 |
case Some(ancestor_results) if ancestor_results.forall(_.current) => |
1b05c2b10c9f
finalize current sessions before generating schedule;
Fabian Huch <huch@in.tum.de>
parents:
78968
diff
changeset
|
1121 |
store.check_output( |
1b05c2b10c9f
finalize current sessions before generating schedule;
Fabian Huch <huch@in.tum.de>
parents:
78968
diff
changeset
|
1122 |
_database_server, session_name, |
80125 | 1123 |
sources_shasum = state.sessions(session_name).sources_shasum, |
1124 |
input_shasum = ML_Process.make_shasum(ancestor_results.map(_.output_shasum)), |
|
80128 | 1125 |
build_thorough = build_context.sessions_structure(session_name).build_thorough, |
78969
1b05c2b10c9f
finalize current sessions before generating schedule;
Fabian Huch <huch@in.tum.de>
parents:
78968
diff
changeset
|
1126 |
fresh_build = build_context.fresh_build, |
80125 | 1127 |
store_heap = build_context.store_heap || state.sessions.store_heap(session_name))._1 |
78969
1b05c2b10c9f
finalize current sessions before generating schedule;
Fabian Huch <huch@in.tum.de>
parents:
78968
diff
changeset
|
1128 |
case _ => false |
79911 | 1129 |
} |
78969
1b05c2b10c9f
finalize current sessions before generating schedule;
Fabian Huch <huch@in.tum.de>
parents:
78968
diff
changeset
|
1130 |
|
79192
5db03f9276e2
clarified: build schedules may be outdated when empty, after some time, or due to build progress;
Fabian Huch <huch@in.tum.de>
parents:
79191
diff
changeset
|
1131 |
override def next_jobs(state: Build_Process.State): List[String] = |
79290
9deadc9d8872
separate build processes for scheduler and scheduled;
Fabian Huch <huch@in.tum.de>
parents:
79289
diff
changeset
|
1132 |
if (progress.stopped) state.next_ready.map(_.name) |
9deadc9d8872
separate build processes for scheduler and scheduled;
Fabian Huch <huch@in.tum.de>
parents:
79289
diff
changeset
|
1133 |
else if (!_schedule.is_outdated(build_options, state)) _schedule.next(hostname, state) |
78845
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
1134 |
else { |
79020
ef76705bf402
clarified ready vs. next ready;
Fabian Huch <huch@in.tum.de>
parents:
79019
diff
changeset
|
1135 |
val current = state.next_ready.filter(task => is_current(state, task.name)) |
79187 | 1136 |
if (current.nonEmpty) current.map(_.name) |
78969
1b05c2b10c9f
finalize current sessions before generating schedule;
Fabian Huch <huch@in.tum.de>
parents:
78968
diff
changeset
|
1137 |
else { |
1b05c2b10c9f
finalize current sessions before generating schedule;
Fabian Huch <huch@in.tum.de>
parents:
78968
diff
changeset
|
1138 |
val start = Time.now() |
79193
d1d6dbab2901
compare previous build schedule with new one, to prevent regressions;
Fabian Huch <huch@in.tum.de>
parents:
79192
diff
changeset
|
1139 |
|
79592
7db599be70cc
clarified scheduler: proper split into scheduler, generator, and priority rules (following 32d00ec387f4);
Fabian Huch <huch@in.tum.de>
parents:
79534
diff
changeset
|
1140 |
val new_schedule = scheduler.schedule(state).update(state) |
79193
d1d6dbab2901
compare previous build schedule with new one, to prevent regressions;
Fabian Huch <huch@in.tum.de>
parents:
79192
diff
changeset
|
1141 |
val schedule = |
79293 | 1142 |
if (_schedule.is_empty) new_schedule |
79193
d1d6dbab2901
compare previous build schedule with new one, to prevent regressions;
Fabian Huch <huch@in.tum.de>
parents:
79192
diff
changeset
|
1143 |
else List(_schedule.update(state), new_schedule).minBy(_.end)(Date.Ordering) |
d1d6dbab2901
compare previous build schedule with new one, to prevent regressions;
Fabian Huch <huch@in.tum.de>
parents:
79192
diff
changeset
|
1144 |
|
78969
1b05c2b10c9f
finalize current sessions before generating schedule;
Fabian Huch <huch@in.tum.de>
parents:
78968
diff
changeset
|
1145 |
val elapsed = Time.now() - start |
78884 | 1146 |
|
78976 | 1147 |
val timing_msg = if (elapsed.is_relevant) " (took " + elapsed.message + ")" else "" |
79935
7a7f1d5dcfe9
only print schedule if relevant;
Fabian Huch <huch@in.tum.de>
parents:
79934
diff
changeset
|
1148 |
progress.echo_if( |
7a7f1d5dcfe9
only print schedule if relevant;
Fabian Huch <huch@in.tum.de>
parents:
79934
diff
changeset
|
1149 |
_schedule.deviation(schedule).minutes > 1 && schedule.duration >= Time.seconds(1), |
7a7f1d5dcfe9
only print schedule if relevant;
Fabian Huch <huch@in.tum.de>
parents:
79934
diff
changeset
|
1150 |
schedule.message + timing_msg) |
78845
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
1151 |
|
79183
32d00ec387f4
use schedule directly instead of extra cache;
Fabian Huch <huch@in.tum.de>
parents:
79182
diff
changeset
|
1152 |
_schedule = schedule |
32d00ec387f4
use schedule directly instead of extra cache;
Fabian Huch <huch@in.tum.de>
parents:
79182
diff
changeset
|
1153 |
_schedule.next(hostname, state) |
78969
1b05c2b10c9f
finalize current sessions before generating schedule;
Fabian Huch <huch@in.tum.de>
parents:
78968
diff
changeset
|
1154 |
} |
78845
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
1155 |
} |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
1156 |
|
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
1157 |
override def run(): Build.Results = { |
79896
2c9c5ae99a09
proper IPC for scheduled builds, following 7ae25372ab04;
Fabian Huch <huch@in.tum.de>
parents:
79895
diff
changeset
|
1158 |
val vacuous = |
2c9c5ae99a09
proper IPC for scheduled builds, following 7ae25372ab04;
Fabian Huch <huch@in.tum.de>
parents:
79895
diff
changeset
|
1159 |
synchronized_database("Scheduler_Build_Process.init") { |
2c9c5ae99a09
proper IPC for scheduled builds, following 7ae25372ab04;
Fabian Huch <huch@in.tum.de>
parents:
79895
diff
changeset
|
1160 |
for (db <- _build_database) Build_Process.private_data.clean_build(db) |
2c9c5ae99a09
proper IPC for scheduled builds, following 7ae25372ab04;
Fabian Huch <huch@in.tum.de>
parents:
79895
diff
changeset
|
1161 |
init_unsynchronized() |
2c9c5ae99a09
proper IPC for scheduled builds, following 7ae25372ab04;
Fabian Huch <huch@in.tum.de>
parents:
79895
diff
changeset
|
1162 |
_state.pending.isEmpty |
2c9c5ae99a09
proper IPC for scheduled builds, following 7ae25372ab04;
Fabian Huch <huch@in.tum.de>
parents:
79895
diff
changeset
|
1163 |
} |
2c9c5ae99a09
proper IPC for scheduled builds, following 7ae25372ab04;
Fabian Huch <huch@in.tum.de>
parents:
79895
diff
changeset
|
1164 |
if (vacuous) { |
2c9c5ae99a09
proper IPC for scheduled builds, following 7ae25372ab04;
Fabian Huch <huch@in.tum.de>
parents:
79895
diff
changeset
|
1165 |
progress.echo_warning("Nothing to build") |
2c9c5ae99a09
proper IPC for scheduled builds, following 7ae25372ab04;
Fabian Huch <huch@in.tum.de>
parents:
79895
diff
changeset
|
1166 |
stop_build() |
2c9c5ae99a09
proper IPC for scheduled builds, following 7ae25372ab04;
Fabian Huch <huch@in.tum.de>
parents:
79895
diff
changeset
|
1167 |
Build.Results(build_context) |
2c9c5ae99a09
proper IPC for scheduled builds, following 7ae25372ab04;
Fabian Huch <huch@in.tum.de>
parents:
79895
diff
changeset
|
1168 |
} |
2c9c5ae99a09
proper IPC for scheduled builds, following 7ae25372ab04;
Fabian Huch <huch@in.tum.de>
parents:
79895
diff
changeset
|
1169 |
else { |
2c9c5ae99a09
proper IPC for scheduled builds, following 7ae25372ab04;
Fabian Huch <huch@in.tum.de>
parents:
79895
diff
changeset
|
1170 |
start_worker() |
2c9c5ae99a09
proper IPC for scheduled builds, following 7ae25372ab04;
Fabian Huch <huch@in.tum.de>
parents:
79895
diff
changeset
|
1171 |
_build_cluster.start() |
2c9c5ae99a09
proper IPC for scheduled builds, following 7ae25372ab04;
Fabian Huch <huch@in.tum.de>
parents:
79895
diff
changeset
|
1172 |
|
2c9c5ae99a09
proper IPC for scheduled builds, following 7ae25372ab04;
Fabian Huch <huch@in.tum.de>
parents:
79895
diff
changeset
|
1173 |
try { |
2c9c5ae99a09
proper IPC for scheduled builds, following 7ae25372ab04;
Fabian Huch <huch@in.tum.de>
parents:
79895
diff
changeset
|
1174 |
while (!finished()) { |
2c9c5ae99a09
proper IPC for scheduled builds, following 7ae25372ab04;
Fabian Huch <huch@in.tum.de>
parents:
79895
diff
changeset
|
1175 |
synchronized_database("Scheduler_Build_Process.main") { |
2c9c5ae99a09
proper IPC for scheduled builds, following 7ae25372ab04;
Fabian Huch <huch@in.tum.de>
parents:
79895
diff
changeset
|
1176 |
if (progress.stopped) _state.build_running.foreach(_.cancel()) |
2c9c5ae99a09
proper IPC for scheduled builds, following 7ae25372ab04;
Fabian Huch <huch@in.tum.de>
parents:
79895
diff
changeset
|
1177 |
main_unsynchronized() |
2c9c5ae99a09
proper IPC for scheduled builds, following 7ae25372ab04;
Fabian Huch <huch@in.tum.de>
parents:
79895
diff
changeset
|
1178 |
for { |
2c9c5ae99a09
proper IPC for scheduled builds, following 7ae25372ab04;
Fabian Huch <huch@in.tum.de>
parents:
79895
diff
changeset
|
1179 |
host <- build_context.build_hosts |
2c9c5ae99a09
proper IPC for scheduled builds, following 7ae25372ab04;
Fabian Huch <huch@in.tum.de>
parents:
79895
diff
changeset
|
1180 |
if _schedule.exists_next(host.name, _state) |
2c9c5ae99a09
proper IPC for scheduled builds, following 7ae25372ab04;
Fabian Huch <huch@in.tum.de>
parents:
79895
diff
changeset
|
1181 |
} build_send(Build_Schedule.private_data.channel_ready(host.name)) |
2c9c5ae99a09
proper IPC for scheduled builds, following 7ae25372ab04;
Fabian Huch <huch@in.tum.de>
parents:
79895
diff
changeset
|
1182 |
} |
79911 | 1183 |
while (!build_action()) {} |
79896
2c9c5ae99a09
proper IPC for scheduled builds, following 7ae25372ab04;
Fabian Huch <huch@in.tum.de>
parents:
79895
diff
changeset
|
1184 |
} |
2c9c5ae99a09
proper IPC for scheduled builds, following 7ae25372ab04;
Fabian Huch <huch@in.tum.de>
parents:
79895
diff
changeset
|
1185 |
} |
2c9c5ae99a09
proper IPC for scheduled builds, following 7ae25372ab04;
Fabian Huch <huch@in.tum.de>
parents:
79895
diff
changeset
|
1186 |
finally { |
2c9c5ae99a09
proper IPC for scheduled builds, following 7ae25372ab04;
Fabian Huch <huch@in.tum.de>
parents:
79895
diff
changeset
|
1187 |
_build_cluster.stop() |
2c9c5ae99a09
proper IPC for scheduled builds, following 7ae25372ab04;
Fabian Huch <huch@in.tum.de>
parents:
79895
diff
changeset
|
1188 |
stop_worker() |
2c9c5ae99a09
proper IPC for scheduled builds, following 7ae25372ab04;
Fabian Huch <huch@in.tum.de>
parents:
79895
diff
changeset
|
1189 |
stop_build() |
79527
f1f08ca40d96
make build process state protected to avoid copying in subclasses (e.g. for database connections);
Fabian Huch <huch@in.tum.de>
parents:
79502
diff
changeset
|
1190 |
} |
f1f08ca40d96
make build process state protected to avoid copying in subclasses (e.g. for database connections);
Fabian Huch <huch@in.tum.de>
parents:
79502
diff
changeset
|
1191 |
|
79896
2c9c5ae99a09
proper IPC for scheduled builds, following 7ae25372ab04;
Fabian Huch <huch@in.tum.de>
parents:
79895
diff
changeset
|
1192 |
val results = synchronized_database("Scheduler_Build_Process.result") { |
2c9c5ae99a09
proper IPC for scheduled builds, following 7ae25372ab04;
Fabian Huch <huch@in.tum.de>
parents:
79895
diff
changeset
|
1193 |
val results = for ((name, result) <- _state.results) yield name -> result.process_result |
2c9c5ae99a09
proper IPC for scheduled builds, following 7ae25372ab04;
Fabian Huch <huch@in.tum.de>
parents:
79895
diff
changeset
|
1194 |
Build.Results(build_context, results = results, other_rc = _build_cluster.rc) |
2c9c5ae99a09
proper IPC for scheduled builds, following 7ae25372ab04;
Fabian Huch <huch@in.tum.de>
parents:
79895
diff
changeset
|
1195 |
} |
2c9c5ae99a09
proper IPC for scheduled builds, following 7ae25372ab04;
Fabian Huch <huch@in.tum.de>
parents:
79895
diff
changeset
|
1196 |
write_build_log(results, _state.results) |
2c9c5ae99a09
proper IPC for scheduled builds, following 7ae25372ab04;
Fabian Huch <huch@in.tum.de>
parents:
79895
diff
changeset
|
1197 |
results |
2c9c5ae99a09
proper IPC for scheduled builds, following 7ae25372ab04;
Fabian Huch <huch@in.tum.de>
parents:
79895
diff
changeset
|
1198 |
} |
78845
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
1199 |
} |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
1200 |
} |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
1201 |
|
79186
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1202 |
|
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1203 |
/** SQL data model of build schedule, extending isabelle_build database */ |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1204 |
|
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1205 |
object private_data extends SQL.Data("isabelle_build") { |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1206 |
import Build_Process.private_data.{Base, Generic} |
79896
2c9c5ae99a09
proper IPC for scheduled builds, following 7ae25372ab04;
Fabian Huch <huch@in.tum.de>
parents:
79895
diff
changeset
|
1207 |
/* tables */ |
79186
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1208 |
|
79844
ac40138234ce
tuned signature: more uniform SQL.Data instances;
wenzelm
parents:
79835
diff
changeset
|
1209 |
override lazy val tables: SQL.Tables = |
ac40138234ce
tuned signature: more uniform SQL.Data instances;
wenzelm
parents:
79835
diff
changeset
|
1210 |
SQL.Tables(Schedules.table, Nodes.table) |
ac40138234ce
tuned signature: more uniform SQL.Data instances;
wenzelm
parents:
79835
diff
changeset
|
1211 |
|
ac40138234ce
tuned signature: more uniform SQL.Data instances;
wenzelm
parents:
79835
diff
changeset
|
1212 |
lazy val all_tables: SQL.Tables = |
ac40138234ce
tuned signature: more uniform SQL.Data instances;
wenzelm
parents:
79835
diff
changeset
|
1213 |
SQL.Tables.list(Build_Process.private_data.tables.list ::: tables.list) |
ac40138234ce
tuned signature: more uniform SQL.Data instances;
wenzelm
parents:
79835
diff
changeset
|
1214 |
|
79896
2c9c5ae99a09
proper IPC for scheduled builds, following 7ae25372ab04;
Fabian Huch <huch@in.tum.de>
parents:
79895
diff
changeset
|
1215 |
/* notifications */ |
2c9c5ae99a09
proper IPC for scheduled builds, following 7ae25372ab04;
Fabian Huch <huch@in.tum.de>
parents:
79895
diff
changeset
|
1216 |
|
2c9c5ae99a09
proper IPC for scheduled builds, following 7ae25372ab04;
Fabian Huch <huch@in.tum.de>
parents:
79895
diff
changeset
|
1217 |
def channel_ready(hostname: String): SQL.Notification = |
2c9c5ae99a09
proper IPC for scheduled builds, following 7ae25372ab04;
Fabian Huch <huch@in.tum.de>
parents:
79895
diff
changeset
|
1218 |
SQL.Notification(Build_Process.private_data.channel, payload = hostname) |
2c9c5ae99a09
proper IPC for scheduled builds, following 7ae25372ab04;
Fabian Huch <huch@in.tum.de>
parents:
79895
diff
changeset
|
1219 |
|
79186
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1220 |
|
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1221 |
/* schedule */ |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1222 |
|
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1223 |
object Schedules { |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1224 |
val build_uuid = Generic.build_uuid.make_primary_key |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1225 |
val generator = SQL.Column.string("generator") |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1226 |
val start = SQL.Column.date("start") |
79190
2039f3609884
add serial for build schedule to avoid unnecessary db read/writes;
Fabian Huch <huch@in.tum.de>
parents:
79189
diff
changeset
|
1227 |
val serial = SQL.Column.long("serial") |
79186
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1228 |
|
79190
2039f3609884
add serial for build schedule to avoid unnecessary db read/writes;
Fabian Huch <huch@in.tum.de>
parents:
79189
diff
changeset
|
1229 |
val table = make_table(List(build_uuid, generator, start, serial), name = "schedules") |
79186
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1230 |
} |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1231 |
|
79190
2039f3609884
add serial for build schedule to avoid unnecessary db read/writes;
Fabian Huch <huch@in.tum.de>
parents:
79189
diff
changeset
|
1232 |
def read_serial(db: SQL.Database, build_uuid: String = ""): Long = |
2039f3609884
add serial for build schedule to avoid unnecessary db read/writes;
Fabian Huch <huch@in.tum.de>
parents:
79189
diff
changeset
|
1233 |
db.execute_query_statementO[Long]( |
2039f3609884
add serial for build schedule to avoid unnecessary db read/writes;
Fabian Huch <huch@in.tum.de>
parents:
79189
diff
changeset
|
1234 |
Schedules.table.select(List(Schedules.serial.max), sql = |
2039f3609884
add serial for build schedule to avoid unnecessary db read/writes;
Fabian Huch <huch@in.tum.de>
parents:
79189
diff
changeset
|
1235 |
SQL.where(if_proper(build_uuid, Schedules.build_uuid.equal(build_uuid)))), |
2039f3609884
add serial for build schedule to avoid unnecessary db read/writes;
Fabian Huch <huch@in.tum.de>
parents:
79189
diff
changeset
|
1236 |
_.long(Schedules.serial)).getOrElse(0L) |
2039f3609884
add serial for build schedule to avoid unnecessary db read/writes;
Fabian Huch <huch@in.tum.de>
parents:
79189
diff
changeset
|
1237 |
|
79832
2a3c0a68221c
misc tuning: prefer Build_Process.Update operations;
wenzelm
parents:
79829
diff
changeset
|
1238 |
def read_scheduled_builds_domain(db: SQL.Database): Map[String, Unit] = |
79186
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1239 |
db.execute_query_statement( |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1240 |
Schedules.table.select(List(Schedules.build_uuid)), |
79832
2a3c0a68221c
misc tuning: prefer Build_Process.Update operations;
wenzelm
parents:
79829
diff
changeset
|
1241 |
Map.from[String, Unit], res => res.string(Schedules.build_uuid) -> ()) |
79186
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1242 |
|
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1243 |
def read_schedules(db: SQL.Database, build_uuid: String = ""): List[Schedule] = { |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1244 |
val schedules = |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1245 |
db.execute_query_statement(Schedules.table.select(sql = |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1246 |
SQL.where(if_proper(build_uuid, Schedules.build_uuid.equal(build_uuid)))), |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1247 |
List.from[Schedule], |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1248 |
{ res => |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1249 |
val build_uuid = res.string(Schedules.build_uuid) |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1250 |
val generator = res.string(Schedules.generator) |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1251 |
val start = res.date(Schedules.start) |
79287
b88b6ed06334
read serial for schedules (amending 2039f360);
Fabian Huch <huch@in.tum.de>
parents:
79236
diff
changeset
|
1252 |
val serial = res.long(Schedules.serial) |
b88b6ed06334
read serial for schedules (amending 2039f360);
Fabian Huch <huch@in.tum.de>
parents:
79236
diff
changeset
|
1253 |
Schedule(build_uuid, generator, start, Graph.empty, serial) |
79186
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1254 |
}) |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1255 |
|
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1256 |
for (schedule <- schedules.sortBy(_.start)(Date.Ordering)) yield { |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1257 |
val nodes = private_data.read_nodes(db, build_uuid = schedule.build_uuid) |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1258 |
schedule.copy(graph = Graph.make(nodes)) |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1259 |
} |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1260 |
} |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1261 |
|
79190
2039f3609884
add serial for build schedule to avoid unnecessary db read/writes;
Fabian Huch <huch@in.tum.de>
parents:
79189
diff
changeset
|
1262 |
def write_schedule(db: SQL.Database, schedule: Schedule): Unit = { |
79186
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1263 |
db.execute_statement( |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1264 |
Schedules.table.delete(Schedules.build_uuid.where_equal(schedule.build_uuid))) |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1265 |
db.execute_statement(Schedules.table.insert(), { stmt => |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1266 |
stmt.string(1) = schedule.build_uuid |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1267 |
stmt.string(2) = schedule.generator |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1268 |
stmt.date(3) = schedule.start |
79190
2039f3609884
add serial for build schedule to avoid unnecessary db read/writes;
Fabian Huch <huch@in.tum.de>
parents:
79189
diff
changeset
|
1269 |
stmt.long(4) = schedule.serial |
79186
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1270 |
}) |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1271 |
update_nodes(db, schedule.build_uuid, schedule.graph.dest) |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1272 |
} |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1273 |
|
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1274 |
|
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1275 |
/* nodes */ |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1276 |
|
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1277 |
object Nodes { |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1278 |
val build_uuid = Generic.build_uuid.make_primary_key |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1279 |
val name = Generic.name.make_primary_key |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1280 |
val succs = SQL.Column.string("succs") |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1281 |
val hostname = SQL.Column.string("hostname") |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1282 |
val numa_node = SQL.Column.int("numa_node") |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1283 |
val rel_cpus = SQL.Column.string("rel_cpus") |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1284 |
val start = SQL.Column.date("start") |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1285 |
val duration = SQL.Column.long("duration") |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1286 |
|
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1287 |
val table = |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1288 |
make_table( |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1289 |
List(build_uuid, name, succs, hostname, numa_node, rel_cpus, start, duration), |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1290 |
name = "schedule_nodes") |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1291 |
} |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1292 |
|
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1293 |
type Nodes = List[((String, Schedule.Node), List[String])] |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1294 |
|
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1295 |
def read_nodes(db: SQL.Database, build_uuid: String = ""): Nodes = { |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1296 |
db.execute_query_statement( |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1297 |
Nodes.table.select(sql = |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1298 |
SQL.where(if_proper(build_uuid, Nodes.build_uuid.equal(build_uuid)))), |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1299 |
List.from[((String, Schedule.Node), List[String])], |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1300 |
{ res => |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1301 |
val name = res.string(Nodes.name) |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1302 |
val succs = split_lines(res.string(Nodes.succs)) |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1303 |
val hostname = res.string(Nodes.hostname) |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1304 |
val numa_node = res.get_int(Nodes.numa_node) |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1305 |
val rel_cpus = res.string(Nodes.rel_cpus) |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1306 |
val start = res.date(Nodes.start) |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1307 |
val duration = Time.ms(res.long(Nodes.duration)) |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1308 |
|
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1309 |
val node_info = Node_Info(hostname, numa_node, isabelle.Host.Range.from(rel_cpus)) |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1310 |
((name, Schedule.Node(name, node_info, start, duration)), succs) |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1311 |
} |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1312 |
) |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1313 |
} |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1314 |
|
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1315 |
def update_nodes(db: SQL.Database, build_uuid: String, nodes: Nodes): Unit = { |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1316 |
db.execute_statement(Nodes.table.delete(Nodes.build_uuid.where_equal(build_uuid))) |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1317 |
db.execute_batch_statement(Nodes.table.insert(), batch = |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1318 |
for (((name, node), succs) <- nodes) yield { (stmt: SQL.Statement) => |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1319 |
stmt.string(1) = build_uuid |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1320 |
stmt.string(2) = name |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1321 |
stmt.string(3) = cat_lines(succs) |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1322 |
stmt.string(4) = node.node_info.hostname |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1323 |
stmt.int(5) = node.node_info.numa_node |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1324 |
stmt.string(6) = isabelle.Host.Range(node.node_info.rel_cpus) |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1325 |
stmt.date(7) = node.start |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1326 |
stmt.long(8) = node.duration.ms |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1327 |
}) |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1328 |
} |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1329 |
|
79190
2039f3609884
add serial for build schedule to avoid unnecessary db read/writes;
Fabian Huch <huch@in.tum.de>
parents:
79189
diff
changeset
|
1330 |
def pull_schedule(db: SQL.Database, old_schedule: Schedule): Build_Schedule.Schedule = { |
2039f3609884
add serial for build schedule to avoid unnecessary db read/writes;
Fabian Huch <huch@in.tum.de>
parents:
79189
diff
changeset
|
1331 |
val serial_db = read_serial(db) |
2039f3609884
add serial for build schedule to avoid unnecessary db read/writes;
Fabian Huch <huch@in.tum.de>
parents:
79189
diff
changeset
|
1332 |
if (serial_db == old_schedule.serial) old_schedule |
2039f3609884
add serial for build schedule to avoid unnecessary db read/writes;
Fabian Huch <huch@in.tum.de>
parents:
79189
diff
changeset
|
1333 |
else { |
2039f3609884
add serial for build schedule to avoid unnecessary db read/writes;
Fabian Huch <huch@in.tum.de>
parents:
79189
diff
changeset
|
1334 |
read_schedules(db, old_schedule.build_uuid) match { |
2039f3609884
add serial for build schedule to avoid unnecessary db read/writes;
Fabian Huch <huch@in.tum.de>
parents:
79189
diff
changeset
|
1335 |
case Nil => old_schedule |
2039f3609884
add serial for build schedule to avoid unnecessary db read/writes;
Fabian Huch <huch@in.tum.de>
parents:
79189
diff
changeset
|
1336 |
case schedules => Library.the_single(schedules) |
2039f3609884
add serial for build schedule to avoid unnecessary db read/writes;
Fabian Huch <huch@in.tum.de>
parents:
79189
diff
changeset
|
1337 |
} |
79186
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1338 |
} |
79190
2039f3609884
add serial for build schedule to avoid unnecessary db read/writes;
Fabian Huch <huch@in.tum.de>
parents:
79189
diff
changeset
|
1339 |
} |
2039f3609884
add serial for build schedule to avoid unnecessary db read/writes;
Fabian Huch <huch@in.tum.de>
parents:
79189
diff
changeset
|
1340 |
|
79904 | 1341 |
def pull_schedule(db: SQL.Database, schedule: Schedule, old_schedule: Schedule): Schedule = { |
79190
2039f3609884
add serial for build schedule to avoid unnecessary db read/writes;
Fabian Huch <huch@in.tum.de>
parents:
79189
diff
changeset
|
1342 |
val changed = |
2039f3609884
add serial for build schedule to avoid unnecessary db read/writes;
Fabian Huch <huch@in.tum.de>
parents:
79189
diff
changeset
|
1343 |
schedule.generator != old_schedule.generator || |
2039f3609884
add serial for build schedule to avoid unnecessary db read/writes;
Fabian Huch <huch@in.tum.de>
parents:
79189
diff
changeset
|
1344 |
schedule.start != old_schedule.start || |
2039f3609884
add serial for build schedule to avoid unnecessary db read/writes;
Fabian Huch <huch@in.tum.de>
parents:
79189
diff
changeset
|
1345 |
schedule.graph != old_schedule.graph |
2039f3609884
add serial for build schedule to avoid unnecessary db read/writes;
Fabian Huch <huch@in.tum.de>
parents:
79189
diff
changeset
|
1346 |
|
2039f3609884
add serial for build schedule to avoid unnecessary db read/writes;
Fabian Huch <huch@in.tum.de>
parents:
79189
diff
changeset
|
1347 |
val schedule1 = |
79835 | 1348 |
if (changed) schedule.copy(serial = old_schedule.next_serial) else schedule |
79190
2039f3609884
add serial for build schedule to avoid unnecessary db read/writes;
Fabian Huch <huch@in.tum.de>
parents:
79189
diff
changeset
|
1349 |
if (schedule1.serial != schedule.serial) write_schedule(db, schedule1) |
79911 | 1350 |
|
79190
2039f3609884
add serial for build schedule to avoid unnecessary db read/writes;
Fabian Huch <huch@in.tum.de>
parents:
79189
diff
changeset
|
1351 |
schedule1 |
2039f3609884
add serial for build schedule to avoid unnecessary db read/writes;
Fabian Huch <huch@in.tum.de>
parents:
79189
diff
changeset
|
1352 |
} |
79186
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1353 |
|
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1354 |
def remove_schedules(db: SQL.Database, remove: List[String]): Unit = |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1355 |
if (remove.nonEmpty) { |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1356 |
val sql = Generic.build_uuid.where_member(remove) |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1357 |
db.execute_statement(SQL.MULTI(tables.map(_.delete(sql = sql)))) |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1358 |
} |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1359 |
|
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1360 |
def clean_build_schedules(db: SQL.Database): Unit = { |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1361 |
val running_builds_domain = |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1362 |
db.execute_query_statement( |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1363 |
Base.table.select(List(Base.build_uuid), sql = SQL.where(Base.stop.undefined)), |
79832
2a3c0a68221c
misc tuning: prefer Build_Process.Update operations;
wenzelm
parents:
79829
diff
changeset
|
1364 |
Map.from[String, Unit], res => res.string(Base.build_uuid) -> ()) |
79186
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1365 |
|
79834 | 1366 |
val update = Library.Update.make(read_scheduled_builds_domain(db), running_builds_domain) |
79186
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1367 |
|
79832
2a3c0a68221c
misc tuning: prefer Build_Process.Update operations;
wenzelm
parents:
79829
diff
changeset
|
1368 |
remove_schedules(db, update.delete) |
79186
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1369 |
} |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1370 |
} |
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1371 |
|
a22440b9cb70
use build database to synchronize build schedule computed on master node (e.g., such that view on cluster is consistent);
Fabian Huch <huch@in.tum.de>
parents:
79185
diff
changeset
|
1372 |
|
79640
7a2b86a48be0
prefer static object, while class is required for "services";
wenzelm
parents:
79639
diff
changeset
|
1373 |
class Build_Engine extends Build.Engine("build_schedule") { |
79699
b88d73810b50
recover "build_database_server" from 1fa1b32b0379: still required, e.g. in build_benchmark;
wenzelm
parents:
79655
diff
changeset
|
1374 |
override def build_options(options: Options, build_cluster: Boolean = false): Options = { |
b88d73810b50
recover "build_database_server" from 1fa1b32b0379: still required, e.g. in build_benchmark;
wenzelm
parents:
79655
diff
changeset
|
1375 |
val options1 = super.build_options(options, build_cluster = build_cluster) |
b88d73810b50
recover "build_database_server" from 1fa1b32b0379: still required, e.g. in build_benchmark;
wenzelm
parents:
79655
diff
changeset
|
1376 |
if (build_cluster) options1 + "build_database_server" else options1 |
b88d73810b50
recover "build_database_server" from 1fa1b32b0379: still required, e.g. in build_benchmark;
wenzelm
parents:
79655
diff
changeset
|
1377 |
} |
b88d73810b50
recover "build_database_server" from 1fa1b32b0379: still required, e.g. in build_benchmark;
wenzelm
parents:
79655
diff
changeset
|
1378 |
|
79108 | 1379 |
def scheduler(timing_data: Timing_Data, context: Build.Context): Scheduler = { |
1380 |
val sessions_structure = context.sessions_structure |
|
79110
ff68cbfa3550
clarified path time heuristic: configurable parameters for larger search space;
Fabian Huch <huch@in.tum.de>
parents:
79109
diff
changeset
|
1381 |
|
ff68cbfa3550
clarified path time heuristic: configurable parameters for larger search space;
Fabian Huch <huch@in.tum.de>
parents:
79109
diff
changeset
|
1382 |
val is_criticals = |
ff68cbfa3550
clarified path time heuristic: configurable parameters for larger search space;
Fabian Huch <huch@in.tum.de>
parents:
79109
diff
changeset
|
1383 |
List( |
ff68cbfa3550
clarified path time heuristic: configurable parameters for larger search space;
Fabian Huch <huch@in.tum.de>
parents:
79109
diff
changeset
|
1384 |
Path_Time_Heuristic.Absolute_Time(Time.minutes(5)), |
ff68cbfa3550
clarified path time heuristic: configurable parameters for larger search space;
Fabian Huch <huch@in.tum.de>
parents:
79109
diff
changeset
|
1385 |
Path_Time_Heuristic.Absolute_Time(Time.minutes(10)), |
ff68cbfa3550
clarified path time heuristic: configurable parameters for larger search space;
Fabian Huch <huch@in.tum.de>
parents:
79109
diff
changeset
|
1386 |
Path_Time_Heuristic.Absolute_Time(Time.minutes(20)), |
ff68cbfa3550
clarified path time heuristic: configurable parameters for larger search space;
Fabian Huch <huch@in.tum.de>
parents:
79109
diff
changeset
|
1387 |
Path_Time_Heuristic.Relative_Time(0.5)) |
ff68cbfa3550
clarified path time heuristic: configurable parameters for larger search space;
Fabian Huch <huch@in.tum.de>
parents:
79109
diff
changeset
|
1388 |
val parallel_threads = |
ff68cbfa3550
clarified path time heuristic: configurable parameters for larger search space;
Fabian Huch <huch@in.tum.de>
parents:
79109
diff
changeset
|
1389 |
List( |
ff68cbfa3550
clarified path time heuristic: configurable parameters for larger search space;
Fabian Huch <huch@in.tum.de>
parents:
79109
diff
changeset
|
1390 |
Path_Time_Heuristic.Fixed_Thread(1), |
ff68cbfa3550
clarified path time heuristic: configurable parameters for larger search space;
Fabian Huch <huch@in.tum.de>
parents:
79109
diff
changeset
|
1391 |
Path_Time_Heuristic.Time_Based_Threads({ |
ff68cbfa3550
clarified path time heuristic: configurable parameters for larger search space;
Fabian Huch <huch@in.tum.de>
parents:
79109
diff
changeset
|
1392 |
case time if time < Time.minutes(1) => 1 |
ff68cbfa3550
clarified path time heuristic: configurable parameters for larger search space;
Fabian Huch <huch@in.tum.de>
parents:
79109
diff
changeset
|
1393 |
case time if time < Time.minutes(5) => 4 |
ff68cbfa3550
clarified path time heuristic: configurable parameters for larger search space;
Fabian Huch <huch@in.tum.de>
parents:
79109
diff
changeset
|
1394 |
case _ => 8 |
ff68cbfa3550
clarified path time heuristic: configurable parameters for larger search space;
Fabian Huch <huch@in.tum.de>
parents:
79109
diff
changeset
|
1395 |
})) |
79180
229f49204603
clarified build heuristics parameters;
Fabian Huch <huch@in.tum.de>
parents:
79179
diff
changeset
|
1396 |
val machine_splits = |
229f49204603
clarified build heuristics parameters;
Fabian Huch <huch@in.tum.de>
parents:
79179
diff
changeset
|
1397 |
List( |
229f49204603
clarified build heuristics parameters;
Fabian Huch <huch@in.tum.de>
parents:
79179
diff
changeset
|
1398 |
Path_Time_Heuristic.Critical_Nodes, |
229f49204603
clarified build heuristics parameters;
Fabian Huch <huch@in.tum.de>
parents:
79179
diff
changeset
|
1399 |
Path_Time_Heuristic.Fixed_Fraction(0.3), |
229f49204603
clarified build heuristics parameters;
Fabian Huch <huch@in.tum.de>
parents:
79179
diff
changeset
|
1400 |
Path_Time_Heuristic.Host_Speed(0.9)) |
79110
ff68cbfa3550
clarified path time heuristic: configurable parameters for larger search space;
Fabian Huch <huch@in.tum.de>
parents:
79109
diff
changeset
|
1401 |
|
ff68cbfa3550
clarified path time heuristic: configurable parameters for larger search space;
Fabian Huch <huch@in.tum.de>
parents:
79109
diff
changeset
|
1402 |
val path_time_heuristics = |
ff68cbfa3550
clarified path time heuristic: configurable parameters for larger search space;
Fabian Huch <huch@in.tum.de>
parents:
79109
diff
changeset
|
1403 |
for { |
ff68cbfa3550
clarified path time heuristic: configurable parameters for larger search space;
Fabian Huch <huch@in.tum.de>
parents:
79109
diff
changeset
|
1404 |
is_critical <- is_criticals |
ff68cbfa3550
clarified path time heuristic: configurable parameters for larger search space;
Fabian Huch <huch@in.tum.de>
parents:
79109
diff
changeset
|
1405 |
parallel <- parallel_threads |
79180
229f49204603
clarified build heuristics parameters;
Fabian Huch <huch@in.tum.de>
parents:
79179
diff
changeset
|
1406 |
machine_split <- machine_splits |
229f49204603
clarified build heuristics parameters;
Fabian Huch <huch@in.tum.de>
parents:
79179
diff
changeset
|
1407 |
} yield |
79592
7db599be70cc
clarified scheduler: proper split into scheduler, generator, and priority rules (following 32d00ec387f4);
Fabian Huch <huch@in.tum.de>
parents:
79534
diff
changeset
|
1408 |
Path_Time_Heuristic(is_critical, parallel, machine_split, timing_data, sessions_structure) |
79926
dc4a387a6f02
clarified host: pre-load max threads;
Fabian Huch <huch@in.tum.de>
parents:
79925
diff
changeset
|
1409 |
val default_heuristic = Default_Heuristic(timing_data.host_infos) |
79592
7db599be70cc
clarified scheduler: proper split into scheduler, generator, and priority rules (following 32d00ec387f4);
Fabian Huch <huch@in.tum.de>
parents:
79534
diff
changeset
|
1410 |
val heuristics = default_heuristic :: path_time_heuristics |
79928
cdc87eed26c7
allow specifying initial schedule;
Fabian Huch <huch@in.tum.de>
parents:
79927
diff
changeset
|
1411 |
|
cdc87eed26c7
allow specifying initial schedule;
Fabian Huch <huch@in.tum.de>
parents:
79927
diff
changeset
|
1412 |
val initial_schedule_file = context.build_options.string("build_schedule_initial") |
cdc87eed26c7
allow specifying initial schedule;
Fabian Huch <huch@in.tum.de>
parents:
79927
diff
changeset
|
1413 |
val initial = |
cdc87eed26c7
allow specifying initial schedule;
Fabian Huch <huch@in.tum.de>
parents:
79927
diff
changeset
|
1414 |
proper_string(initial_schedule_file).toList.map(initial_schedule_file => |
cdc87eed26c7
allow specifying initial schedule;
Fabian Huch <huch@in.tum.de>
parents:
79927
diff
changeset
|
1415 |
Schedule.read(Path.explode(initial_schedule_file)).copy(build_uuid = context.build_uuid)) |
cdc87eed26c7
allow specifying initial schedule;
Fabian Huch <huch@in.tum.de>
parents:
79927
diff
changeset
|
1416 |
|
cdc87eed26c7
allow specifying initial schedule;
Fabian Huch <huch@in.tum.de>
parents:
79927
diff
changeset
|
1417 |
Optimizer(heuristics.map(Generation_Scheme(_, timing_data, context.build_uuid)), initial) |
79089 | 1418 |
} |
1419 |
||
78845
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
1420 |
override def open_build_process( |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
1421 |
context: Build.Context, |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
1422 |
progress: Progress, |
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
1423 |
server: SSH.Server |
78928
6c2c60b852e0
move timing data into scheduler for more efficient heuristics (e.g., with pre-calculated values);
Fabian Huch <huch@in.tum.de>
parents:
78888
diff
changeset
|
1424 |
): Build_Process = |
79290
9deadc9d8872
separate build processes for scheduler and scheduled;
Fabian Huch <huch@in.tum.de>
parents:
79289
diff
changeset
|
1425 |
if (!context.master) new Scheduled_Build_Process(context, progress, server) |
79915
40d2f9ce29fc
allow read/write of schedule in build (read via option, write from tool);
Fabian Huch <huch@in.tum.de>
parents:
79914
diff
changeset
|
1426 |
else { |
40d2f9ce29fc
allow read/write of schedule in build (read via option, write from tool);
Fabian Huch <huch@in.tum.de>
parents:
79914
diff
changeset
|
1427 |
val schedule_file = context.build_options.string("build_schedule") |
40d2f9ce29fc
allow read/write of schedule in build (read via option, write from tool);
Fabian Huch <huch@in.tum.de>
parents:
79914
diff
changeset
|
1428 |
if (schedule_file.isEmpty) { |
40d2f9ce29fc
allow read/write of schedule in build (read via option, write from tool);
Fabian Huch <huch@in.tum.de>
parents:
79914
diff
changeset
|
1429 |
new Scheduler_Build_Process(context, progress, server) { |
40d2f9ce29fc
allow read/write of schedule in build (read via option, write from tool);
Fabian Huch <huch@in.tum.de>
parents:
79914
diff
changeset
|
1430 |
def init_scheduler(timing_data: Timing_Data): Scheduler = |
40d2f9ce29fc
allow read/write of schedule in build (read via option, write from tool);
Fabian Huch <huch@in.tum.de>
parents:
79914
diff
changeset
|
1431 |
scheduler(timing_data, context) |
40d2f9ce29fc
allow read/write of schedule in build (read via option, write from tool);
Fabian Huch <huch@in.tum.de>
parents:
79914
diff
changeset
|
1432 |
} |
40d2f9ce29fc
allow read/write of schedule in build (read via option, write from tool);
Fabian Huch <huch@in.tum.de>
parents:
79914
diff
changeset
|
1433 |
} |
40d2f9ce29fc
allow read/write of schedule in build (read via option, write from tool);
Fabian Huch <huch@in.tum.de>
parents:
79914
diff
changeset
|
1434 |
else { |
40d2f9ce29fc
allow read/write of schedule in build (read via option, write from tool);
Fabian Huch <huch@in.tum.de>
parents:
79914
diff
changeset
|
1435 |
val finished_schedule = |
40d2f9ce29fc
allow read/write of schedule in build (read via option, write from tool);
Fabian Huch <huch@in.tum.de>
parents:
79914
diff
changeset
|
1436 |
Schedule.read(Path.explode(schedule_file)).copy(build_uuid = context.build_uuid) |
40d2f9ce29fc
allow read/write of schedule in build (read via option, write from tool);
Fabian Huch <huch@in.tum.de>
parents:
79914
diff
changeset
|
1437 |
new Scheduler_Build_Process(context, progress, server) { |
40d2f9ce29fc
allow read/write of schedule in build (read via option, write from tool);
Fabian Huch <huch@in.tum.de>
parents:
79914
diff
changeset
|
1438 |
def init_scheduler(timing_data: Timing_Data): Scheduler = |
40d2f9ce29fc
allow read/write of schedule in build (read via option, write from tool);
Fabian Huch <huch@in.tum.de>
parents:
79914
diff
changeset
|
1439 |
(build_state: Build_Process.State) => finished_schedule |
40d2f9ce29fc
allow read/write of schedule in build (read via option, write from tool);
Fabian Huch <huch@in.tum.de>
parents:
79914
diff
changeset
|
1440 |
} |
40d2f9ce29fc
allow read/write of schedule in build (read via option, write from tool);
Fabian Huch <huch@in.tum.de>
parents:
79914
diff
changeset
|
1441 |
} |
78928
6c2c60b852e0
move timing data into scheduler for more efficient heuristics (e.g., with pre-calculated values);
Fabian Huch <huch@in.tum.de>
parents:
78888
diff
changeset
|
1442 |
} |
78845
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
1443 |
} |
79640
7a2b86a48be0
prefer static object, while class is required for "services";
wenzelm
parents:
79639
diff
changeset
|
1444 |
object Build_Engine extends Build_Engine |
79091
06f380099b2e
added method to generate build schedules directly;
Fabian Huch <huch@in.tum.de>
parents:
79090
diff
changeset
|
1445 |
|
06f380099b2e
added method to generate build schedules directly;
Fabian Huch <huch@in.tum.de>
parents:
79090
diff
changeset
|
1446 |
|
06f380099b2e
added method to generate build schedules directly;
Fabian Huch <huch@in.tum.de>
parents:
79090
diff
changeset
|
1447 |
/* build schedule */ |
06f380099b2e
added method to generate build schedules directly;
Fabian Huch <huch@in.tum.de>
parents:
79090
diff
changeset
|
1448 |
|
06f380099b2e
added method to generate build schedules directly;
Fabian Huch <huch@in.tum.de>
parents:
79090
diff
changeset
|
1449 |
def build_schedule( |
06f380099b2e
added method to generate build schedules directly;
Fabian Huch <huch@in.tum.de>
parents:
79090
diff
changeset
|
1450 |
options: Options, |
06f380099b2e
added method to generate build schedules directly;
Fabian Huch <huch@in.tum.de>
parents:
79090
diff
changeset
|
1451 |
build_hosts: List[Build_Cluster.Host] = Nil, |
06f380099b2e
added method to generate build schedules directly;
Fabian Huch <huch@in.tum.de>
parents:
79090
diff
changeset
|
1452 |
selection: Sessions.Selection = Sessions.Selection.empty, |
06f380099b2e
added method to generate build schedules directly;
Fabian Huch <huch@in.tum.de>
parents:
79090
diff
changeset
|
1453 |
progress: Progress = new Progress, |
06f380099b2e
added method to generate build schedules directly;
Fabian Huch <huch@in.tum.de>
parents:
79090
diff
changeset
|
1454 |
afp_root: Option[Path] = None, |
06f380099b2e
added method to generate build schedules directly;
Fabian Huch <huch@in.tum.de>
parents:
79090
diff
changeset
|
1455 |
dirs: List[Path] = Nil, |
06f380099b2e
added method to generate build schedules directly;
Fabian Huch <huch@in.tum.de>
parents:
79090
diff
changeset
|
1456 |
select_dirs: List[Path] = Nil, |
06f380099b2e
added method to generate build schedules directly;
Fabian Huch <huch@in.tum.de>
parents:
79090
diff
changeset
|
1457 |
infos: List[Sessions.Info] = Nil, |
06f380099b2e
added method to generate build schedules directly;
Fabian Huch <huch@in.tum.de>
parents:
79090
diff
changeset
|
1458 |
numa_shuffling: Boolean = false, |
06f380099b2e
added method to generate build schedules directly;
Fabian Huch <huch@in.tum.de>
parents:
79090
diff
changeset
|
1459 |
augment_options: String => List[Options.Spec] = _ => Nil, |
06f380099b2e
added method to generate build schedules directly;
Fabian Huch <huch@in.tum.de>
parents:
79090
diff
changeset
|
1460 |
session_setup: (String, Session) => Unit = (_, _) => (), |
06f380099b2e
added method to generate build schedules directly;
Fabian Huch <huch@in.tum.de>
parents:
79090
diff
changeset
|
1461 |
cache: Term.Cache = Term.Cache.make() |
06f380099b2e
added method to generate build schedules directly;
Fabian Huch <huch@in.tum.de>
parents:
79090
diff
changeset
|
1462 |
): Schedule = { |
79908
c50c15bd304b
remove old build before generating schedule;
Fabian Huch <huch@in.tum.de>
parents:
79907
diff
changeset
|
1463 |
Build.build_process(options, build_cluster = true, remove_builds = true) |
c50c15bd304b
remove old build before generating schedule;
Fabian Huch <huch@in.tum.de>
parents:
79907
diff
changeset
|
1464 |
|
79614 | 1465 |
val store = |
79640
7a2b86a48be0
prefer static object, while class is required for "services";
wenzelm
parents:
79639
diff
changeset
|
1466 |
Build_Engine.build_store(options, build_cluster = build_hosts.nonEmpty, cache = cache) |
79091
06f380099b2e
added method to generate build schedules directly;
Fabian Huch <huch@in.tum.de>
parents:
79090
diff
changeset
|
1467 |
val log_store = Build_Log.store(options, cache = cache) |
06f380099b2e
added method to generate build schedules directly;
Fabian Huch <huch@in.tum.de>
parents:
79090
diff
changeset
|
1468 |
val build_options = store.options |
06f380099b2e
added method to generate build schedules directly;
Fabian Huch <huch@in.tum.de>
parents:
79090
diff
changeset
|
1469 |
|
79648 | 1470 |
def main( |
79091
06f380099b2e
added method to generate build schedules directly;
Fabian Huch <huch@in.tum.de>
parents:
79090
diff
changeset
|
1471 |
server: SSH.Server, |
06f380099b2e
added method to generate build schedules directly;
Fabian Huch <huch@in.tum.de>
parents:
79090
diff
changeset
|
1472 |
database_server: Option[SQL.Database], |
06f380099b2e
added method to generate build schedules directly;
Fabian Huch <huch@in.tum.de>
parents:
79090
diff
changeset
|
1473 |
log_database: PostgreSQL.Database, |
06f380099b2e
added method to generate build schedules directly;
Fabian Huch <huch@in.tum.de>
parents:
79090
diff
changeset
|
1474 |
host_database: SQL.Database |
06f380099b2e
added method to generate build schedules directly;
Fabian Huch <huch@in.tum.de>
parents:
79090
diff
changeset
|
1475 |
): Schedule = { |
06f380099b2e
added method to generate build schedules directly;
Fabian Huch <huch@in.tum.de>
parents:
79090
diff
changeset
|
1476 |
val full_sessions = |
80056 | 1477 |
Sessions.load_structure(build_options, dirs = AFP.main_dirs(afp_root) ::: dirs, |
79091
06f380099b2e
added method to generate build schedules directly;
Fabian Huch <huch@in.tum.de>
parents:
79090
diff
changeset
|
1478 |
select_dirs = select_dirs, infos = infos, augment_options = augment_options) |
06f380099b2e
added method to generate build schedules directly;
Fabian Huch <huch@in.tum.de>
parents:
79090
diff
changeset
|
1479 |
|
06f380099b2e
added method to generate build schedules directly;
Fabian Huch <huch@in.tum.de>
parents:
79090
diff
changeset
|
1480 |
val build_deps = |
06f380099b2e
added method to generate build schedules directly;
Fabian Huch <huch@in.tum.de>
parents:
79090
diff
changeset
|
1481 |
Sessions.deps(full_sessions.selection(selection), progress = progress, |
06f380099b2e
added method to generate build schedules directly;
Fabian Huch <huch@in.tum.de>
parents:
79090
diff
changeset
|
1482 |
inlined_files = true).check_errors |
06f380099b2e
added method to generate build schedules directly;
Fabian Huch <huch@in.tum.de>
parents:
79090
diff
changeset
|
1483 |
|
06f380099b2e
added method to generate build schedules directly;
Fabian Huch <huch@in.tum.de>
parents:
79090
diff
changeset
|
1484 |
val build_context = |
79640
7a2b86a48be0
prefer static object, while class is required for "services";
wenzelm
parents:
79639
diff
changeset
|
1485 |
Build.Context(store, build_deps, engine = Build_Engine, afp_root = afp_root, |
79091
06f380099b2e
added method to generate build schedules directly;
Fabian Huch <huch@in.tum.de>
parents:
79090
diff
changeset
|
1486 |
build_hosts = build_hosts, hostname = Build.hostname(build_options), |
79644 | 1487 |
numa_shuffling = numa_shuffling, session_setup = session_setup, master = true) |
79091
06f380099b2e
added method to generate build schedules directly;
Fabian Huch <huch@in.tum.de>
parents:
79090
diff
changeset
|
1488 |
|
06f380099b2e
added method to generate build schedules directly;
Fabian Huch <huch@in.tum.de>
parents:
79090
diff
changeset
|
1489 |
val cluster_hosts = build_context.build_hosts |
06f380099b2e
added method to generate build schedules directly;
Fabian Huch <huch@in.tum.de>
parents:
79090
diff
changeset
|
1490 |
|
06f380099b2e
added method to generate build schedules directly;
Fabian Huch <huch@in.tum.de>
parents:
79090
diff
changeset
|
1491 |
val hosts_current = |
06f380099b2e
added method to generate build schedules directly;
Fabian Huch <huch@in.tum.de>
parents:
79090
diff
changeset
|
1492 |
cluster_hosts.forall(host => isabelle.Host.read_info(host_database, host.name).isDefined) |
06f380099b2e
added method to generate build schedules directly;
Fabian Huch <huch@in.tum.de>
parents:
79090
diff
changeset
|
1493 |
if (!hosts_current) { |
79628 | 1494 |
using(Build_Cluster.make(build_context, progress = progress).open())(_.init().benchmark()) |
79091
06f380099b2e
added method to generate build schedules directly;
Fabian Huch <huch@in.tum.de>
parents:
79090
diff
changeset
|
1495 |
} |
06f380099b2e
added method to generate build schedules directly;
Fabian Huch <huch@in.tum.de>
parents:
79090
diff
changeset
|
1496 |
|
79926
dc4a387a6f02
clarified host: pre-load max threads;
Fabian Huch <huch@in.tum.de>
parents:
79925
diff
changeset
|
1497 |
val host_infos = Host_Infos.load(build_options, cluster_hosts, host_database) |
79877
9aef1d1535ff
use timeout as default build time predictor if no data is available;
Fabian Huch <huch@in.tum.de>
parents:
79871
diff
changeset
|
1498 |
val timing_data = Timing_Data.load(host_infos, log_database, full_sessions) |
79091
06f380099b2e
added method to generate build schedules directly;
Fabian Huch <huch@in.tum.de>
parents:
79090
diff
changeset
|
1499 |
|
06f380099b2e
added method to generate build schedules directly;
Fabian Huch <huch@in.tum.de>
parents:
79090
diff
changeset
|
1500 |
val sessions = Build_Process.Sessions.empty.init(build_context, database_server, progress) |
06f380099b2e
added method to generate build schedules directly;
Fabian Huch <huch@in.tum.de>
parents:
79090
diff
changeset
|
1501 |
|
06f380099b2e
added method to generate build schedules directly;
Fabian Huch <huch@in.tum.de>
parents:
79090
diff
changeset
|
1502 |
val build_state = |
79828
5969ead9f900
clarified data representation: more uniform treatment of State.Pending vs. State.Running;
wenzelm
parents:
79819
diff
changeset
|
1503 |
Build_Process.State(sessions = sessions, |
79829 | 1504 |
pending = Map.from(sessions.iterator.map(Build_Process.Task.entry(_, build_context)))) |
79091
06f380099b2e
added method to generate build schedules directly;
Fabian Huch <huch@in.tum.de>
parents:
79090
diff
changeset
|
1505 |
|
79640
7a2b86a48be0
prefer static object, while class is required for "services";
wenzelm
parents:
79639
diff
changeset
|
1506 |
val scheduler = Build_Engine.scheduler(timing_data, build_context) |
79105 | 1507 |
def schedule_msg(res: Exn.Result[Schedule]): String = |
1508 |
res match { case Exn.Res(schedule) => schedule.message case _ => "" } |
|
1509 |
||
79594 | 1510 |
progress.echo("Building schedule...") |
79592
7db599be70cc
clarified scheduler: proper split into scheduler, generator, and priority rules (following 32d00ec387f4);
Fabian Huch <huch@in.tum.de>
parents:
79534
diff
changeset
|
1511 |
Timing.timeit(scheduler.schedule(build_state), schedule_msg, output = progress.echo(_)) |
79091
06f380099b2e
added method to generate build schedules directly;
Fabian Huch <huch@in.tum.de>
parents:
79090
diff
changeset
|
1512 |
} |
06f380099b2e
added method to generate build schedules directly;
Fabian Huch <huch@in.tum.de>
parents:
79090
diff
changeset
|
1513 |
|
06f380099b2e
added method to generate build schedules directly;
Fabian Huch <huch@in.tum.de>
parents:
79090
diff
changeset
|
1514 |
using(store.open_server()) { server => |
06f380099b2e
added method to generate build schedules directly;
Fabian Huch <huch@in.tum.de>
parents:
79090
diff
changeset
|
1515 |
using_optional(store.maybe_open_database_server(server = server)) { database_server => |
06f380099b2e
added method to generate build schedules directly;
Fabian Huch <huch@in.tum.de>
parents:
79090
diff
changeset
|
1516 |
using(log_store.open_database(server = server)) { log_database => |
06f380099b2e
added method to generate build schedules directly;
Fabian Huch <huch@in.tum.de>
parents:
79090
diff
changeset
|
1517 |
using(store.open_build_database( |
06f380099b2e
added method to generate build schedules directly;
Fabian Huch <huch@in.tum.de>
parents:
79090
diff
changeset
|
1518 |
path = isabelle.Host.private_data.database, server = server)) { host_database => |
79648 | 1519 |
main(server, database_server, log_database, host_database) |
79091
06f380099b2e
added method to generate build schedules directly;
Fabian Huch <huch@in.tum.de>
parents:
79090
diff
changeset
|
1520 |
} |
06f380099b2e
added method to generate build schedules directly;
Fabian Huch <huch@in.tum.de>
parents:
79090
diff
changeset
|
1521 |
} |
06f380099b2e
added method to generate build schedules directly;
Fabian Huch <huch@in.tum.de>
parents:
79090
diff
changeset
|
1522 |
} |
06f380099b2e
added method to generate build schedules directly;
Fabian Huch <huch@in.tum.de>
parents:
79090
diff
changeset
|
1523 |
} |
06f380099b2e
added method to generate build schedules directly;
Fabian Huch <huch@in.tum.de>
parents:
79090
diff
changeset
|
1524 |
} |
79181
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1525 |
|
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1526 |
def write_schedule_graphic(schedule: Schedule, output: Path): Unit = { |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1527 |
import java.awt.geom.{GeneralPath, Rectangle2D} |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1528 |
import java.awt.{BasicStroke, Color, Graphics2D} |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1529 |
|
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1530 |
val line_height = isabelle.graphview.Metrics.default.height |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1531 |
val char_width = isabelle.graphview.Metrics.default.char_width |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1532 |
val padding = isabelle.graphview.Metrics.default.space_width |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1533 |
val gap = isabelle.graphview.Metrics.default.gap |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1534 |
|
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1535 |
val graph = schedule.graph |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1536 |
|
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1537 |
def text_width(text: String): Double = text.length * char_width |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1538 |
|
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1539 |
val generator_height = line_height + padding |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1540 |
val hostname_height = generator_height + line_height + padding |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1541 |
def time_height(time: Time): Double = time.seconds |
79819 | 1542 |
def date_height(date: Date): Double = time_height(date - schedule.start) |
79181
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1543 |
|
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1544 |
val hosts = graph.iterator.map(_._2._1).toList.groupBy(_.node_info.hostname) |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1545 |
|
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1546 |
def node_width(node: Schedule.Node): Double = 2 * padding + text_width(node.job_name) |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1547 |
|
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1548 |
case class Range(start: Double, stop: Double) { |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1549 |
def proper: List[Range] = if (start < stop) List(this) else Nil |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1550 |
def width: Double = stop - start |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1551 |
} |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1552 |
|
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1553 |
val rel_node_ranges = |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1554 |
hosts.toList.flatMap { (hostname, nodes) => |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1555 |
val sorted = nodes.sortBy(node => (node.start.time.ms, node.end.time.ms, node.job_name)) |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1556 |
sorted.foldLeft((List.empty[Schedule.Node], Map.empty[Schedule.Node, Range])) { |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1557 |
case ((nodes, allocated), node) => |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1558 |
val width = node_width(node) + padding |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1559 |
val parallel = nodes.filter(_.end.time > node.start.time) |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1560 |
val (last, slots) = |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1561 |
parallel.sortBy(allocated(_).start).foldLeft((0D, List.empty[Range])) { |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1562 |
case ((start, ranges), node1) => |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1563 |
val node_range = allocated(node1) |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1564 |
(node_range.stop, ranges ::: Range(start, node_range.start).proper) |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1565 |
} |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1566 |
val start = |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1567 |
(Range(last, Double.MaxValue) :: slots.filter(_.width >= width)).minBy(_.width).start |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1568 |
(node :: parallel, allocated + (node -> Range(start, start + width))) |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1569 |
}._2 |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1570 |
}.toMap |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1571 |
|
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1572 |
def host_width(hostname: String) = |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1573 |
2 * padding + (hosts(hostname).map(rel_node_ranges(_).stop).max max text_width(hostname)) |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1574 |
|
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1575 |
def graph_height(graph: Graph[String, Schedule.Node]): Double = |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1576 |
date_height(graph.maximals.map(graph.get_node(_).end).maxBy(_.unix_epoch)) |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1577 |
|
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1578 |
val height = (hostname_height + 2 * padding + graph_height(graph)).ceil.toInt |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1579 |
val (last, host_starts) = |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1580 |
hosts.keys.foldLeft((0D, Map.empty[String, Double])) { |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1581 |
case ((previous, starts), hostname) => |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1582 |
(previous + gap + host_width(hostname), starts + (hostname -> previous)) |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1583 |
} |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1584 |
val width = (last - gap).ceil.toInt |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1585 |
|
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1586 |
def node_start(node: Schedule.Node): Double = |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1587 |
host_starts(node.node_info.hostname) + padding + rel_node_ranges(node).start |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1588 |
|
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1589 |
def paint(gfx: Graphics2D): Unit = { |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1590 |
gfx.setColor(Color.LIGHT_GRAY) |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1591 |
gfx.fillRect(0, 0, width, height) |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1592 |
gfx.setRenderingHints(isabelle.graphview.Metrics.rendering_hints) |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1593 |
gfx.setFont(isabelle.graphview.Metrics.default.font) |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1594 |
gfx.setStroke(new BasicStroke(1, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND)) |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1595 |
|
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1596 |
draw_string(schedule.generator + ", build time: " + schedule.duration.message_hms, padding, 0) |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1597 |
|
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1598 |
def draw_host(x: Double, hostname: String): Double = { |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1599 |
val nodes = hosts(hostname).map(_.job_name).toSet |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1600 |
val width = host_width(hostname) |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1601 |
val height = 2 * padding + graph_height(graph.restrict(nodes.contains)) |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1602 |
val padding1 = ((width - text_width(hostname)) / 2) max 0 |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1603 |
val rect = new Rectangle2D.Double(x, hostname_height, width, height) |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1604 |
gfx.setColor(Color.BLACK) |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1605 |
gfx.draw(rect) |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1606 |
gfx.setColor(Color.GRAY) |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1607 |
gfx.fill(rect) |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1608 |
draw_string(hostname, x + padding1, generator_height) |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1609 |
x + gap + width |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1610 |
} |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1611 |
|
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1612 |
def draw_string(str: String, x: Double, y: Double): Unit = { |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1613 |
gfx.setColor(Color.BLACK) |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1614 |
gfx.drawString(str, x.toInt, (y + line_height).toInt) |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1615 |
} |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1616 |
|
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1617 |
def node_rect(node: Schedule.Node): Rectangle2D.Double = { |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1618 |
val x = node_start(node) |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1619 |
val y = hostname_height + padding + date_height(node.start) |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1620 |
val width = node_width(node) |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1621 |
val height = time_height(node.duration) |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1622 |
new Rectangle2D.Double(x, y, width, height) |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1623 |
} |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1624 |
|
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1625 |
def draw_node(node: Schedule.Node): Rectangle2D.Double = { |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1626 |
val rect = node_rect(node) |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1627 |
gfx.setColor(Color.BLACK) |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1628 |
gfx.draw(rect) |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1629 |
gfx.setColor(Color.WHITE) |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1630 |
gfx.fill(rect) |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1631 |
|
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1632 |
def add_text(y: Double, text: String): Double = |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1633 |
if (line_height > rect.height - y || text_width(text) + 2 * padding > rect.width) y |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1634 |
else { |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1635 |
val padding1 = padding min ((rect.height - (y + line_height)) / 2) |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1636 |
draw_string(text, rect.x + padding, rect.y + y + padding1) |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1637 |
y + padding1 + line_height |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1638 |
} |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1639 |
|
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1640 |
val node_info = node.node_info |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1641 |
|
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1642 |
val duration_str = "(" + node.duration.message_hms + ")" |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1643 |
val node_str = |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1644 |
"on " + proper_string(node_info.toString.stripPrefix(node_info.hostname)).getOrElse("all") |
79819 | 1645 |
val start_str = "Start: " + (node.start - schedule.start).message_hms |
79181
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1646 |
|
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1647 |
List(node.job_name, duration_str, node_str, start_str).foldLeft(0D)(add_text) |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1648 |
|
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1649 |
rect |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1650 |
} |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1651 |
|
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1652 |
def draw_arrow(from: Schedule.Node, to: Rectangle2D.Double, curve: Double = 10): Unit = { |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1653 |
val from_rect = node_rect(from) |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1654 |
|
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1655 |
val path = new GeneralPath() |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1656 |
path.moveTo(from_rect.getCenterX, from_rect.getMaxY) |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1657 |
path.lineTo(to.getCenterX, to.getMinY) |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1658 |
|
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1659 |
gfx.setColor(Color.BLUE) |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1660 |
gfx.draw(path) |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1661 |
} |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1662 |
|
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1663 |
hosts.keys.foldLeft(0D)(draw_host) |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1664 |
|
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1665 |
graph.topological_order.foreach { job_name => |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1666 |
val node = graph.get_node(job_name) |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1667 |
val rect = draw_node(node) |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1668 |
|
79235
d9f0eb441d74
improve graphical clarity by omitting intra-host dependencies (following ee405c40db72);
Fabian Huch <huch@in.tum.de>
parents:
79194
diff
changeset
|
1669 |
for { |
d9f0eb441d74
improve graphical clarity by omitting intra-host dependencies (following ee405c40db72);
Fabian Huch <huch@in.tum.de>
parents:
79194
diff
changeset
|
1670 |
pred <- graph.imm_preds(job_name).iterator |
d9f0eb441d74
improve graphical clarity by omitting intra-host dependencies (following ee405c40db72);
Fabian Huch <huch@in.tum.de>
parents:
79194
diff
changeset
|
1671 |
pred_node = graph.get_node(pred) |
d9f0eb441d74
improve graphical clarity by omitting intra-host dependencies (following ee405c40db72);
Fabian Huch <huch@in.tum.de>
parents:
79194
diff
changeset
|
1672 |
if node.node_info.hostname != pred_node.node_info.hostname |
d9f0eb441d74
improve graphical clarity by omitting intra-host dependencies (following ee405c40db72);
Fabian Huch <huch@in.tum.de>
parents:
79194
diff
changeset
|
1673 |
} draw_arrow(pred_node, rect) |
79181
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1674 |
} |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1675 |
} |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1676 |
|
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1677 |
val name = output.file_name |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1678 |
if (File.is_png(name)) Graphics_File.write_png(output.file, paint, width, height) |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1679 |
else if (File.is_pdf(name)) Graphics_File.write_pdf(output.file, paint, width, height) |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1680 |
else error("Bad type of file: " + quote(name) + " (.png or .pdf expected)") |
9d6d559c9fde
added graphical representation of build schedules;
Fabian Huch <huch@in.tum.de>
parents:
79180
diff
changeset
|
1681 |
} |
79182
6202d0ff36b4
added build schedule command-line wrapper;
Fabian Huch <huch@in.tum.de>
parents:
79181
diff
changeset
|
1682 |
|
6202d0ff36b4
added build schedule command-line wrapper;
Fabian Huch <huch@in.tum.de>
parents:
79181
diff
changeset
|
1683 |
|
79629 | 1684 |
/* Isabelle tool wrapper */ |
79182
6202d0ff36b4
added build schedule command-line wrapper;
Fabian Huch <huch@in.tum.de>
parents:
79181
diff
changeset
|
1685 |
|
6202d0ff36b4
added build schedule command-line wrapper;
Fabian Huch <huch@in.tum.de>
parents:
79181
diff
changeset
|
1686 |
val isabelle_tool = Isabelle_Tool("build_schedule", "generate build schedule", Scala_Project.here, |
6202d0ff36b4
added build schedule command-line wrapper;
Fabian Huch <huch@in.tum.de>
parents:
79181
diff
changeset
|
1687 |
{ args => |
6202d0ff36b4
added build schedule command-line wrapper;
Fabian Huch <huch@in.tum.de>
parents:
79181
diff
changeset
|
1688 |
var afp_root: Option[Path] = None |
6202d0ff36b4
added build schedule command-line wrapper;
Fabian Huch <huch@in.tum.de>
parents:
79181
diff
changeset
|
1689 |
val base_sessions = new mutable.ListBuffer[String] |
6202d0ff36b4
added build schedule command-line wrapper;
Fabian Huch <huch@in.tum.de>
parents:
79181
diff
changeset
|
1690 |
val select_dirs = new mutable.ListBuffer[Path] |
6202d0ff36b4
added build schedule command-line wrapper;
Fabian Huch <huch@in.tum.de>
parents:
79181
diff
changeset
|
1691 |
val build_hosts = new mutable.ListBuffer[Build_Cluster.Host] |
6202d0ff36b4
added build schedule command-line wrapper;
Fabian Huch <huch@in.tum.de>
parents:
79181
diff
changeset
|
1692 |
var numa_shuffling = false |
6202d0ff36b4
added build schedule command-line wrapper;
Fabian Huch <huch@in.tum.de>
parents:
79181
diff
changeset
|
1693 |
var output_file: Option[Path] = None |
6202d0ff36b4
added build schedule command-line wrapper;
Fabian Huch <huch@in.tum.de>
parents:
79181
diff
changeset
|
1694 |
var requirements = false |
6202d0ff36b4
added build schedule command-line wrapper;
Fabian Huch <huch@in.tum.de>
parents:
79181
diff
changeset
|
1695 |
val exclude_session_groups = new mutable.ListBuffer[String] |
6202d0ff36b4
added build schedule command-line wrapper;
Fabian Huch <huch@in.tum.de>
parents:
79181
diff
changeset
|
1696 |
var all_sessions = false |
6202d0ff36b4
added build schedule command-line wrapper;
Fabian Huch <huch@in.tum.de>
parents:
79181
diff
changeset
|
1697 |
val dirs = new mutable.ListBuffer[Path] |
6202d0ff36b4
added build schedule command-line wrapper;
Fabian Huch <huch@in.tum.de>
parents:
79181
diff
changeset
|
1698 |
val session_groups = new mutable.ListBuffer[String] |
6202d0ff36b4
added build schedule command-line wrapper;
Fabian Huch <huch@in.tum.de>
parents:
79181
diff
changeset
|
1699 |
var options = Options.init(specs = Options.Spec.ISABELLE_BUILD_OPTIONS) |
6202d0ff36b4
added build schedule command-line wrapper;
Fabian Huch <huch@in.tum.de>
parents:
79181
diff
changeset
|
1700 |
var verbose = false |
6202d0ff36b4
added build schedule command-line wrapper;
Fabian Huch <huch@in.tum.de>
parents:
79181
diff
changeset
|
1701 |
val exclude_sessions = new mutable.ListBuffer[String] |
6202d0ff36b4
added build schedule command-line wrapper;
Fabian Huch <huch@in.tum.de>
parents:
79181
diff
changeset
|
1702 |
|
6202d0ff36b4
added build schedule command-line wrapper;
Fabian Huch <huch@in.tum.de>
parents:
79181
diff
changeset
|
1703 |
val getopts = Getopts(""" |
6202d0ff36b4
added build schedule command-line wrapper;
Fabian Huch <huch@in.tum.de>
parents:
79181
diff
changeset
|
1704 |
Usage: isabelle build_schedule [OPTIONS] [SESSIONS ...] |
6202d0ff36b4
added build schedule command-line wrapper;
Fabian Huch <huch@in.tum.de>
parents:
79181
diff
changeset
|
1705 |
|
6202d0ff36b4
added build schedule command-line wrapper;
Fabian Huch <huch@in.tum.de>
parents:
79181
diff
changeset
|
1706 |
Options are: |
6202d0ff36b4
added build schedule command-line wrapper;
Fabian Huch <huch@in.tum.de>
parents:
79181
diff
changeset
|
1707 |
-A ROOT include AFP with given root directory (":" for """ + AFP.BASE.implode + """) |
6202d0ff36b4
added build schedule command-line wrapper;
Fabian Huch <huch@in.tum.de>
parents:
79181
diff
changeset
|
1708 |
-B NAME include session NAME and all descendants |
6202d0ff36b4
added build schedule command-line wrapper;
Fabian Huch <huch@in.tum.de>
parents:
79181
diff
changeset
|
1709 |
-D DIR include session directory and select its sessions |
79615 | 1710 |
-H HOSTS additional cluster host specifications of the form |
1711 |
NAMES:PARAMETERS (separated by commas) |
|
79182
6202d0ff36b4
added build schedule command-line wrapper;
Fabian Huch <huch@in.tum.de>
parents:
79181
diff
changeset
|
1712 |
-N cyclic shuffling of NUMA CPU nodes (performance tuning) |
79915
40d2f9ce29fc
allow read/write of schedule in build (read via option, write from tool);
Fabian Huch <huch@in.tum.de>
parents:
79914
diff
changeset
|
1713 |
-O FILE output file (pdf or png for image, else yxml) |
79182
6202d0ff36b4
added build schedule command-line wrapper;
Fabian Huch <huch@in.tum.de>
parents:
79181
diff
changeset
|
1714 |
-R refer to requirements of selected sessions |
6202d0ff36b4
added build schedule command-line wrapper;
Fabian Huch <huch@in.tum.de>
parents:
79181
diff
changeset
|
1715 |
-X NAME exclude sessions from group NAME and all descendants |
6202d0ff36b4
added build schedule command-line wrapper;
Fabian Huch <huch@in.tum.de>
parents:
79181
diff
changeset
|
1716 |
-a select all sessions |
6202d0ff36b4
added build schedule command-line wrapper;
Fabian Huch <huch@in.tum.de>
parents:
79181
diff
changeset
|
1717 |
-d DIR include session directory |
6202d0ff36b4
added build schedule command-line wrapper;
Fabian Huch <huch@in.tum.de>
parents:
79181
diff
changeset
|
1718 |
-g NAME select session group NAME |
6202d0ff36b4
added build schedule command-line wrapper;
Fabian Huch <huch@in.tum.de>
parents:
79181
diff
changeset
|
1719 |
-o OPTION override Isabelle system OPTION (via NAME=VAL or NAME) |
6202d0ff36b4
added build schedule command-line wrapper;
Fabian Huch <huch@in.tum.de>
parents:
79181
diff
changeset
|
1720 |
-v verbose |
6202d0ff36b4
added build schedule command-line wrapper;
Fabian Huch <huch@in.tum.de>
parents:
79181
diff
changeset
|
1721 |
-x NAME exclude session NAME and all descendants |
6202d0ff36b4
added build schedule command-line wrapper;
Fabian Huch <huch@in.tum.de>
parents:
79181
diff
changeset
|
1722 |
|
79909 | 1723 |
Generate build schedule, but do not run actual build. |
79182
6202d0ff36b4
added build schedule command-line wrapper;
Fabian Huch <huch@in.tum.de>
parents:
79181
diff
changeset
|
1724 |
""", |
6202d0ff36b4
added build schedule command-line wrapper;
Fabian Huch <huch@in.tum.de>
parents:
79181
diff
changeset
|
1725 |
"A:" -> (arg => afp_root = Some(if (arg == ":") AFP.BASE else Path.explode(arg))), |
6202d0ff36b4
added build schedule command-line wrapper;
Fabian Huch <huch@in.tum.de>
parents:
79181
diff
changeset
|
1726 |
"B:" -> (arg => base_sessions += arg), |
6202d0ff36b4
added build schedule command-line wrapper;
Fabian Huch <huch@in.tum.de>
parents:
79181
diff
changeset
|
1727 |
"D:" -> (arg => select_dirs += Path.explode(arg)), |
6202d0ff36b4
added build schedule command-line wrapper;
Fabian Huch <huch@in.tum.de>
parents:
79181
diff
changeset
|
1728 |
"H:" -> (arg => build_hosts ++= Build_Cluster.Host.parse(Registry.global, arg)), |
6202d0ff36b4
added build schedule command-line wrapper;
Fabian Huch <huch@in.tum.de>
parents:
79181
diff
changeset
|
1729 |
"N" -> (_ => numa_shuffling = true), |
6202d0ff36b4
added build schedule command-line wrapper;
Fabian Huch <huch@in.tum.de>
parents:
79181
diff
changeset
|
1730 |
"O:" -> (arg => output_file = Some(Path.explode(arg))), |
6202d0ff36b4
added build schedule command-line wrapper;
Fabian Huch <huch@in.tum.de>
parents:
79181
diff
changeset
|
1731 |
"R" -> (_ => requirements = true), |
6202d0ff36b4
added build schedule command-line wrapper;
Fabian Huch <huch@in.tum.de>
parents:
79181
diff
changeset
|
1732 |
"X:" -> (arg => exclude_session_groups += arg), |
6202d0ff36b4
added build schedule command-line wrapper;
Fabian Huch <huch@in.tum.de>
parents:
79181
diff
changeset
|
1733 |
"a" -> (_ => all_sessions = true), |
6202d0ff36b4
added build schedule command-line wrapper;
Fabian Huch <huch@in.tum.de>
parents:
79181
diff
changeset
|
1734 |
"d:" -> (arg => dirs += Path.explode(arg)), |
6202d0ff36b4
added build schedule command-line wrapper;
Fabian Huch <huch@in.tum.de>
parents:
79181
diff
changeset
|
1735 |
"g:" -> (arg => session_groups += arg), |
6202d0ff36b4
added build schedule command-line wrapper;
Fabian Huch <huch@in.tum.de>
parents:
79181
diff
changeset
|
1736 |
"o:" -> (arg => options = options + arg), |
6202d0ff36b4
added build schedule command-line wrapper;
Fabian Huch <huch@in.tum.de>
parents:
79181
diff
changeset
|
1737 |
"v" -> (_ => verbose = true), |
6202d0ff36b4
added build schedule command-line wrapper;
Fabian Huch <huch@in.tum.de>
parents:
79181
diff
changeset
|
1738 |
"x:" -> (arg => exclude_sessions += arg)) |
6202d0ff36b4
added build schedule command-line wrapper;
Fabian Huch <huch@in.tum.de>
parents:
79181
diff
changeset
|
1739 |
|
6202d0ff36b4
added build schedule command-line wrapper;
Fabian Huch <huch@in.tum.de>
parents:
79181
diff
changeset
|
1740 |
val sessions = getopts(args) |
6202d0ff36b4
added build schedule command-line wrapper;
Fabian Huch <huch@in.tum.de>
parents:
79181
diff
changeset
|
1741 |
|
6202d0ff36b4
added build schedule command-line wrapper;
Fabian Huch <huch@in.tum.de>
parents:
79181
diff
changeset
|
1742 |
val progress = new Console_Progress(verbose = verbose) |
6202d0ff36b4
added build schedule command-line wrapper;
Fabian Huch <huch@in.tum.de>
parents:
79181
diff
changeset
|
1743 |
|
6202d0ff36b4
added build schedule command-line wrapper;
Fabian Huch <huch@in.tum.de>
parents:
79181
diff
changeset
|
1744 |
val schedule = |
6202d0ff36b4
added build schedule command-line wrapper;
Fabian Huch <huch@in.tum.de>
parents:
79181
diff
changeset
|
1745 |
build_schedule(options, |
6202d0ff36b4
added build schedule command-line wrapper;
Fabian Huch <huch@in.tum.de>
parents:
79181
diff
changeset
|
1746 |
selection = Sessions.Selection( |
6202d0ff36b4
added build schedule command-line wrapper;
Fabian Huch <huch@in.tum.de>
parents:
79181
diff
changeset
|
1747 |
requirements = requirements, |
6202d0ff36b4
added build schedule command-line wrapper;
Fabian Huch <huch@in.tum.de>
parents:
79181
diff
changeset
|
1748 |
all_sessions = all_sessions, |
6202d0ff36b4
added build schedule command-line wrapper;
Fabian Huch <huch@in.tum.de>
parents:
79181
diff
changeset
|
1749 |
base_sessions = base_sessions.toList, |
6202d0ff36b4
added build schedule command-line wrapper;
Fabian Huch <huch@in.tum.de>
parents:
79181
diff
changeset
|
1750 |
exclude_session_groups = exclude_session_groups.toList, |
6202d0ff36b4
added build schedule command-line wrapper;
Fabian Huch <huch@in.tum.de>
parents:
79181
diff
changeset
|
1751 |
exclude_sessions = exclude_sessions.toList, |
6202d0ff36b4
added build schedule command-line wrapper;
Fabian Huch <huch@in.tum.de>
parents:
79181
diff
changeset
|
1752 |
session_groups = session_groups.toList, |
6202d0ff36b4
added build schedule command-line wrapper;
Fabian Huch <huch@in.tum.de>
parents:
79181
diff
changeset
|
1753 |
sessions = sessions), |
6202d0ff36b4
added build schedule command-line wrapper;
Fabian Huch <huch@in.tum.de>
parents:
79181
diff
changeset
|
1754 |
progress = progress, |
6202d0ff36b4
added build schedule command-line wrapper;
Fabian Huch <huch@in.tum.de>
parents:
79181
diff
changeset
|
1755 |
afp_root = afp_root, |
6202d0ff36b4
added build schedule command-line wrapper;
Fabian Huch <huch@in.tum.de>
parents:
79181
diff
changeset
|
1756 |
dirs = dirs.toList, |
6202d0ff36b4
added build schedule command-line wrapper;
Fabian Huch <huch@in.tum.de>
parents:
79181
diff
changeset
|
1757 |
select_dirs = select_dirs.toList, |
6202d0ff36b4
added build schedule command-line wrapper;
Fabian Huch <huch@in.tum.de>
parents:
79181
diff
changeset
|
1758 |
numa_shuffling = isabelle.Host.numa_check(progress, numa_shuffling), |
6202d0ff36b4
added build schedule command-line wrapper;
Fabian Huch <huch@in.tum.de>
parents:
79181
diff
changeset
|
1759 |
build_hosts = build_hosts.toList) |
6202d0ff36b4
added build schedule command-line wrapper;
Fabian Huch <huch@in.tum.de>
parents:
79181
diff
changeset
|
1760 |
|
79915
40d2f9ce29fc
allow read/write of schedule in build (read via option, write from tool);
Fabian Huch <huch@in.tum.de>
parents:
79914
diff
changeset
|
1761 |
output_file match { |
40d2f9ce29fc
allow read/write of schedule in build (read via option, write from tool);
Fabian Huch <huch@in.tum.de>
parents:
79914
diff
changeset
|
1762 |
case Some(output_file) if !schedule.is_empty => |
40d2f9ce29fc
allow read/write of schedule in build (read via option, write from tool);
Fabian Huch <huch@in.tum.de>
parents:
79914
diff
changeset
|
1763 |
if (File.is_pdf(output_file.file_name) || File.is_png(output_file.file_name)) |
40d2f9ce29fc
allow read/write of schedule in build (read via option, write from tool);
Fabian Huch <huch@in.tum.de>
parents:
79914
diff
changeset
|
1764 |
write_schedule_graphic(schedule, output_file) |
40d2f9ce29fc
allow read/write of schedule in build (read via option, write from tool);
Fabian Huch <huch@in.tum.de>
parents:
79914
diff
changeset
|
1765 |
else Schedule.write(schedule, output_file) |
40d2f9ce29fc
allow read/write of schedule in build (read via option, write from tool);
Fabian Huch <huch@in.tum.de>
parents:
79914
diff
changeset
|
1766 |
case _ => |
40d2f9ce29fc
allow read/write of schedule in build (read via option, write from tool);
Fabian Huch <huch@in.tum.de>
parents:
79914
diff
changeset
|
1767 |
} |
79182
6202d0ff36b4
added build schedule command-line wrapper;
Fabian Huch <huch@in.tum.de>
parents:
79181
diff
changeset
|
1768 |
}) |
78845
ff96d94957cb
add module for faster scheduled builds;
Fabian Huch <huch@in.tum.de>
parents:
diff
changeset
|
1769 |
} |