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

175 commits

Author SHA1 Message Date
Ludovic Courtès
99d88929a6 'with-store' and 'with-database' and written in terms of 'unwind-protect'.
* src/cuirass/base.scm (with-store): Rewrite using 'unwind-protect'.
* src/cuirass/database.scm (with-database): Likewise.
2018-03-19 22:13:54 +01:00
Ludovic Courtès
e0e2709863 utils: Add 'unwind-protect'.
* src/cuirass/utils.scm (unwind-protect): New macro.
2018-03-19 22:13:18 +01:00
Ludovic Courtès
787969c9af http: Correctly set #:timestamp for non-finished builds.
Fixes a regression introduced in
f083282fd3, whereby we'd return 0 as the
timestamp for everything in /api/queue.

* src/cuirass/http.scm (build->hydra-build): Make 'finished?' a
Boolean.  Move 'bool->int' call in #:finished definition.
2018-03-18 01:06:59 +01:00
Ludovic Courtès
2096ebe63f base: Catch errors in the 'process-build-log' handler.
Previously, when an exception was raised from
'handle-build-event' (e.g., a "database is locked" error), we'd throw,
thereby leaving PORT open and we'd never read from it again.  Thus, the
corresponding 'guix-daemon' process would eventually get stuck in a
'write' call to that socket, and its build processes would stall.

* src/cuirass/base.scm (exception-reporter): New procedure.
(spawn-builds): Use it.
2018-03-18 00:58:19 +01:00
Ludovic Courtès
aa4c778494 base: Move database update from 'evaluate' process to the main process.
Fixes <https://bugs.gnu.org/30618>.
Reported by Andreas Enge <andreas@enge.fr>.

* bin/evaluate.in (fill-job): Remove.
(main): Remove 'database' command-line argument.  Remove DB and its
uses.  Write an (evaluation EVAL JOBS) sexp.
* src/cuirass/base.scm (evaluate)[augment-job]: New procedure.
Use it.  Adjust to read (evaluation EVAL JOBS) sexp.  Call
'db-add-evaluation' and 'db-add-derivation'.
2018-03-01 17:25:14 +01:00
Ludovic Courtès
ad577114dd base: 'spawn-builds' correctly keeps track of remaining builds.
Fixes <https://bugs.gnu.org/30645>.
Reported by Andreas Enge <andreas@enge.fr>.

* src/cuirass/base.scm (spawn-builds): Fix TOTAL vs. COUNT mismatches.
2018-03-01 17:21:44 +01:00
Ludovic Courtès
f083282fd3 http: Return build completion time as #:timestamp when completed.
* src/cuirass/http.scm (build->hydra-build): Set #:timestamp to
  #:stoptime when BUILD is finished.
2018-03-01 15:50:40 +01:00
Ludovic Courtès
be3650d965 database: Indent 'db-get-builds'.
* src/cuirass/database.scm (db-get-builds): Reindent.
2018-03-01 15:49:30 +01:00
Ludovic Courtès
36d7c93119 database: Adjust style of 'assqx-ref'.
* src/cuirass/database.scm (db-get-builds)[assqx-ref]: Rewrite with
'match'.
2018-03-01 15:44:40 +01:00
Ludovic Courtès
5ddd4b97a5 http: 'request-parameters' always returns a list.
* src/cuirass/http.scm (request-parameters): Return the empty list when
QUERY is #f.
2018-03-01 15:40:19 +01:00
Ludovic Courtès
dbea9790d3 http: Fix interpretation of non-numerical parameters.
Fixes a regression introduced in
593cb7be10.

* src/cuirass/http.scm (request-parameters): Fix fallback case in
'match' form.  Previously it would return a procedure in this case, as
returned by (const param), leading to a failure down the road in
'sqlite-bind-arguments' as could be seen by running tests/http.scm.
2018-03-01 15:37:29 +01:00
Ludovic Courtès
a861d7d5bd logging: "Defensive programming" for 'log-monitoring-stats'.
I've seen 'scandir' report #f once, even though that's theoretically
impossible.

