Commit Graph

561 Commits

Author SHA1 Message Date
Mathieu Othacehe e61e7a5ca4
Fix tests.
* tests/database.scm (db-init): Force database creation.
* tests/http.scm (db-init): Ditto.
* tests/metrics (db-init): Ditto.
2021-01-17 12:05:31 +01:00
Mathieu Othacehe 53d8b66bf9
database: Fix regression.
Fix a regression introduced by cbc462679d.

* src/cuirass/database.scm (db-get-builds): Collect BuildProducts id field.
2021-01-17 11:53:47 +01:00
Mathieu Othacehe 508ed333a6
Fix concurrent database creation. 2021-01-15 15:07:15 +01:00
Mathieu Othacehe 5982316c5c
Fix tests.
* tests/database.scm: Fix tests.
2021-01-13 14:55:22 +01:00
Mathieu Othacehe cbc462679d
Switch to PostegreSQL. 2021-01-11 12:28:13 +01:00
Mathieu Othacehe ca7a7ca989
Add remote build support.
* src/cuirass/remote.scm: New file.
* src/cuirass/remote-server.scm: New file.
* src/cuirass/remote-worker.scm: New file.
* bin/remote-server.in: New file.
* bin/remote-worker.in: New file.
* Makefile.am (bin_SCRIPTS): Add new binaries,
(dist_pkgmodule_DATA): add new files,
(EXTRA_DIST): add new binaries,
(bin/remote-server, bin/remote-worker): new targets.
* .gitignore: Add new binaries.
* bin/cuirass.in (%options): Add "--build-remote" option,
(show-help): document it,
(main): honor it.
* src/cuirass/base.scm (with-build-offload-thread): New macro,
(%build-remote?, %build-offload-channel): new parameters,
(make-build-offload-thread): new procedure,
(build-derivations/offload): new procedure,
(restart-builds): use it to offload builds when %build-remote? is set,
(build-packages): ditto.
2021-01-06 21:06:04 +01:00
Mathieu Othacehe f65ef23ce6
Remove debug message.
src/cuirass/base.scm (build-packages): Remove debug message that can be
inaccurate if queue-size is superior to 1.
2020-12-09 12:37:16 +01:00
Mathieu Othacehe 3673fc310d
Save the build machine.
* src/sql/upgrade-17.sql: New file.
* Makefile.am (dist_sql_DATA): Add it.
* src/schema.sql (Builds): Add "machine" field.
* src/cuirass/database.scm (db-update-build-machine!): New procedure.
* src/cuirass/base.scm (handle-build-event): Use it to record the machine
performing the build.
2020-12-09 12:16:48 +01:00
Mathieu Othacehe 697fa14584
Add "queue size" argument.
* bin/cuirass.in (%options): Add "queue-size" argument.
(show-help): Document it.
(main): Honor it.
* src/cuirass/database.scm (%db-writer-queue-size): New parameter,
(with-queue-writer-worker): use it.
2020-12-08 11:46:07 +01:00
Mathieu Othacehe ab30c2284f
Fix tests.
This is a follow-up of ad44a9bb02.

* tests/http.scm (build-query-result): Add "evaluation" field.
2020-12-07 16:28:14 +01:00
Mathieu Othacehe ac2187ff6b
http: Add /api/evaluation route.
* src/cuirass/database.scm (db-get-evaluation): New procedure.
* src/cuirass/http.scm (url-handler): Add "/api/evaluation" route.
2020-12-07 15:34:29 +01:00
Mathieu Othacehe ad44a9bb02
http: Add evaluation field to hydra-build.
* src/cuirass/http.scm (build->hydra-build): Add "evaluation" field.
2020-12-07 15:13:09 +01:00
Christopher Baines b2c77dd626 database: Fix using sqlite-reset in a few queries.
Rather than calling sqlite-reset before reading the rows, call sqlite-reset
after. I think this is important to stop SQLite getting stuck because the
statement is still live even though it's not being read from after these
procedures return.

Assuming I've got the ordering right, I think using sqlite-fold-right directly
is simpler code as well.

* src/cuirass/database.scm (db-get-builds-by-search, format-build-products,
db-get-events): Rewrite fetching result rows.
2020-12-07 09:44:51 +00:00
Christopher Baines 23d75284bf database: Remove redundant reset calls.
sqlite-prepare will reset cached statements before returning them, so these
sqlite-reset calls are redundant.

