2
0
Fork 0
mirror of git://git.savannah.gnu.org/guix/guix-cuirass.git synced 2023-12-14 06:03:04 +01:00
Commit graph

731 commits

Author SHA1 Message Date
Jonathan Brielmaier
fd7e7b5f00
doc: Update path for gcroots.
* doc/cuirass.texi (Invoking cuirass): Update path for gcroots.

Signed-off-by: Mathieu Othacehe <othacehe@gnu.org>
2020-10-13 21:34:57 +02:00
Mathieu Othacehe
36fe5e9fe3
Update .dir-locals.el.
* .dir-locals (scheme-mode): Update it.
2020-10-09 09:54:37 +02:00
Mathieu Othacehe
77a3eeec35
Add missing copyrights.
* src/cuirass/metrics.scm: Add missing copyright.
* src/cuirass/watchdog.scm: Ditto.
2020-10-09 09:54:37 +02:00
Mathieu Othacehe
cb2c4e3d8f
Optimize build query.
Make sure that db-get-builds only performs one query and add build products to
the result. Also add indexes so that all "order" filters are covered.

Limit the maximum of build objects returned in "/api/latestbuilds" and
"/api/queue" to 1000.

Fixes: <https://issues.guix.gnu.org/43826>.

* src/sql/upgrade-15.sql: New file.
* Makefile (dist_sql_DATA): Add it.
* src/cuirass/database.scm (db-get-builds-by-search): Add "buildproducts" to
the returned build objects.
(db-get-builds): Remove unused filters. Join Outputs and BuildProducts table
in the query. Add "buildproducts" to the returned build objects.
* src/cuirass/http.scm (build->hydra-build): Use "buildproducts" from
"db-get-builds" procedure.
(url-handler): Forbid limit parameters greater than 1000 and use
"buildproducts" from "db-get-builds" procedure.
* src/schema.sql (Builds_stoptime, Builds_stoptime_id, Builds_status_ts_id):
New indexes.
2020-10-07 13:07:05 +02:00
Mathieu Othacehe
04e95afa1e
Add index on builds table.
* src/sql/upgrade-14.sql: New file.
* src/schema.sql (dist_sql_DATA): Add it.
* src/schema.sql (Builds_timestamp_stoptime): New index.
2020-10-06 18:26:28 +02:00
Mathieu Othacehe
cfc7710b7f
Remove unused modules.
* src/cuirass/database.scm: Remove unused modules.
2020-10-06 15:09:37 +02:00
Mathieu Othacehe
930c2f315c
Do not allow full search on nix_name field.
Searching for something like "%a%" can take up to ten minutes. Remove the
usage of special characters "^" and "$" in queries. Instead, always add a "%"
character at the end of the query. Also add an index on the nix_name field.

Fixes: <https://issues.guix.gnu.org/43791>.

* src/sql/upgrade-13.sql: New file.
* Makefile.am (dist_sql_DATA): Add it.
* src/schema.sql (Builds_nix_name): New index.
* src/cuirass/database.scm (query->bind-arguments): Remove support for "^" and
"$" special characters. Instead make sure that the query does not contain any
"%" character and prefix the query by "%".
(db-get-builds-by-search): Remove an useless query nesting level.
* src/cuirass/templates.scm (search-form): Adapt the search help message
accordingly.
2020-10-05 14:54:06 +02:00
Mathieu Othacehe
71aac24f3f
Remove another par-map call.
This is a follow-up of 761443bca6.

* src/cuirass/base.scm (fetch-inputs): Use map to replace the previous par-map
call.
(compile-checkouts): Also replace par-map call by map.
2020-10-03 15:03:50 +02:00
Mathieu Othacehe
761443bca6
Do not use par-map in fiberized context.
Fixes: <https://issues.guix.gnu.org/43757>.

