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

330 commits

Author SHA1 Message Date
Clément Lassieur 6f8dc0b616
database: Use SQLite in Multi-thread mode.
This disables mutexing on database connection and prepared statement objects,
thus making us responsible for serializing access to database connections and
prepared statements.  It may result in a performance improvement.

* src/cuirass/database.scm (db-init, db-open): Pass the SQLITE_OPEN_NOMUTEX
flag to SQLITE-OPEN.
2018-07-20 15:19:23 +02:00
Clément Lassieur 7b2f9e0de1
Add support for multiple inputs.
* Makefile.am (dist_sql_DATA): Add src/sql/upgrade-1.sql.
* bin/cuirass.in (show-help, %options, main): Remove the LOAD-PATH option that
was used afterwards as %GUIX-PACKAGE-PATH.
* bin/evaluate.in (absolutize, input-checkout, spec-source, spec-load-path,
spec-package-path, format-checkouts): New procedures.
(%not-colon): Remove variable.
(main): Take the load path, package path and PROC from the checkouts that
result from the inputs.  Format the checkouts before sending them to the
procedure.  Remove the LOAD-PATH argument.
* doc/cuirass.texi (Overview, Database schema): Document the changes.
* examples/{guix-jobs.scm, hello-git.scm, hello-singleton.scm,
hello-subset.scm, random.scm}: Adapt to the new specification format.
* examples/guix-track-git.scm (package->spec): Rename to PACKAGE->INPUT.
(package->git-tracked): Replace FETCH-REPOSITORY with FETCH-INPUT and handle
the new format of its return value.
* examples/random-jobs.scm (make-random-jobs): Rename RANDOM to CHECKOUT.
Rename the checkout from 'random (which is a specification) to 'cuirass (which
is a checkout resulting from an input).
* src/cuirass/base.scm (fetch-repository): Rename to fetch-input.  Rename SPEC
to INPUT.  Return a checkout object instead of returning two values.
(evaluate): Take a list of CHECKOUTS and COMMITS as arguments, instead of
SOURCE.  Remove TOKENIZE and LOAD-PATH.  Pass the CHECKOUTS instead of the
SOURCE to "evaluate".  Remove %GUIX-PACKAGE-PATH.  Build the EVAL object
instead of getting it from "evaluate".
(compile?, fetch-inputs, compile-checkouts): New procedures.
(process-specs): Fetch all inputs instead of only fetching one repository.
The result of that fetching operation is a list of CHECKOUTS whose COMMITS are
used as a STAMP.
(%guix-package-path, set-guix-package-path): Remove them.
* src/cuirass/database.scm (db-add-input, db-get-inputs): New procedures.
(db-add-specification, db-get-specifications): Adapt to the new specification
format.  Add/get all inputs as well.
(db-add-evaluation): Rename REVISION to COMMITS.  Store COMMITS as space
separated commit hashes.
(db-get-builds): Rename REPO_NAME to NAME.
(db-get-stamp): Rename COMMIT to STAMP.  Return #f when there is no STAMP.
(db-add-stamp): Rename COMMIT to STAMP.  Deal with DB-GET-STAMP's new return
value.
(db-get-evaluations): Rename REVISION to COMMITS.  Tokenize COMMITS.
* src/cuirass/utils.scm (%non-blocking): Export it.
* src/schema.sql (Inputs): New table that refers to the Specifications table.
(Specifications): Move input related fields to the Inputs table.  Rename
REPO_NAME to NAME.  Rename ARGUMENTS to PROC_ARGS.  Rename FILE to PROC_FILE.
Add LOAD_PATH_INPUTS, PACKAGE_PATH_INPUTS and PROC_INPUT fields that refer to
the Inputs table.
(Stamps): Rename REPO_NAME to NAME.
(Evaluations): Rename REPO_NAME to NAME.  Rename REVISION to COMMITS.
(Specifications_index): Replace with Inputs_index.
* src/sql/upgrade-1.sql: New file.
* tests/database.scm (example-spec, make-dummy-eval, sqlite-exec): Adapt to
the new specifications format.  Rename REVISION to COMMITS.
* tests/http.scm (evaluations-query-result, fill-db): Idem.
2018-07-16 21:33:14 +02:00
Clément Lassieur be713f8a30
database: Call a specification 'jobset' instead of 'project'.
This removes the possibility to filter specifications by branch, because
branches were previously called 'jobset'.  But it doesn't matter because later
on, specifications will have as many branches as inputs.  And people should
filter by specification name instead.

