Commit Graph

416 Commits

Author SHA1 Message Date
Ludovic Courtès e8cfbe6799 evaluate: Do not load Guix/Cuirass modules upfront.
This avoids a situation whereby, when evaluating from a Guix checkout,
we'd have already loaded slightly different and incompatible (guix …)
modules.

Hydra's 'hydra-eval-guile-jobs' implemented the same solution as in this
patch already.

* bin/evaluate.in: Remove use of (cuirass …) and (guix …) modules.
(ref): New procedure.
(with-directory-excursion): New macro.
(main): Use 'ref'.  Remove uses of Guix or Cuirass modules.
2018-04-09 00:40:54 +02:00
Ludovic Courtès 2ba45edf2f base: Pass the correct load path to the 'evaluate' command.
The previous load path was potentially incorrect since commit
2fe7ff87e2.

* src/cuirass/base.scm (evaluate)[tokenize, load-path]: New variables.
Assume #:load-path is colon-separated.  Pass LOAD-PATH as the second
argument to 'evaluate'.
* doc/cuirass.texi (Database): Adjust documentation.
2018-04-07 18:33:27 +02:00
Ludovic Courtès a3a7c09b06 evaluate: Honor the given load path.
* bin/evaluate.in (main): Prepend LOAD-PATH to '%load-path' for the
dynamic extend of the 'primitive-load' call.
2018-04-07 18:17:12 +02:00
Ludovic Courtès b9b53e67ba evaluate: Really support 'build-derivations' RPCs.
Fixes a thinko introduced in
1872dd9525.

* bin/evaluate.in (main): Make sure 'real-build-things' is bound.
2018-04-07 18:14:38 +02:00
Ludovic Courtès 38d367d71c evaluate: Really pass arguments like Hydra.
* bin/evaluate.in (main): Use SPEC's #:name as a key in ARGS.
* examples/random-jobs.scm (make-random-jobs): Adjust accordingly.
2018-04-06 10:43:23 +02:00
Ludovic Courtès 074b9d02f1 base: Let sqlite handle deduplication of the list of pending derivations.
Previously we would make a SQL query that would return many build jobs,
and then call 'delete-duplicates' on that.  This was extremely wasteful
because the list of returned by the query was huge leading to a heap of
several tens of GiB on a big database, and 'delete-duplicates' would
lead to more GC and it would take ages.

Furthermore, since 'delete-duplicates' is written in C as of Guile
2.2.3, it is uninterruptible from Fiber's viewpoint.  Consequently, the
kernel thread running the 'restart-builds' fiber would never schedule
other fibers, which could lead to deadlocks--e.g., since fibers are
scheduled on a circular shuffled list of kernel threads, once every N
times, a web server fiber would be sent to that kernel thread and not be
serviced.

* src/cuirass/base.scm (shuffle-jobs): Remove.
(shuffle-derivations): New procedure.
(spawn-builds): Take a list of derivations instead of a list of jobs.
(restart-builds): Remove 'builds' parameter.  Remove 'delete-duplicates'
call.  Remove done/remaining partitioning.
(build-packages): Adjust to pass 'spawn-builds' a list of derivations.
* bin/cuirass.in (main): Remove computation of PENDING.  Remove second
parameter in call to 'restart-builds'.
2018-04-05 22:25:02 +02:00
Ludovic Courtès fc24ca2eac database: Add 'db-get-pending-derivations'.
* src/cuirass/database.scm (db-get-pending-derivations): New procedure.
* tests/database.scm ("database")["db-get-pending-derivations"]: New test.
2018-04-05 22:15:20 +02:00
Ludovic Courtès 2feb3b8100 evaluate: Pass the file name and revision to the user procedure.
* bin/evaluate.in (main): Always pass an alist as the arguments to PROC,
containing at least 'file-name' and 'revision'.
* examples/random-jobs.scm (make-random-jobs): Display 'file-name' and
'revision' from ARGUMENTS.
2018-04-05 17:47:11 +02:00
Ludovic Courtès f090c0f478 utils: Add critical sections.
* src/cuirass/utils.scm (make-critical-section)
(call-with-critical-section): New procedures.
(with-critical-section): New macro.
* src/cuirass/http.scm (with-database-access): Remove.
(handle-build-request, handle-builds-request, url-handler): Use
'with-critical-section' instead of 'with-database-access'.
(run-cuirass-server): Remove 'spawn-fiber' call.  Use
'make-critical-section' instead.
2018-04-02 22:25:23 +02:00
Ludovic Courtès 543709fbca base: Do not resort to Coreutils' "chmod".
* src/cuirass/base.scm (make-writable-copy)[chmod+w]: New procedure.
Replace 'system*' call with 'file-system-fold' call.
2018-04-01 23:15:08 +02:00
Ludovic Courtès 2fe7ff87e2 base: Make a writable copy of the checkout only when #:no-compile? is false.
This avoids copying things back and forth.