* src/cuirass/database.scm (db-get-builds-query-min, db-get-builds-query-max):
Remove sqlite-reset calls.
2020-12-07 09:44:48 +00:00
Christopher Baines 068ad30a27 database: Don't finalise cached statements.
All these statements are cached, but that's pointless if they're finalized
after use, because they'll need recreating on next use.

* src/cuirass/database.scm (%sqlite-exec, db-get-builds-query-min,
db-get-builds-query-max): Replace sqlite-finalize with sqlite-reset.
2020-12-07 09:44:46 +00:00
Mathieu Othacehe 38f48c80da
database: Fix builds pagination.
* src/cuirass/database.scm (db-get-builds): Fix pagination.
2020-12-02 17:18:15 +01:00
Mathieu Othacehe e35eee6a80
database: Rewrite db-get-builds-max and db-get-builds-min.
* src/cuirass/database.scm (db-get-builds-min, db-get-builds-max): Rewrite SQL
queries without nesting.
2020-12-02 17:18:15 +01:00
Mathieu Othacehe fd432b8e8f
Use specification for periodic builds.
When the periodic argument is passed to a job, it will be registered only if
the time difference between the current time and the registration time of the
last build is greater than the specified period. Make sure that the last job
that is searched is part of the same specification.

* src/sql/upgrade-16.sql: New file.
* Makefile.am (dist_sql_DATA): Add it.
* src/schema.sql (Builds_job_name_timestamp): New index.
* src/cuirass/database.scm (db-get-time-since-previous-build): Add
"specification" argument,
(db-register-builds): pass it.
2020-11-25 16:49:22 +01:00
Mathieu Othacehe e0f97e475f
Fix interactive checkout.
This is a work-around: https://issues.guix.gnu.org/44742.

* src/cuirass/base.scm (fetch-inputs): Set "current-error-port" parameter to a
void port to prevent the fetch progression bar to appear.
2020-11-25 10:46:03 +01:00
Mathieu Othacehe 053f92273a
Add periodical build support.
* src/cuirass/database.scm (db-get-time-since-previous-build): New procedure,
(db-register-builds): if the period argument is set, only register builds
which last registration is older than the specified period.
2020-11-25 10:43:18 +01:00
Mathieu Othacehe 3fd0eb154f
Revert "Use a non-blocking socket for store communication."
This reverts commit 387909454c that causes:

