xen-devel.lists.xenproject.org archive mirror
 help / color / mirror / Atom feed
From: Ian Jackson <iwj@xenproject.org>
To: xen-devel@lists.xenproject.org
Cc: Ian Jackson <ian.jackson@eu.citrix.com>
Subject: [OSSTEST PATCH 72/82] resource reporting: Report host reuse/sharing in job report
Date: Wed,  7 Oct 2020 19:00:14 +0100	[thread overview]
Message-ID: <20201007180024.7932-73-iwj@xenproject.org> (raw)
In-Reply-To: <20201007180024.7932-1-iwj@xenproject.org>

From: Ian Jackson <ian.jackson@eu.citrix.com>

Compatibility: in principle this might generate erroneous reports
which omit sharing/reuse information for allocations made by jobs
using older versions of osstest.

However, we do not share or reuse hosts across different osstest
versions, so this cannot occur.

Signed-off-by: Ian Jackson <ian.jackson@eu.citrix.com>
---
 sg-report-flight | 331 ++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 330 insertions(+), 1 deletion(-)

diff --git a/sg-report-flight b/sg-report-flight
index a1f424c5..0413a730 100755
--- a/sg-report-flight
+++ b/sg-report-flight
@@ -29,9 +29,10 @@ use POSIX;
 use IPC::Open2;
 use Data::Dumper;
 use File::Path;
+use Carp;
 
 use Osstest;
-use Osstest::Executive;
+use Osstest::Executive qw(:DEFAULT :colours);
 
 our $specflight;
 our %specver;
@@ -1122,6 +1123,68 @@ END
     return @failures;
 }
 