* src/cuirass/base.scm (fetch-inputs): Call par-map from a separate thread as
this call is not suspendable.
2020-10-03 11:11:43 +02:00
Mathieu Othacehe
af84a00818
Add a timeout on database worker query send.
The number of database worker is limited, and can introduce some
starvation. Print a message each time a two seconds timeout expires while
sending an SQL query to a worker.

* src/cuirass/utils.scm (put-message-with-timeout): New procedure.
(call-with-worker-thread): Rename timeout and timeout-proc arguments to
receive-timeout and receive-timeout-proc arguments. Add two new arguments:
send-timeout and send-timeout-proc. Use put-message-with-timeout to honor
them.
* src/cuirass/database.scm (with-db-worker-thread): Adapt accordingly and pass
send-timeout and send-timeout-proc arguments.
2020-10-03 10:14:33 +02:00
Mathieu Othacehe
d9c9870503
Improve logging message.
* src/cuirass/base.scm (build-packages): Improve the logging message.
2020-10-03 08:50:53 +02:00
Mathieu Othacehe
d8d4f7df93
Print evaluation number.
* src/cuirass/base.scm (build-packages): Print the id of the registered
evaluation.
2020-10-03 08:41:10 +02:00
Mathieu Othacehe
e3cf2e3454
Print the caller name in timeout message.
* src/cuirass/database.scm (with-db-worker-thread): Print the caller name.
2020-10-03 08:26:36 +02:00
Mathieu Othacehe
91de9bbc5a
Add date to SQL queries log file.
* src/cuirass/logging.scm (log-query): Add date.
2020-10-03 08:06:56 +02:00
Mathieu Othacehe
cd89fc433f
Do not browse the store during registration.
* src/cuirass/database.scm (db-register-builds): Remove store argument and
assume that 'log and 'outputs properties are provided by the evaluation.
* src/cuirass/base.scm (build-packages): Adapt accordingly.
2020-10-01 18:34:58 +02:00
Mathieu Othacehe
39db021afd
Add evaluation database workers.
Evaluation registration involves running a large number of SQL queries. This
can cause some database worker starvation as well as some contention. To avoid
this issue, spawn database workers dedicated to evaluation registration.

* src/cuirass/database.scm (%db-registration-channel): New variable.
(with-db-registration-worker-thread, with-registration-workers): New macros.
(with-db-worker-thread-no-timeout): Remove it.
(db-register-builds): Run registration in dedicated database workers using
"with-db-registration-worker-thread" macro.
* bin/cuirass.in (main): Spawn database registration workers by calling
"with-registration-workers" macro.
2020-10-01 18:33:13 +02:00
Mathieu Othacehe
ce624ea720
Register all new outputs in one worker.
Make sure that all registration queries are done from within a single database
worker. Otherwise, when builds from multiple evaluations are registered at
the same time, some contention occurs communicating with workers.

* src/cuirass/base.scm (new-outputs?, build-packages): Move build registration
to ...
* src/cuirass/database.scm (db-register-builds): ... this new procedure.
(with-db-worker-thread-no-timeout): New procedure. Use it in
"db-register-builds" to avoid timeout messages.
2020-10-01 13:39:22 +02:00
Mathieu Othacehe
39f6e930ba
Expect nix-name and system to be part of the evaluation.
* src/cuirass/base.scm (evaluate): Expect 'nix-name and 'system properties to
be provided by the evaluation.
(build-packages): Use the eval-id provided as argument.
2020-10-01 13:18:46 +02:00
Mathieu Othacehe
4d7864c046
metrics: Optimize queries.
Avoid full Builds table scans.

* src/cuirass/metrics.scm (db-average-build-start-time-per-eval,
db-average-build-complete-time-per-eval, db-evaluation-completion-speed):
Rewrite query to avoid full Builds table scans.
2020-09-29 17:44:40 +02:00
Mathieu Othacehe
eb8d1b88ad
Add watchdog support.
* src/cuirass/watchdog.scm: New file.
* Makefile.am (dist_pkgmodule_DATA): Add it.
* src/cuirass/utils.scm (with-timeout, get-message-with-timeout): Export them.
* bin/cuirass.in (main): Start the watchdog.
2020-09-29 17:02:45 +02:00
Mathieu Othacehe
0ffcb80ebb
Optimize database queries.
Avoid full scans of Builds table that can be very time consuming by rewriting
some queries and using new indexes.