* src/cuirass/base.scm (fetch-repository): Add #:writable-copy?
parameter.  Call 'make-writable-copy' when it's true.
(copy-repository-cache): Remove.
(make-writable-copy): New procedure.
(evaluate): Add 'source' parameter and pass it to the 'evaluate' program.
(process-specs): Define 'compile?'.  Pass #:writable-copy? to
'fetch-repository'.  Remove call to 'copy-repository-cache'.  Remove
computation of the checkout directory name.  Pass CHECKOUT to 'evaluate'.
* bin/evaluate.in (main): Replace 'cachedir' with 'source'.  Remove
computation of the checkout directory name.
2018-04-01 23:07:02 +02:00
Ludovic Courtès 8eefd24672 database: 'db-get-builds' honors 'status+submission-time' ordering again.
Fixes a regression introduced in
1bab5c4e56 whereby the
'status+submission-time' order would no longer be honored.

As a result, /api/queue would return the queue ordered by build IDs,
making it largely useless.

* src/cuirass/database.scm (db-get-builds): Remove 'order' and rename
'order-column-name' to 'order'.  Add case for 'status+submission-time'.
* tests/database.scm ("database")["db-get-builds"]: Move below
"db-update-build-status!" test.  Add case for the
'status+submission-time' order.
2018-03-29 15:30:57 +02:00
Ludovic Courtès 8bdde878c7 http: Process client connections really concurrently, again.
This reinstates c47dfdf82b and fixes the
issues that led to the revert in
b71f0cdca5.

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'.  Spawn a database fiber.
(with-database-access): New macro.
(handle-build-request): Expect 'db-channel' and use 'with-database-access'.
(handle-builds-request): Likewise.
(url-handler): Likewise.
2018-03-28 22:41:12 +02:00
Ludovic Courtès e8543d7aa9 base: Add 'cancel-old-builds'.
* src/cuirass/base.scm (cancel-old-builds): New procedure.
2018-03-28 12:14:49 +02:00
Ludovic Courtès 1872dd9525 evaluate: Tolerate calls to 'build-things' during evaluations.
* bin/evaluate.in (main): 'build-things' replacement no longer calls 'exit'.
2018-03-28 12:13:58 +02:00
Ludovic Courtès 326264c8e9 database: Set a 'busy_timeout' to handle concurrent accesses.
Fixes a bug whereby some fibers would get a SQLITE_BUSY exception while
accessing the database: see
<https://debbugs.gnu.org/cgi/bugreport.cgi?bug=30644#26>.

Suggested by Danny Milosavljevic <dannym@scratchpost.org>.

* src/cuirass/database.scm (wal-mode): Rename to...
(set-db-options): ... this.  Add call to 'sqlite-exec' for
'busy_timeout'.
2018-03-25 00:09:33 +01:00
Ludovic Courtès c57fe3622d cuirass: Line-buffer stdout and stderr.
* bin/cuirass.in (main): Add 'setvbuf' calls.
2018-03-25 00:09:29 +01:00
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 4ab2f2c3f0 build: Clean cuirass.go.
* Makefile.am (CLEANFILES): Add $(nodist_guilesite_DATA).
2018-02-15 10:27:12 +01:00
Ludovic Courtès a7693f4974 build: Install (web server fiberized) in its right place.
Previously it would be installed under cuirass/.

* Makefile.am (webmoduledir, webobjectdir): New variables.
(dist_pkgmodule_DATA): Remove src/web/server/fiberized.scm.
(dist_webmodule_DATA, nodist_webobject_DATA): New variables.
(CLEANFILES): Add $(nodist_webobject_DATA).
2018-02-15 10:25:19 +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 bc723b0835 examples: random: Make store file names more distinguishable.
* examples/random-jobs.scm (random-derivation): Add 'suffix' parameter
and honor it.
(make-random-jobs): Pass a non-empty suffix to 'random-derivation'.
2018-02-14 20:15:19 +01:00
Ludovic Courtès db27955ad3 sql: Add indices to speed up common queries.
* src/schema.sql: Add indices.
2018-02-14 20:14:28 +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 5425639271 examples: random: Make derivations a bit more random.
* examples/random-jobs.scm (random-derivation): Tweak the computation of
SEED.  Actually use the new random state.
2018-02-08 14:19:19 +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 5d60d9c4eb examples: random: Make the job name a symbol.
* examples/random-jobs.scm (make-job): Add '.' in #:job-name.
2018-02-08 14:19:19 +01:00