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