* src/sql/upgrade-12.sql: New file.
* Makefile.am (dist_sql_DATA): Add it.
* src/schema.sql (Builds_evaluation_index, Evaluations_status_index,
Evaluations_specification_index): New indexes.
* src/cuirass/database.scm (db-get-evaluations-build-summary,
db-get-evaluation-summary): Rewrite queries to avoid full Builds table scan
and use the new indexes.
2020-09-28 17:49:55 +02:00
Mathieu Othacehe
461e07e14e
Limit builds insertion queries.
Once the evaluation is over, the new builds are registered. This registration
tries to insert a new build for each derivation returned by the evaluation
phase. If the new build does not add a new output, the insertion query is then
rollbacked. This means that there are at least as many insertion queries as
new derivations.

SQlite allows at most one writer at a time, and even though we are using WAL
mode, performing a lot of insertions will reduce the reading perforances.
When multiple evaluations are performed in parallel, the large number of
concurrent insertion queries also causes contention.

To avoid those issues, check first in the "Outputs" table which derivations
are already registered. This means that most of the insertion queries will be
replaced by reading queries, that are much less expensive and more suitable
for Cuirass concurrent implementation.

* src/cuirass/base.scm (new-outputs?): New procedure.
(build-packages): Use it to insert only builds registering new outputs.
2020-09-28 09:38:15 +02:00
Mathieu Othacehe
d1386d85ca
Do not raise an exception at gcroot directory creation.
On fresh Guix System installations, Cuirass will not be allowd to create its
own profile directory. Instead this should be take care of by guix-daemon when
Cuirass will initiate its first connection to it.

* bin/cuirass.in (main): Do not raise an exception on gcroot directory
creation failure.
2020-09-24 14:13:57 +02:00
Mathieu Othacehe
b310f17aaf
Add SQL query logging support.
* bin/cuirass.in (show-help): Document "--log-queries" option.
(%options): Add it.
(main): Enable query logging if the above option is set.
* src/cuirass/database.scm (db-log-queries): New procedure.
* src/cuirass/logging.scm (query-logging-port): New parameter.
(log-query): New procedure.
2020-09-24 10:24:02 +02:00
Mathieu Othacehe
e7bebbe3d4
Fix GC race-condition in spawn-builds.
If a derivation is GC'd just before calling "spawn-builds",
"build-derivations: will throw an exception that will be catched. Then,
"update-build-statuses!"  will call "derivation-path->output-paths" that will
throw another exception because the derivation does not exit. This exception
is not handled, causing Cuirass to crash.