+# Machinery for generating WITH ... VALUES common table expressions.
+# Use it like this:
+#
+#    1. $some_accum = {}
+#
+#    2. valuestable_add_row($some_accum, $val, $val, $val)
+#          # ^ zero or more times
+#
+#    3. $qtxt = "WITH\n";
+#       @qparams = ();
+#       valuestable_with(\$qtxt, \@qparams, 'cte_name',
+#              qw(txtcol1 txtcol2 intcol::integer boolcol::bool ...));
+#
+# The resulting CTE table will have the name, and column names,
+# you specified.  For non-TEXT columns you must specify the type
+# because [Postgre]SQL's type inference doesn't work properly here.
+#
+# valuestable_with will always leave $qtxt ending with ",\n"
+# so you can call it multiple times.
+
+sub valuestable_add_row ($@) {
+    my ($accum, @row) = @_;
+    # $accum->{Ncols}
+    # $accum->{Params}[]
+    # $accum->{Qtxt}
+    $accum->{Ncols} //= scalar @row;
+    confess unless $accum->{Ncols} == @row;
+    push @{ $accum->{Params} }, @row;
+    $accum->{Qtxt} //= '';
+    $accum->{Qtxt} =~ s/.$/$&,/;
+    $accum->{Qtxt} .= "          (".join(',', ('?',) x @row).")\n";
+}
+sub valuestable_with ($$$@) {
+    my ($qtxtr, $paramsr, $ctename, $accum, @cols) = @_;
+    my $limit = '';
+    $accum->{Qtxt} //= do {
+	# Oh my god
+	# select * from (values );
+	# => ERROR:  syntax error at or near ")"
+	$limit = 'LIMIT 0';
+	"          (".join(',',
+			   map { m/::/ ? "NULL::$'" : "NULL" }
+			   @cols).")\n";
+    };
+    $accum->{Ncols} //= scalar @cols;
+    confess "$accum->{Ncols} != ".(scalar @cols)
+      unless $accum->{Ncols} == @cols;
+    my $cols = join(', ', @cols);
+    my $colsnotypes = join(', ', map { m/::/ ? $` : $_ } @cols);
+    $$qtxtr .= <<END;
+      $ctename ($colsnotypes) AS (SELECT
+            $cols FROM (VALUES
+$accum->{Qtxt}        $limit) $ctename ($colsnotypes)),
+
+END
+    push @$paramsr, @{ $accum->{Params} // [ ] };
+}
+
+sub nullcols {
+    join ", ", map { m/::/ ? "NULL::$' as $`" : "NULL as $_" } @_;
+}
+
 sub htmloutjob ($$) {
     my ($fi,$job) = @_;
     return unless defined $htmldir;
@@ -1213,6 +1276,272 @@ END
 <tr><td>Status:</td><td>$ji->{status}</td></tr>
 </table>
 <p>
+END
+
+    # ---------- resource reuse/sharing report ----------
+
+    # We translate the lifecycle runvars into a set of questions
+    # for the db.  But rather than doing one db query for each
+    # such question, we aggregate the questions into VALUES
+    # expressions and ask the db to produce a collated list of
+    # relevant information.  This has fewer round trips.
+
+    my $shareq_elided_accum = {};
+    my $shareq_tasks_accum = {};
+    my $shareq_main_accum = {};
+    foreach my $lc_var_row (@$runvar_table) {
+	next unless $lc_var_row->{name} =~ m{^(.*_?host)_lifecycle$};
+	my $tident = $1;
+	my $hostname = ($runvar_map{$tident} // next)->{val};
+	my $last_uncompr;
+	my $sort_index;
+	print DEBUG "SHARE LC $job $tident $lc_var_row->{val}\n";
+	foreach (split / /, $lc_var_row->{val}) {
+	    $sort_index++;
+	    if (m/^[\@\+]$/) {
+		valuestable_add_row $shareq_elided_accum,
+		  $tident, $hostname, undef, $&, $sort_index;
+		next;
+	    }
+	    if (m/^\[(\d+)\]$/) { # elided
+		valuestable_add_row $shareq_elided_accum,
+		  $tident, $hostname, $1, undef, $sort_index;
+		next;
+	    }
+	    my $olive = s/^\+//;
+	    if (m/^\?(\d+)$/) { # tasks
+		valuestable_add_row $shareq_tasks_accum,
+		  $tident, $hostname, $olive+0, $1, $sort_index;
+		next;
+	    }
+	    my $oisprep = s/^\@//;
+	    s{^\d+$}{ join ":$&", @$last_uncompr }e if $last_uncompr;
+	    if (my ($tprefix, $oflight, $ojob,
+		    $ostepno, $tsuffix, $oident) =
+		m{^((?:(\d+)\.)?([^:]+)?)\:(\d+)((?:,([^:]+))?)$}) {
+		# main
+		$last_uncompr = [ $tprefix, $tsuffix ];
+		$oflight ||= $specflight;
+		$ojob ||= $job;
+		$oident ||= 'host';
+		valuestable_add_row $shareq_main_accum,
+		  $tident, $hostname, $oflight, $ojob, $ostepno,
+		  $oisprep+0, $oident, $olive+0;
+		next;
+	    }
+	    confess "$tident $hostname $_ ?";
+	}
+    }
+    my @shareq_params;
+    my $shareq_txt = <<END;
+      WITH
+
+END
+
+    valuestable_with \$shareq_txt, \@shareq_params,
+      'q_elided', $shareq_elided_accum,
+      qw(tident hostname count::integer sigil sort_index::integer);
+
+    valuestable_with \$shareq_txt, \@shareq_params,
+      'q_tasks', $shareq_tasks_accum,
+      qw(tident hostname olive::bool taskid::integer sort_index::integer);
+
+    valuestable_with \$shareq_txt, \@shareq_params,
+      'q', $shareq_main_accum,
+      qw(tident hostname flight::integer job
+         stepno::integer oisprep::bool oident olive::bool);
+
+    # Helpers to reduce typing in the mapping from individual r_*
+    # table rows to the overall union (sum type) rows.
+    my $nullcols_main = nullcols(qw(
+        flight::integer job status oidents
+        started::integer rest_started::integer finished::integer
+    ));
+    my $nullcols_tasks = nullcols(qw(
+        taskid::integer type refkey username comment
+    ));
+    my $nullcols_elided = nullcols(qw(
+        elided::integer elided_sigil
+    ));
+
+    $shareq_txt .= <<END;
+      q2 AS
+      (SELECT q.*,
+	      (SELECT started
+		FROM steps s
+	       WHERE s.flight = q.flight
+		 AND s.job    = q.job 
+		 AND s.stepno = q.stepno
+		 AND oisprep)                    AS prep_started,
+	      (SELECT started
+		 FROM steps s
+		WHERE s.flight = q.flight
+		  AND s.job    = q.job
+		  AND s.stepno = q.stepno
+		  AND NOT oisprep)               AS rest_started,
+	      (SELECT max(finished)
+		 FROM steps s
+		WHERE s.flight = q.flight
+		  AND s.job    = q.job)          AS finished
+	FROM Q
+        ORDER BY q.tident),
+
+      r_main AS
+      (SELECT tident, hostname,
+              bool_or(olive)                     AS olive,
+              1                                  AS kind_sort,
+              flight, job,
+	      (SELECT status
+		 FROM jobs
+		WHERE jobs.flight = q2.flight
+		  AND jobs.job    = q2.job)      AS status,
+	      string_agg(DISTINCT oident,',')    AS oidents,
+	      min(prep_started)                  AS prep_started,
+	      min(rest_started)                  AS rest_started,
+	      max(finished)                      AS finished,
+	      $nullcols_tasks,
+	      $nullcols_elided,
+              NULL::integer                      AS sort_index
+	 FROM q2
+     GROUP BY tident, hostname, flight, job),
+
+      r_tasks AS
+      (SELECT tident, hostname, olive,
+              0                                  AS kind_sort,
+              $nullcols_main,
+              taskid, type, refkey, username, comment,
+              $nullcols_elided,
+              sort_index
+         FROM q_tasks NATURAL LEFT JOIN tasks),
+
+      r_elided AS
+      (SELECT tident, hostname, FALSE as olive,
+              2                                  AS kind_sort,
+              $nullcols_main,
+              $nullcols_tasks,
+              count                              AS elided,
+              sigil                              AS elided_sigil,
+              sort_index
+         FROM q_elided)
+
+-- The result row is effectively a sum type.  SQL doesn't have those.
+-- We just pile all the columns of the disjoint types together;
+-- some of them will be null for some variants.  The perl code can
+-- easily figure out which of the unioned CTEs a row came from.
+
+       SELECT * FROM r_main    UNION
+       SELECT * FROM r_tasks   UNION
+       SELECT * FROM r_elided
+     ORDER BY tident, hostname,
+	      kind_sort,
+	      finished, prep_started, rest_started, flight, job, oidents,
+	      sort_index
+END
+
+    print DEBUG "PREPARING SHAREQ\n";
+    my $shareq = db_prepare($shareq_txt);
+    print DEBUG Dumper(\@shareq_params);
+    $shareq->execute(@shareq_params);
+
+    my $share_any;
+    my $altcolour=1;
+    while (my $srow = $shareq->fetchrow_hashref()) {
+	print DEBUG "SHARE SROW ".Dumper($srow);
+	print H <<END if !$share_any++;
+<h2>Task(s) which might have affected this job's host(s)</h2>
+<p>
+<table rules="all"><tr>
+<th>role<br>(here)</td>
+<th>hostname</td>
+<th>rel.</td><!-- share reuse unknown -->
+<th>flight</td>
+<th>job</td>
+<th>role(s)<br>(there)</td>
+<th>install / prep.<br>started</td>
+<th>use</br>started</td>
+<th>last step<br>ended</td>
+<th>job<br>status</td>
+</tr>
+END
+	my $bgcolour = report_altcolour($altcolour ^= 1);
+	printf H <<END, $bgcolour, map { encode_entities $_ }
+<tr %s>
+<td align="center">%s</td>
+<td align="center"><a href="%s">%s</a></td>
+END
+	  $srow->{tident},
+	  "$c{ResultsHtmlPubBaseUrl}/host/$srow->{hostname}.html",
+	  $srow->{hostname};
+	my $rel = $srow->{olive} ?
+	  "<td align=\"center\" bgcolor=\"$red\">share</td>"
+	  : $srow->{prep_started} ?
+	  "<td align=\"center\" bgcolor=\"$purple\">prep.</td>"
+	  :
+	  "<td align=\"center\">reuse</td>";
+        if (defined $srow->{flight}) {
+	    my $furl = "$c{ReportHtmlPubBaseUrl}/$srow->{flight}/";
+	    my $jurl = "$furl/$srow->{job}/info.html";
+	    if ($srow->{flight} != $specflight) {
+		printf H <<END, $rel, map { encode_entities $_ }
+%s
+<td align="right"><a href="%s">%s</a></td>
+<td><a href="%s">%s</a></td>
+END
+		  $furl, $srow->{flight},
+		  $jurl, $srow->{job};
+	    } elsif ($srow->{job} ne $job) {
+		printf H <<END, $rel, map { encode_entities $_ }
+%s
+<td align="center">this</td>
+<td><a href="%s">%s</a></td>
+END
+		  $jurl, $srow->{job};
+	    } else {
+		printf H <<END;
+<td></td>
+<td align="center">this</td>
+<td align="center">this</td>
+END
+	    }
+	    printf H <<END,
+<td align="center">%s</td>
+<td>%s</td><td>%s</td><td>%s</td>
+END
+	      encode_entities($srow->{oidents}),
+	      map { $_ ? show_abs_time($_) : '' }
+	      $srow->{prep_started},
+	      $srow->{rest_started},
+	      !$srow->{olive} && $srow->{finished};
+	    my $info = report_run_getinfo($srow);
+	    print H <<END, 
+<td $info->{ColourAttr}>$info->{Content}</td>
+END
+	} elsif (defined $srow->{elided}) {
+	    printf H <<END, $srow->{elided};
+<td colspan="8" align="center">%d earlier job(s) elided</td>
+END
+	} elsif (defined $srow->{elided_sigil}) {
+	    printf H <<END;
+<td bgcolor="$yellow" colspan="8" align="center">
+this job incomplete, unknown number of other jobs elided
+</td>
+END
+	} elsif (defined $srow->{taskid}) {
+	    printf H <<END, $rel, map { encode_entities $_ }
+%s
+<td bgcolor="$yellow" colspan="7" align="center">?%s: %s</td>
+END
+	      $srow->{taskid},
+	      report_rogue_task_description($srow);
+	} else {
+	    confess Dumper($srow)." ?";
+	}
+	print H <<END;
+</tr>
+END
+    }
+    print H <<END if $share_any;
+</table>
 END
 
     print H <<END;
-- 
2.20.1



  parent reply	other threads:[~2020-10-07 18:19 UTC|newest]

Thread overview: 85+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-10-07 17:59 [OSSTEST PATCH 00/82] Reuse test hosts Ian Jackson
2020-10-07 17:59 ` [OSSTEST PATCH 01/82] ms-queuedaemon: Update for newer Tcl's socket channel ids Ian Jackson
2020-10-07 17:59 ` [OSSTEST PATCH 02/82] Executive.pm planner: fix typo Ian Jackson
2020-10-07 17:59 ` [OSSTEST PATCH 03/82] README.planner: Document magic job hostflags Ian Jackson
2020-10-07 17:59 ` [OSSTEST PATCH 04/82] sg-run-job: Minor whitespace (formatting) changes Ian Jackson
2020-10-07 17:59 ` [OSSTEST PATCH 05/82] sg-run-job: Improve some internal API docs Ian Jackson
2020-10-07 17:59 ` [OSSTEST PATCH 06/82] show_abs_time: Represent undef $timet as <undef> Ian Jackson
2020-10-07 17:59 ` [OSSTEST PATCH 07/82] ts-hosts-allocate-Executive: Add a comment about a warning Ian Jackson
2020-10-07 17:59 ` [OSSTEST PATCH 08/82] host reuse: ms-planner: Bring some variables forward Ian Jackson
2020-10-07 17:59 ` [OSSTEST PATCH 09/82] host reuse: ms-planner: Do not show reuse as shared in the plan Ian Jackson
2020-10-07 17:59 ` [OSSTEST PATCH 10/82] hsot reuse: ms-planner: Abbreviate reporting of test shares Ian Jackson
2020-10-07 17:59 ` [OSSTEST PATCH 11/82] cr-publish-flight-logs: Fix abs_time calls Ian Jackson
2020-10-07 17:59 ` [OSSTEST PATCH 12/82] target setup refactoring: Move target_kernkind_check Ian Jackson
2020-10-07 17:59 ` [OSSTEST PATCH 13/82] target setup refactoring: Move target_kernkind_console_inittab Ian Jackson
2020-10-07 17:59 ` [OSSTEST PATCH 14/82] target setup refactoring: Merge target_kernkind_* Ian Jackson
2020-10-07 17:59 ` [OSSTEST PATCH 15/82] target setup refactoring: Add a doc comment Ian Jackson
2020-10-07 17:59 ` [OSSTEST PATCH 16/82] abolish "kernkind"; desupport non-pvops kernels Ian Jackson
2020-10-13  9:29   ` Wei Liu
2020-10-07 17:59 ` [OSSTEST PATCH 17/82] Debian: osstest-erase-other-disks: Slightly guard against races Ian Jackson
2020-10-07 17:59 ` [OSSTEST PATCH 18/82] host allocation: Remove some unnecessary definedness tests Ian Jackson
2020-10-07 17:59 ` [OSSTEST PATCH 19/82] host allocation: Executive: Honour $xparams{InfraPriority} Ian Jackson
2020-10-07 17:59 ` [OSSTEST PATCH 20/82] ts-hosts-allocate-Executive: Fix handling of failed preps for same sharing Ian Jackson
2020-10-07 17:59 ` [OSSTEST PATCH 21/82] sg-run-job: support +! for *only* adding things to TESTID Ian Jackson
2020-10-07 17:59 ` [OSSTEST PATCH 22/82] sg-run-job: Use +! in per-host-ts implementation Ian Jackson
2020-10-07 17:59 ` [OSSTEST PATCH 23/82] db_retry: Make the sleeps random and increasing Ian Jackson
2020-10-07 17:59 ` [OSSTEST PATCH 24/82] host allocation: *_shared_mark_ready: Allow other states Ian Jackson
2020-10-07 17:59 ` [OSSTEST PATCH 25/82] host allocation: *_shared_mark_ready: Make $sharetype check optional Ian Jackson
2020-10-07 17:59 ` [OSSTEST PATCH 26/82] host allocation: selecthost: allow sort-of-selection of prospective hosts Ian Jackson
2020-10-07 17:59 ` [OSSTEST PATCH 27/82] host allocation: *_shared_mark_ready: allow alternative $oldtypes Ian Jackson
2020-10-07 17:59 ` [OSSTEST PATCH 28/82] host allocation: Support new reuse-* magic hostflag Ian Jackson
2020-10-07 17:59 ` [OSSTEST PATCH 29/82] host allocation: *_shared_mark_ready: Only prod when $newstate is ready Ian Jackson
2020-10-07 17:59 ` [OSSTEST PATCH 30/82] plan_search: Break out $share_compat_ok Ian Jackson
2020-10-07 17:59 ` [OSSTEST PATCH 31/82] plan_search: Improve debugging of $share_compat_ok->() Ian Jackson
2020-10-07 17:59 ` [OSSTEST PATCH 32/82] plan_search: Use plan's Wear information rather than tracking it ourselves Ian Jackson
2020-10-07 17:59 ` [OSSTEST PATCH 33/82] plan search: Move $share_compat_ok further up the file Ian Jackson
2020-10-07 17:59 ` [OSSTEST PATCH 34/82] plan_search: Track last sharing state to determine $share_reuse Ian Jackson
2020-10-07 17:59 ` [OSSTEST PATCH 35/82] resource reporting: Print username when listing "rogue tasks" Ian Jackson
2020-10-07 17:59 ` [OSSTEST PATCH 36/82] resource reporting, nfc: Break out report_rogue_task_description Ian Jackson
2020-10-07 17:59 ` [OSSTEST PATCH 37/82] ts-hosts-allocate-Executive: Better message for hosts abandoned mid-test Ian Jackson
2020-10-07 17:59 ` [OSSTEST PATCH 38/82] ts-host-reuse: New script, to do reuse state changes Ian Jackson
2020-10-07 17:59 ` [OSSTEST PATCH 39/82] ts-host-reuse: tolerate unremoveable lv Ian Jackson
2020-10-07 17:59 ` [OSSTEST PATCH 40/82] ts-host-reuse: Do not depend on bios Ian Jackson
2020-10-07 17:59 ` [OSSTEST PATCH 41/82] ts-host-reuse: Add some missing runvars to the host sharing control Ian Jackson
2020-10-07 17:59 ` [OSSTEST PATCH 42/82] host allocation: selecthost(): Support @IDENT for reuse Ian Jackson
2020-10-07 17:59 ` [OSSTEST PATCH 43/82] ts-hosts-allocate-Executive print sharing info in debug output Ian Jackson
2020-10-07 17:59 ` [OSSTEST PATCH 44/82] sg-run-job: New @ iffail tag for prep tasks Ian Jackson
2020-10-07 17:59 ` [OSSTEST PATCH 45/82] sg-run-job: Detect improper use of @ iffail with run-ts Ian Jackson
2020-10-07 17:59 ` [OSSTEST PATCH 46/82] shared/reuse: Use @ for ts-xen-build-prep Ian Jackson
2020-10-07 17:59 ` [OSSTEST PATCH 47/82] shared/reuse: Use @ for ts-host-install Ian Jackson
2020-10-07 17:59 ` [OSSTEST PATCH 48/82] shared/reuse: Use @ for freebsd host prep Ian Jackson
2020-10-07 17:59 ` [OSSTEST PATCH 49/82] host reuse: sg-run-job: per-host prep: Use @ for per-host-ts Ian Jackson
2020-10-07 17:59 ` [OSSTEST PATCH 50/82] shared/reuse: Rely on @ for ts-host-ping-check Ian Jackson
2020-10-07 17:59 ` [OSSTEST PATCH 51/82] host reuse: Reuse test hosts within a flight Ian Jackson
2020-10-07 17:59 ` [OSSTEST PATCH 52/82] host allocation: Group jobs by their reuse parameters Ian Jackson
2020-10-07 17:59 ` [OSSTEST PATCH 53/82] host reuse: Jiggle the infra-priority a bit, within a flight Ian Jackson
2020-10-07 17:59 ` [OSSTEST PATCH 54/82] host reuse: Use literal for the hosts_infraprioritygroup runvar Ian Jackson
2020-10-07 17:59 ` [OSSTEST PATCH 55/82] host reuse: Bump host share reuse bonus Ian Jackson
2020-10-07 17:59 ` [OSSTEST PATCH 56/82] subst_netboot_template: Do not use all of %r Ian Jackson
2020-10-07 17:59 ` [OSSTEST PATCH 57/82] TestSupport: Provide runvar_is_synth Ian Jackson
2020-10-07 18:00 ` [OSSTEST PATCH 58/82] runvar access: Introduce access control machinery Ian Jackson
2020-10-07 18:00 ` [OSSTEST PATCH 59/82] runvar access: Provide runvar_glob Ian Jackson
2020-10-07 18:00 ` [OSSTEST PATCH 60/82] runvar access: Use runvar_glob for dmrestrict runvar search Ian Jackson
2020-10-07 18:00 ` [OSSTEST PATCH 61/82] runvar access: Introduce sharing_for_build Ian Jackson
2020-10-07 18:00 ` [OSSTEST PATCH 62/82] runvar access: Introduce effects_gone_before_share_reuse Ian Jackson
2020-10-07 18:00 ` [OSSTEST PATCH 63/82] test host reuse: Switch to principled sharing scope runvar scheme Ian Jackson
2020-10-07 18:00 ` [OSSTEST PATCH 64/82] hsot reuse: Hash the share type Ian Jackson
2020-10-07 18:00 ` [OSSTEST PATCH 65/82] hsot reuse: Make share type hash more easily greppable Ian Jackson
2020-10-07 18:00 ` [OSSTEST PATCH 66/82] host lifecycle: Machinery, db, for tracking relevant events Ian Jackson
2020-10-07 18:00 ` [OSSTEST PATCH 67/82] host lifecycle: Fix detection of concurrent jobs Ian Jackson
2020-10-07 18:00 ` [OSSTEST PATCH 68/82] host lifecycle: Prevent referential integrity violation Ian Jackson
2020-10-07 18:00 ` [OSSTEST PATCH 69/82] host lifecycle: Record lifecycle in db and runvar Ian Jackson
2020-10-07 18:00 ` [OSSTEST PATCH 70/82] sg-report-flight: Refactor runvar access Ian Jackson
2020-10-07 18:00 ` [OSSTEST PATCH 71/82] resource reporting, nfc: split a here document Ian Jackson
2020-10-07 18:00 ` Ian Jackson [this message]
2020-10-07 18:00 ` [OSSTEST PATCH 73/82] host reuse: sg-run-job: Reanme post-test-ok parameter Ian Jackson
2020-10-07 18:00 ` [OSSTEST PATCH 74/82] host reuse: ts-host-reuse: Prepare for argument handling Ian Jackson
2020-10-07 18:00 ` [OSSTEST PATCH 75/82] host reuse: New protocol between sg-run-job and ts-host-reuse Ian Jackson
2020-10-07 18:00 ` [OSSTEST PATCH 76/82] sg-report-flight: Reformat slightly Ian Jackson
2020-10-07 18:00 ` [OSSTEST PATCH 77/82] sg-report-flight: Improvements to other job (share/reuse) reporting Ian Jackson
2020-10-07 18:00 ` [OSSTEST PATCH 78/82] flight other job reporting: Put nulls last in the report Ian Jackson
2020-10-07 18:00 ` [OSSTEST PATCH 79/82] flight other job reporting: Further improvements to ordering Ian Jackson
2020-10-07 18:00 ` [OSSTEST PATCH 80/82] tsreadconfig: Change misleading "setting" message Ian Jackson
2020-10-07 18:00 ` [OSSTEST PATCH 81/82] sg-report-flight: Sharing reports: more task finished info Ian Jackson
2020-10-07 18:00 ` [OSSTEST PATCH 82/82] sg-report-flight: Word-wrapping improvements to job and step names Ian Jackson
2020-10-07 18:22 ` [OSSTEST PATCH 00/82] Reuse test hosts Ian Jackson

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20201007180024.7932-73-iwj@xenproject.org \
    --to=iwj@xenproject.org \
    --cc=ian.jackson@eu.citrix.com \
    --cc=xen-devel@lists.xenproject.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).