* src/cuirass/logging.scm (log-monitoring-stats): Return '() if
'scandir' returns #f.
2018-02-27 14:08:11 +01:00
Danny Milosavljevic
f5a15cab51
database: Fix grouping in db-get-builds.
* src/cuirass/database.scm (db-get-builds): Fix grouping.
2018-02-19 23:01:47 +01:00
Danny Milosavljevic
593cb7be10
http: Interpret id and nr request-parameters as numbers.
* src/cuirass/http.scm (request-parameters): Interpret id and nr parameters as
numbers.
2018-02-19 22:33:28 +01:00
Danny Milosavljevic
7be12b9b0f
database: db-get-builds: Remove debugging output.
* src/cuirass/database.scm (db-get-builds): Remove debugging output.
(db-get-build): Remove debugging output.
2018-02-19 22:28:21 +01:00
Danny Milosavljevic
0f877a1c19
http: Convert build-id URL part to number.
* src/cuirass/http.scm (url-handler): Convert build-id URL part to number.
2018-02-19 22:22:03 +01:00
Danny Milosavljevic
8277233f15
database: db-get-builds: Inline output selection.
* src/cuirass/database.scm (db-get-builds): Inline output selection.
2018-02-19 22:20:23 +01:00
Danny Milosavljevic
1bab5c4e56
database: Simplify 'db-get-builds'.
* src/cuirass/database.scm (db-get-builds): Modify.
(db-get-build): Modify.
2018-02-19 22:13:43 +01:00
Ludovic Courtès
8080c17c21 cuirass: Clear the build queue when starting.
* src/cuirass/base.scm (clear-build-queue): New procedure.
* bin/cuirass.in (main): Call it.
2018-02-14 20:16:35 +01:00
Ludovic Courtès
b71f0cdca5 Revert "http: Process client connections really concurrently."
This reverts commit c47dfdf82b.

Processing connections concurrently would require having separate
database handles.  See
<https://lists.gnu.org/archive/html/guix-devel/2018-02/msg00206.html>.
2018-02-14 16:51:29 +01:00
Ludovic Courtès
1f31134d33 database: Make 'db-add-derivation' idempotent.
* src/cuirass/database.scm (db-add-derivation): Catch 'sqlite-error and
handle SQLITE_CONSTRAINT_PRIMARYKEY.
(SQLITE_CONSTRAINT_UNIQUE): New variable.
* tests/database.scm ("database")["db-add-derivation"]: Add extra call to
'db-add-derivation'.
2018-02-14 16:41:50 +01:00
Ludovic Courtès
c47dfdf82b http: Process client connections really concurrently.
Before that, 'run-server' would force sequential processing of client
requests one after another.

* src/cuirass/http.scm (run-cuirass-server): Rewrite to use its own loop
instead of 'run-server'.
2018-02-10 00:12:06 +01:00
Ludovic Courtès
ef3801b3cc utils: 'non-blocking' forwards exceptions to the calling fiber.
* src/cuirass/utils.scm (%non-blocking): Forward exceptions to the
calling fiber.
2018-02-08 18:46:46 +01:00
Ludovic Courtès
8c7c93922b database: Use argument binding in 'db-get-builds' queries.
That makes it safe from SQL injection.

* src/cuirass/database.scm (db-get-builds): Rewrite to use question
marks in SQL queries and binding through '%sqlite-exec'.
* tests/database.scm ("database")["db-get-builds"]: Exercise 'WHERE'
clauses.
2018-02-08 18:45:03 +01:00
Ludovic Courtès
b0c39b31f6 database: Handle binding directly in 'sqlite-exec'.
The new macro automatically takes care of inserting question marks in
the SQL queries, which in turn guarantees that there are always as many
question marks and arguments.

* src/cuirass/database.scm (sqlite-exec): Rename to...
(%sqlite-exec): ... this.
(sqlite-exec/bind, sqlite-exec): New macros.
(assq-refs): Remove.
(db-add-specification): Use the new 'sqlite-exec' form.
(db-get-specifications): Correctly deal with REV or TAG being #f.
(db-add-derivation, db-get-derivation, db-add-evaluation)
(db-add-build, db-update-build-status!, db-get-outputs)
(db-get-build, db-get-stamp, db-add-stamp): Adjust to the new
'sqlite-exec' form.
2018-02-08 17:35:32 +01:00
Ludovic Courtès
57410b6cc2 base: Account for derivations built behind our back.
Previously any derivation not directly built by Cuirass would be
considered as failed because 'handle-build-event' wouldn't see any build
event.  Here we just make sure the build status recorded in the database
corresponds to reality.