2020-09-18T10:41:18 batch of builds (partially) failed: build of `/gnu/store/zrmxzjf025nc89a7vdy5i94zavprc7fs-emacs-guix-0.5.2-2.58a840d.drv' failed (status: 1)
Backtrace:
In ice-9/boot-9.scm:
  1736:10 11 (with-exception-handler _ _ #:unwind? _ #:unwind-for-type _)
In unknown file:
          10 (apply-smob/0 #<thunk 7ffff5cbd4a0>)
In ice-9/boot-9.scm:
    718:2  9 (call-with-prompt _ _ #<procedure default-prompt-handler (k proc)>)
In ice-9/eval.scm:
    619:8  8 (_ #(#(#<directory (guile-user) 7ffff58f8f00>)))
In ice-9/boot-9.scm:
   2806:4  7 (save-module-excursion _)
  4351:12  6 (_)
In cuirass/base.scm:
   562:10  5 (spawn-builds #<store-connection 256.99 7fffec03f910> _ #:max-batch-size _)
In srfi/srfi-1.scm:
    634:9  4 (for-each #<procedure update! (drv)> ("/gnu/store/zrmxzjf025nc89a7vdy5i94zavprc7fs-emacs-guix-0.5.2-2.58a840d.drv"))
In cuirass/base.scm:
    474:4  3 (update! "/gnu/store/zrmxzjf025nc89a7vdy5i94zavprc7fs-emacs-guix-0.5.2-2.58a840d.drv")
In guix/derivations.scm:
   552:17  2 (derivation-path->output-paths "/gnu/store/zrmxzjf025nc89a7vdy5i94zavprc7fs-emacs-guix-0.5.2-2.58a840d.drv")
In ice-9/ports.scm:
   440:11  1 (call-with-input-file "/gnu/store/zrmxzjf025nc89a7vdy5i94zavprc7fs-emacs-guix-0.5.2-2.58a840d.drv" #<procedure read-derivation (drv-port #:optional read-derivation-from-file)> #:binary _ …)
In unknown file:
           0 (open-file "/gnu/store/zrmxzjf025nc89a7vdy5i94zavprc7fs-emacs-guix-0.5.2-2.58a840d.drv" "r" #:encoding #f #:guess-encoding #f)

* src/cuirass/base.scm (update-build-statuses!): Catch
"derivation-path->output-paths" exceptions and set the build status to
"failed".
2020-09-18 11:02:44 +02:00
Mathieu Othacehe
9a60cd6619
metrics: Order evaluation metrics by ascending evaluation id.
* src/cuirass/http.scm (metrics-page): Order 'average-eval-build-start-time
and 'evaluation-completion-speed metrics per ascending evaluation id.
2020-09-17 16:10:07 +02:00
Mathieu Othacehe
8d6c0dfb7e
metrics: Rename "Builds speed" section to "Builds completion".
* src/cuirass/templates.scm (global-metrics-content): Rename "Builds speed"
section to "Builds completion".
2020-09-17 11:53:03 +02:00
Mathieu Othacehe
d22ffdfa2a
metrics: Fix tests.
* tests/metrics.scm ("builds-per-day", "new-derivations-per-day"): Fix tests
results that were depending of the local time.
("evaluation-completion-speed"): Adapt to new unit.
2020-09-17 10:39:25 +02:00
Mathieu Othacehe
89f0dbc8e1
metrics: Add graph legends.
* src/cuirass/templates.scm (global-metrics-content): Add legends.
2020-09-17 10:30:49 +02:00
Mathieu Othacehe
24924bb600
templates: Do not display chart title.
* src/cuirass/templates.scm (make-line-chart): Do not display chart title.
2020-09-17 10:15:06 +02:00
Mathieu Othacehe
bd4f4d680a
metrics: Display more metrics.
* src/cuirass/http.scm (url-handler): Move metric page creation to ...
(metrics-page): ... this new procedure. Pass average evaluation build start
time and evaluation completion speed to "global-metrics-content".
* src/cuirass/templates.scm (make-line-chart): Add "time-x-axes?",
"xaxes-labels", "x-label" and "y-label" arguents.
(global-metrics-content): Add "avg-eval-build-start-time" and
"eval-completion-speed" arguments. Create and display two new charts from
those metrics.
2020-09-17 10:13:14 +02:00
Mathieu Othacehe
2470b216f1
metrics: Change evaluation-completion-speed unit.
* src/cuirass/metrics.scm (db-evaluation-completion-speed): Change the
completion speed unit to builds/hour.
(%metrics): Adapt comment.
2020-09-17 09:17:14 +02:00
Mathieu Othacehe
78de0da831
metrics: Add evaluation related metrics.
* src/cuirass/metrics.scm (db-average-build-start-time-per-eval,
db-average-build-complete-time-per-eval, db-evaluation-completion-speed,
db-latest-evaluations): New procedures.
(%metrics): Add 'average-eval-build-start-time,
'average-eval-build-complete-time, 'evaluation-completion-speed.
(db-update-metrics): Update evaluation related metrics for the evaluations
added the past three days.
* tests/metrics.scm ("average-eval-build-start-time",
"average-eval-build-complete-time", "evaluation-completion-speed"): Add new
tests.
2020-09-16 15:58:54 +02:00
Mathieu Othacehe
822dbb366d
Log metrics update duration.
* bin/cuirass.in (main): Log metrics update duration.
2020-09-16 15:58:14 +02:00
Mathieu Othacehe
8fc4794b30
tests: Improve metrics testing.
* tests/metrics.scm (nearest-exact-integer): Remove as unused.
("db-update-metrics"): Test that 'pending-builds metric is updated on
"db-update-metrics" call.
2020-09-15 17:52:18 +02:00
Mathieu Othacehe
7642748398
Add metrics testing.
* tests/metrics.scm: New file.
* Makefile.am (TESTS): Add it.
2020-09-15 17:40:05 +02:00
Mathieu Othacehe
f3ab04aee4
metrics: Add 'percentage-failed-eval-per-spec support.
* src/cuirass/metrics.scm (db-percentage-failed-eval-per-spec): New procedure.
(%metrics): Add 'percentage-failure-10-last-eval-per-spec,
'percentage-failure-100-last-eval-per-spec and
'percentage-failed-eval-per-spec metrics.
(db-update-metrics): Add them.
* src/cuirass/templates.scm (global-metrics-content): Add
"percentage-failed-eval" argument. Use it to display the "percentage of failed
evaluations" table.
* src/cuirass/templates.scm (url-handler): Adapt accordingly.
2020-09-15 14:34:19 +02:00
Mathieu Othacehe
ad3c603541
metrics: Fix db-average-eval-duration-per-spec.
* src/cuirass/metrics.scm (db-average-eval-duration-per-spec): Order results
by descending rowid and adjust docstring.
2020-09-15 14:30:00 +02:00
Mathieu Othacehe
c5a975867e
metrics: Warn about metric insertion.
* src/cuirass/metrics.scm: Add a warning about metric insertion in %metrics
list.
2020-09-15 11:22:02 +02:00
Mathieu Othacehe
97ec7a2da5
metrics: Add 'new-derivations-per-day support.
* src/cuirass/metrics.scm (db-new-derivations-previous-day): New procedure.
(%metrics): Add 'new-derivations-per-day.
(db-update-metrics): Add it.
* src/cuirass/templates.scm (make-line-chart): Add support for multiple
datasets. Also add "interpolation?" and "legend?" options.
(global-metrics-content): Add "new-derivations-per-day" argument. Adapt
"Builds per day" chart so that it uses two datasets from
'new-derivations-per-day and 'builds-per-day metrics.
* src/cuirass/templates.scm (url-handler): Adapt accordingly.
2020-09-15 11:13:09 +02:00
Mathieu Othacehe
d0a2235ec7
metrics: Change 'builds-per-day computation.
* src/cuirass/metrics.scm (db-builds-previous-day): Only take into account the
builds that are created and processed during the previous day.
2020-09-15 11:11:09 +02:00
Mathieu Othacehe
f011d87456
metrics: Add pending builds support.
* src/cuirass/metrics.scm (db-pending-builds, db-current-day-timestamp): New
procedures.
(%metrics): Add 'pending-builds.
(db-update-metrics): Add it.
* src/cuirass/templates.scm (global-metrics-content): Add "pending-builds"
argument. Display pending builds in a line chart.
* src/cuirass/http.scm (url-handler): Adapt "global-metrics-content" call
accordingly.
2020-09-15 09:55:40 +02:00
Mathieu Othacehe
21a9b2b386
Do not override onload callback.
* src/cuirass/templates.scm (make-line-chart): Do not override onload callback
as that would prevent us from adding multiple charts.
2020-09-15 09:49:40 +02:00
Mathieu Othacehe
5a947e1841
metrics: Rename 'builds-previous-day to 'builds-per-day.
* src/cuirass/metrics.scm (%metrics): Rename 'builds-previous-day to
'builds-per-day.
(db-update-metrics): Adapt accordingly.
* src/cuirass/http.scm (url-handler): Ditto.
2020-09-15 09:47:04 +02:00
Mathieu Othacehe
cd2d2512e6
metrics: Order by descending rowid by default.
* src/cuirass/metrics.scm (db-get-metrics-with-id): Order by descending rowid
by default.
* src/cuirass/http.scm (url-handler): Use the default order for
"db-get-metrics-with-id".
2020-09-15 09:16:11 +02:00
Mathieu Othacehe
cf11b73db0
Add metrics support.
* Makefile.am: Add "upgrade-11.sql", "chart.js" and "metrics.js".
* bin/cuirass.in (main): Add 'metrics fiber.
* src/cuirass/http.scm (%file-white-list): Add "js/chart.js".
(url-handler): Add "/metrics" route.
* src/cuirass/metrics.scm: New file.
* src/cuirass/templates.scm (html-page): Add a "Global metrics" sub-menu to
"Status" dropdown menu.
(make-line-chart, global-metrics-content): New procedures.
* src/schema.sql (Metrics): New table.
* src/sql/upgrade-11.sql: New file.
* src/static/js/chart.js: New file.
2020-09-14 14:32:12 +02:00
Mathieu Othacehe
43ed85479f
database: Export procedures.
* src/cuirass/database.scm (last-insert-rowid, expect-one-row, %sqlite-exec):
Export them.
2020-09-14 14:32:07 +02:00
Mathieu Othacehe
713a914e18
Add missing SQL upgrade files.
* Makefile.am (dist_sql_DATA): Add upgrade-9.sql and upgrade-10.sql.
2020-09-10 16:59:04 +02:00
Mathieu Othacehe
00c7b4bb44
tests: Fix HTTP tests.
This is a follow-up of 154232bc76.

* tests/http.scm (evaluations-query-result): Add 'timestamp', 'checkouttime'
and 'evaltime' fields.
(fill-db): Pass a matching timestamp to "db-add-evaluation" calls.
2020-09-10 15:16:16 +02:00
Mathieu Othacehe
f5b0d39328
Add a status field to Evaluation table.
The Evaluation table currently has an 'in_progress' field. Distinction between
succeeded and failed evaluations are based on the presence of Builds records
for the evaluation. It it also not possible to distinguish aborted evaluations
from failed evaluations.

Rename 'in_progress' field to 'status'. The 'status' field can be equal to
'started', 'succeeded', 'failed' or 'aborted'.

* src/cuirass/database.scm (evaluation-status): New exported enumeration.
(db-set-evaluations-done, db-set-evaluation-done): Remove them.
(db-abort-pending-evaluations, db-set-evaluation-status): New exported procedures.
(db-add-evaluation, db-get-builds, db-get-evaluations,
db-get-evaluations-build-summary, db-get-evaluation-summary): Adapt to use
'status' field instead of 'in_progress' field.
* src/cuirass/templates.scm (evaluation-badges): Ditto.
* src/schema.sql (Evaluations): Rename 'in_progress' field to 'status'.
* src/sql/upgrade-10.sql: New file.
* bin/cuirass.in (main): Use "db-abort-pending-evaluations" instead of
"db-set-evaluations-done".
* src/cuirass/base.scm (evaluate): Use "db-set-evaluation-status" instead of
"db-set-evaluations-done".
(build-packages): Use "db-set-evaluation-status" instead of
"db-set-evaluation-done".
* tests/database.scm (sqlite-exec): Adapt accordingly.
* tests/http.scm (evaluations-query-result): Ditto.
2020-09-10 15:16:15 +02:00