* doc/cuirass.texi (Build Information, Latest builds): Remove 'jobset',
replace 'project' with 'jobset'.
* src/cuirass/http.scm (build->hydra-build): Idem.
* tests/database.scm (db-get-builds): Idem.
* tests/http.scm (build-query-result, /api/latestbuilds?nr=1&jobset=guix,
/api/latestbuilds?nr=1&jobset=gnu): Idem.
* src/cuirass/database.scm (db-format-build, db-get-builds): Don't associate
builds with branches (which were called 'jobset' afterwards).
(db-get-builds): Remove the #:project filter.
2018-07-14 21:35:14 +02:00
Clément Lassieur 03c4095f0a
database: Add support for database upgrades.
* src/cuirass/database.scm (%package-sql-dir): New parameter.
(db-load, db-schema-version, db-set-schema-version, latest-db-schema-version,
schema-upgrade-file, db-upgrade): New procedures.
(db-init): Set version corresponding to the existing upgrade-n.sql files.
(db-open): If database exists, upgrade it.
2018-07-14 21:35:13 +02:00
Clément Lassieur cc078a0e98
utils: Reset the Fiber dynamic environment in %NON-BLOCKING.
* src/cuirass/utils.scm (%non-blocking): Wrap body in PARAMETERIZE form that
clears CURRENT-FIBER.

So that PUT-MESSAGE doesn't try to suspend itself within CALL-WITH-NEW-THREAD.
See https://lists.gnu.org/archive/html/guile-devel/2018-07/msg00009.html.
2018-07-14 13:21:56 +02:00
Clément Lassieur 14f310f3b3
evaluate: Use a generic key to identify Cuirass arguments.
So that Cuirass specifications used to build 'guix-modular' can be named
differently than "guix" and "guix-modular" (see Guix's
build-aux/hydra/guix-modular.scm).

The name is used as a primary key, so before that commit, it was also
impossible to have several such specifications.

This is a workaround, Cuirass should normally support several inputs per
specification, as Hydra does.  The specification's name would then only be
used to identify it.  See <https://bugs.gnu.org/31813>.

* bin/evaluate.in (main): Replace custom NAME (passed to PROC) with 'guix'.

Co-authored-by: Mathieu Othacehe <m.othacehe@gmail.com>
2018-06-18 17:58:34 +02:00
Mathieu Othacehe 85a373f639 http: Reverse evaluations list.
* src/cuirass/database.scm (db-get-evaluations): Reverse returned evaluations
list.
2018-04-23 11:28:37 +02:00
Mathieu Othacehe c40e61bd3e
http: Add /api/evaluations route.
* src/cuirass/database.scm (db-get-evaluations): New exported procedure.
* src/cuirass/http.scm (url-handler): Add /api/evaluations route.
* tests/http.scm ("http"): Add /api/evaluations test route.
2018-04-19 11:17:42 +02:00
Ludovic Courtès 238f856e48 database: Adjust index to speed up /api/queue queries.
* src/schema.sql: Extend 'Builds_Derivations_index' to account for
/api/queue queries.
2018-04-10 17:21:06 +02:00
Ludovic Courtès 43be95c40a Use the 2.2 'setvbuf' API style.
* bin/cuirass.in (main): Use the 2.2 'setvbuf' API style.
* examples/guix-track-git.scm (current-error-port): Likewise.
2018-04-09 11:08:06 +02:00
Ludovic Courtès 2f37403606 base: 'spawn-builds' really builds by chunks.
Fixes a regression introduced in
074b9d02f1 whereby we'd attempt to build
all of DRV at once.

* src/cuirass/base.scm (spawn-builds): Pass BATCH, not DRV, to
'build-derivations&' and to 'update-build-statuses!'.
2018-04-09 11:06:46 +02:00
Ludovic Courtès 297b29190e evaluate: Change '%load-path' once and for all.
* bin/evaluate.in (main): Do not restore the original '%load-path'.
2018-04-09 10:34:58 +02:00
Ludovic Courtès c2298d440b evaluate: Leave GUILE_LOAD_PATH unchanged.
Previously we'd systematically add the first argument to the search
path.  When that first argument was the empty string (as with the
'guix-modular' jobset), we'd thus add the current directory to the
search path, even if the intent was to leave the load path unchanged.

Furthermore, a3a7c09b06 changed load-path
handling to be explicit in Scheme.

* bin/evaluate.in: Remove GUILE_LOAD_PATH assignment.
2018-04-09 09:59:27 +02:00
Ludovic Courtès ce40561204 evaluate: Change directory to SOURCE.
* bin/evaluate.in (with-directory-excursion): Remove.
(main): chdir to SOURCE.
2018-04-09 01:01:19 +02:00
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