* src/cuirass/base.scm (update-build-statuses!): New procedure.
(spawn-builds): Call it after 'build-derivations&'.
2018-02-08 14:19:19 +01:00
Ludovic Courtès
49ec76487a base: Fix computation of build success/failure.
* src/cuirass/base.scm (build-packages)[register]: Make 'db-add-build' a
tail call.
Fix computation of 'outs'.
2018-02-08 14:19:19 +01:00
Ludovic Courtès
2887b1dfa9 database: 'db-update-build-status!' keeps stoptime unchanged when nothing new.
* src/cuirass/database.scm (db-update-build-status!): And "AND status != ?"
in SQL queries.
* tests/database.scm ("database")["db-update-build-status!"]: Add call
to 'db-update-build-status!'.
2018-02-08 14:19:19 +01:00
Ludovic Courtès
0ff3c23274 base: Explicitly enable #:print-build-trace.
This is purely "defensive programming" since the default value for
'print-build-trace' is currently #t.

* src/cuirass/base.scm (with-store): Pass #:print-build-trace to
'set-build-options'.
2018-02-08 14:19:19 +01:00
Ludovic Courtès
53fcecd25f database: Cache prepared statements.
Suggested by Danny Milosavljevic.

* src/cuirass/database.scm (sqlite-exec): Pass #:cache? to
'sqlite-prepare'.
2018-02-08 14:19:19 +01:00
Danny Milosavljevic
eb01f46987 database: Use 'sqlite-bind' to avoid SQL injection.
* src/cuirass/database.scm (%sqlite-exec): Remove.
(sqlite-exec): Turn back into a procedure.  Use 'sqlite-bind'.  Add
'normalize' procedure and use it.
(db-add-specification, db-add-derivation, db-get-derivation)
(db-add-evaluation, db-add-build, db-update-build-status!)
(db-get-build, db-get-stamp, db-add-stamp): Use question marks in SQL
queries.
* src/cuirass/base.scm (build-packages)[register]: Make #:log
non-false.
* tests/database.scm (make-dummy-job): Add #:job-name, #:system,
 #:nix-name, and #:eval-id.  This is necessary because 'sqlite-bind'
would now translate #f to a real NULL (before it would translate to the
string "#f"...), and would thus report violations of the non-NULL
constraint.

Co-authored-by: Ludovic Courtès <ludo@gnu.org>
2018-02-08 14:18:27 +01:00
Ludovic Courtès
e656f42571 base: Remove useless 'log-message' calls.
* src/cuirass/base.scm (build-packages): Remove useless 'log-message'
calls.
2018-02-05 23:01:26 +01:00
Ludovic Courtès
dd75b5bec9 http: /jobsets returns a list of jobsets.
Reported by Danny Milosavljevic.

* src/cuirass/http.scm (url-handler) <"jobsets"> Return the result of
'db-get-specifications' as-is, not just the car.
2018-02-05 23:01:26 +01:00
Ludovic Courtès
e5220dbed3 base: Log the number of builds performed.
* src/cuirass/base.scm (spawn-builds): Log the number of builds
performed, not the number of remaining builds.
2018-02-05 23:01:26 +01:00
Ludovic Courtès
161d6abef8 base: Work around Fibers I/O scheduling bug.
Works around <https://github.com/wingo/fibers/issues/19>.

The effect in practice would be that we'd usually not reach the
'close-pipe' call in 'evaluate', leaving zombie processes behind us,
never executing the continuation, and additionally spinning fast on a
sequence of epoll_wait/epoll_ctl calls.

* src/cuirass/base.scm <top level>: Monkey-patch (fibers internal).
2018-01-30 23:58:47 +01:00
Ludovic Courtès
e0588239d2 base: Make build log processing non-blocking.
We used to have 'build-derivations' write to the custom binary port
returned by 'build-event-output-port'.  However, custom binary ports
constitute continuation barriers, thereby preventing fibers from being
suspended.

To make build log processing non-blocking, we therefore invert this
inversion of control and use a suspendable I/O procedure,
'read-line/non-blocking', when reading the build log.