2020-11-02T11:05:08 fatal: uncaught exception 'wrong-type-arg' in 'build' fiber!
2020-11-02T11:05:08 exception arguments: ("struct-vtable" "Wrong type argument in position 1 (expecting struct): ~S" (#f) (#f))
In ice-9/boot-9.scm:
  1731:15 12 (with-exception-handler #<procedure 7fb1a93f9930 at ic…> …)
  1736:10 11 (with-exception-handler _ _ #:unwind? _ # _)
    718:2 10 (call-with-prompt ("break") #<procedure 7fb1ab76f440 a…> …)
    718:2  9 (call-with-prompt ("continue") #<procedure 7fb1ab77084…> …)
In ice-9/eval.scm:
    619:8  8 (_ #(#(#<directory (guile-user) 7fb1ac680f00> #<var…> …)))
In srfi/srfi-1.scm:
    634:9  7 (for-each #<procedure 7fb1a9525900 at cuirass/base.scm…> …)
In ice-9/boot-9.scm:
  1731:15  6 (with-exception-handler #<procedure 7fb1a95a94e0 at ic…> …)
  1669:16  5 (raise-exception _ #:continuable? _)
  1764:13  4 (_ #<&compound-exception components: (#<&assertion-fail…>)
In cuirass/utils.scm:
    319:8  3 (_ _ . _)
In ice-9/boot-9.scm:
  1731:15  2 (with-exception-handler #<procedure 7fb1ab2e3720 at ic…> …)
In cuirass/utils.scm:
   320:22  1 (_)
In unknown file:
           0 (make-stack #t)
ERROR: In procedure make-stack:
In procedure struct-vtable: Wrong type argument in position 1 (expecting struct): #f
2020-11-02 11:05:50 +01:00
Ludovic Courtès 387909454c
Use a non-blocking socket for store communication.
Set the store socket as non-blocking so that fibers communicating with the
store don't get blocked as described here: https://issues.guix.gnu.org/43565.

* src/cuirass/base.scm (with-store): Set the store socket as non-blocking.
(build-derivations&): Unset current-read-waiter and current-write-waiter.
2020-10-27 19:00:31 +01:00
Mathieu Othacehe f141dd205a
Use with-db-writer-worker-thread/force macro.
* src/cuirass/database.scm (db-register-builds): Use
"with-db-writer-worker-thread/force" macro.
2020-10-15 10:45:13 +02:00
Mathieu Othacehe df2d13621f
Use the writer worker for all write queries.
* .dir-locals.el: Add "with-queue-writer-worker".
* bin/cuirass.in: Modify "with-queue-writer-worker" scope to include the
web-server operations.
* src/cuirass/database.scm (with-db-writer-worker-thread): Export it.
(with-db-writer-worker-thread/force): New macro.
(db-add-input, db-add-checkout, db-add-specification, db-remove-specification,
db-add-evaluation, db-abort-pending-evaluations, db-set-evaluation-status,
db-set-evaluation-time, db-add-output, db-add-build-product, db-add-event,
db-delete-events-with-ids-<=-to): Use "with-db-writer-worker-thread" or
"with-db-writer-worker-thread/force" instead of "with-db-worker-thread".
* src/cuirass/metrics.scm (db-update-metrics): Ditto.
* tests/database.scm ("db-init"): Set "%db-writer-channel".
* tests/http.scm ("db-init"): Ditto.
* tests/metrics.scm ("db-init"): Ditto.
2020-10-15 09:53:53 +02:00
Mathieu Othacehe a0e70b9d51
Remove unused procedure.
* src/cuirass/base.scm (cancel-old-builds): Remove it.
2020-10-14 18:53:31 +02:00
Mathieu Othacehe 38ee2c5b5b
Fix tests.
This is a follow-up of b67f38a7b9.

* src/cuirass/database.scm (catch-sqlite-error): New macro.
(SQLITE_CONSTRAINT_PRIMARYKEY, SQLITE_CONSTRAINT_UNIQUE, %db-writer-channel):
New variables.
* tests/database.scm (with-temporary-database): Set "%db-writer-channel".
(db-add-build-with-fixed-output): Catch sqlite error.
(db-get-pending-derivations): Do not add builds with duplicated outputs.
2020-10-14 16:28:59 +02:00
Mathieu Othacehe 65e3624bf8
Optimize SQLite database.
* src/cuirass/database.scm (set-db-options): Optimize database parameters.
2020-10-14 14:22:17 +02:00
Mathieu Othacehe b67f38a7b9
Queue write operations.
SQLite only allows one concurrent write query operation. Having multiple
database workers calling "db-update-build-status!", will thus increase worker
starvation. Every write operation will also be done is a single transaction.

For those reasons, create a database worker dedicated to write queries. Have
this worker queue work and issue all the queued work queries in a single
transaction.

* .dir-locals.el: Add with-db-writer-worker-thread.
* src/cuirass/database.scm (with-queue-writer-worker): Rename
"with-registration-workers" macro.
(%db-writer-channel): Rename "%db-registration-channel" variable.
(with-queue-writer-worker): Rename "with-registration-workers".
(db-register-builds): Use "with-db-writer-worker-thread" instead of
"with-db-registration-worker-thread".
(db-update-build-status!): Ditto
* src/cuirass/utils.scm (make-worker-thread-channel): Add "queue-size" and
"queue-proc" arguments.
(call-with-worker-thread): Add "options" argument.
* bin/cuirass.in (main): Use "with-queue-writer-worker" instead of
"with-registration-workers". Modify the macro scope to include all the
possible write operations.
2020-10-14 14:15:09 +02:00
Mathieu Othacehe 514f20a9b5
Update metrics in a single transaction.
* src/cuirass/metrics.scm (db-update-metrics): Update all metrics in a single
transaction.
2020-10-14 13:56:44 +02:00
Mathieu Othacehe 038150a3d0
Register new builds in a single transaction.
Registering an evaluation can cause a large number of write queries using
individual transactions. This is really sub-optimal as commiting a transaction
will often result in a database sync to the disk.

* src/cuirass/database.scm (db-add-build): Do not create a new transaction for
each new build, instead ...
(db-register-builds): ..., create a single transaction per evaluation
registration.
2020-10-14 13:51:57 +02:00
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