* src/cuirass/base.scm (read-line/non-blocking, process-build-log)
(build-derivations&): New procedures.
(%newline, build-event-output-port): Remove.
(spawn-builds): Use 'build-derivations&' instead of 'build-derivations'
with 'build-event-output-port'.
2018-01-29 18:06:47 +01:00
Ludovic Courtès
0bf61ef1ff http: Evaluate DB requests in 'non-blocking'.
* src/cuirass/http.scm (handle-builds-request): Wrap 'db-get-builds'
into 'non-blocking'.
2018-01-29 18:06:47 +01:00
Ludovic Courtès
23fecf8f3d cuirass: Log resource usage statistics regularly.
* src/cuirass/logging.scm (log-monitoring-stats): New procedure.
* bin/cuirass.in (main): Add a fiber that calls it regularly.
2018-01-29 18:06:47 +01:00
Ludovic Courtès
fcd1bc13bc http: /api/queue returns builds sorted by status.
* src/cuirass/database.scm (db-get-builds)[format-order-clause]: Add
'status+submission-time'.
* src/cuirass/http.scm (url-handler) <"queue">: Use it.
2018-01-29 18:06:47 +01:00
Ludovic Courtès
5e959dd8f2 base: 'spawn-builds' shuffles jobs.
* src/cuirass/base.scm (shuffle-jobs): New procedure.
(spawn-builds): Use it.
2018-01-29 18:06:47 +01:00
Ludovic Courtès
1e539e10cc base: 'spawn-builds' logs the beginning of each new batch.
* src/cuirass/base.scm (spawn-builds): Add 'log-message' call.
2018-01-29 18:06:47 +01:00
Ludovic Courtès
0098e613db cuirass: Add 'essential-task' and wrap the main fibers in it.
* src/cuirass/utils.scm (essential-task): New procedure.
* bin/cuirass.in (main): Wrap each fiber in 'essential-task'.
2018-01-27 16:04:31 +01:00
Ludovic Courtès
4558d1c869 http: Reject methods other than GET.
* src/cuirass/http.scm (url-handler): Check whether REQUEST's method is
'GET, and return 405 if not.
2018-01-26 22:41:22 +01:00
Ludovic Courtès
8b26874cac http: Provide the correct values for 'finished' and 'busy'.
This should placate 'guix-hydra-queued-builds', for instance, which
checks these values to choose between "Running" and "Scheduled".

* src/cuirass/http.scm (build->hydra-build): Provide the correct value
for #:finished and #:busy.
2018-01-26 18:28:32 +01:00
Ludovic Courtès
f3335e880c database: Open the database in "write-ahead log" mode.
Suggested by Ricardo Wurmus.

* src/cuirass/database.scm (wal-mode): New procedure.
(db-open): Use it.
2018-01-26 18:21:56 +01:00
Ludovic Courtès
e11bcf926d base: 'build-event-output-port' no longer reads past the buffer.
Fixes a bug whereby 'build-event-output-port' would sometimes read more
than COUNT from BV, which would usually result in a 'decoding-error'
exception from 'utf8->string'.

* src/cuirass/base.scm (build-event-output-port)[write!]: Use
'bytevector-range' to honor COUNT and OFFSET.
2018-01-26 15:56:40 +01:00
Ludovic Courtès
777ef99dd7 utils: Add 'bytevector-range'.
* src/cuirass/utils.scm (%weak-references): New variable.
(bytevector-range): New procedure.
2018-01-26 15:56:12 +01:00
Ludovic Courtès
39cf6e6ed0 base: Make repository fetching and compilation non-blocking.
Previously these calls would effectively suspend execution of all the
fibers until they had completed.

* src/cuirass/base.scm (process-specs): Wrap 'fetch-repository' and
'compile' calls in 'non-blocking'.
2018-01-26 14:43:48 +01:00
Ludovic Courtès
8d44590099 utils: Add 'non-blocking' macro.
* src/cuirass/utils.scm (%non-blocking): New procedure.
(non-blocking): New macro.
2018-01-26 14:43:29 +01:00
Ludovic Courtès
5d559f8021 logging: Add 'with-time-logging' and use it.
* src/cuirass/logging.scm (call-with-time-logging): New procedure.
(with-time-logging): New macro.
* src/cuirass/http.scm (handle-builds-request): Use it.
2018-01-26 14:17:18 +01:00