Commit Graph

475 Commits

Author SHA1 Message Date
Mathieu Othacehe f2984c7230
Use Guile-zlib package.
* README (Requirements): Add Guile-zlib.
* build-aux/guix.scm: Ditto.
* src/cuirass/base.scm: Use Guile-zlib instead of (guix zlib).
2020-08-25 16:33:09 +02:00
Mathieu Othacehe 1bcccbab76
web: server: Remove with-ignored-disconnects.
Use the pre-unwind-handler of a catch clause instead of nesting
with-throw-handler inside a catch clause.

* src/web/server/fiberized.scm (with-ignored-disconnects): Remove it,
(client-loop): replace "with-ignored-disconnects" with a catch clause.
2020-08-04 18:14:51 +02:00
Mathieu Othacehe 0abf19203f
web: server: Ignore all client disconnects.
EPIPE and ECONNRESET errors are already ignored when thrown by "sendfile" and
"put-bytevector" procedures. It turns out "peek-char" can also cause such
errors. So ignore such errors within the whole procedure.

* src/web/server/fiberized.scm (client-loop): Wrap the whole procedure inside
"with-ignored-disconnects" instead of wrapping individually "sendfile" and
"put-bytevector" calls.
2020-08-04 16:05:56 +02:00
Mathieu Othacehe d250a95c46
http: Fix typo in request-parameters.
This is a follow-up of 2094d68053.

* src/cuirass/http.scm (request-parameters): Fix typo.
2020-08-03 15:36:03 +02:00
Mathieu Othacehe 2094d68053
http: Handle request parameters with no value.
Handle requests such as "/build/?nr" by ignoring parameters without any
associated value.

* src/cuirass/http.scm (request-parameters): Ignore silently parameters
without an associated value.
* tests/http.scm: Add a corresponding test case.
2020-08-03 15:27:00 +02:00
Mathieu Othacehe 410d386ea8
tests: http: Add some erroneous routes.
* tests/http.scm: Add new test cases covering some erroneous routes.
2020-08-03 14:48:45 +02:00
Mathieu Othacehe d3329551fe
http: Fix string concatenation.
This is a follow-up of 614ea05767.

* src/cuirass/http.scm (url-handler): Fix string concatenation.
2020-08-02 19:18:25 +02:00
Mathieu Othacehe 614ea05767
http: Rationalize build id conversion.
* src/cuirass/http.scm (url-handler): Handle the id -> number conversion
directly in the route declaration.
2020-08-02 18:39:35 +02:00
Mathieu Othacehe 59c974134f
http: Handle wrong build number on log route.
* src/cuirass/http.scm (url-handler): Handle erroneous id -> number conversion
on "/build/id/log/raw" route.
2020-08-02 18:34:19 +02:00
Mathieu Othacehe ce89a40ed8
http: Handle wrong build number on details route.
The request "/build/2465370mdb%22fx'ggx/details" causes a select query on the
whole Builds table, because failed "string->number" conversion is not handled.

* src/cuirass/http.scm (url-handler): Handle erroneous id -> number conversion
on "/build/id/details" route.
2020-08-02 18:30:37 +02:00
Mathieu Othacehe 769682924c
http: Handle wrong build number.
The request "/build/1234)" causes a select query on the whole Builds table,
because failed "string->number" conversion is not handled.

* src/cuirass/http.scm (url-handler): Handle erroneous id -> number conversion
on "/build/id" route.
2020-08-02 15:50:59 +02:00
Mathieu Othacehe 153b49c952
database: Warn if the worker is busy for more than 5 seconds.
* src/cuirass/utils.scm (with-operation, get-message-with-timeout): New
procedures,
(call-with-worker-thread): add timeout and timeout-proc arguments.
* src/cuirass/database.scm (with-db-worker-thread): Pass a 5 seconds timeout
to call-with-worker-thread, and print a debug message on timeout expiration.
2020-08-01 13:18:38 +02:00
Mathieu Othacehe 1dbd1b592e
web: Ignore errors within put-bytevector.
* src/web/server/fiberized.scm (with-ignored-disconnects): New macro
factorizing the catch clause ignoring client disconnection related errors. Use
it for both "sendfiles" and "put-bytevector" procedures.
2020-07-31 10:52:38 +02:00
Mathieu Othacehe a24bed0b1f
web: Add monitoring fiber.
* bin/cuirass.in (main): Add monitoring fiber in web mode.
2020-07-31 10:42:44 +02:00
Mathieu Othacehe 0955a11abd
web: server: Handle client disconnection.
* src/web/server/fiberized.scm (client-loop): Catch EPIPE and ECONNRESET
errors than can be thrown if the client disconnects prematurely.
2020-07-29 19:36:51 +02:00
Mathieu Othacehe 6ad9c60269
utils: Do not block the calling fiber.
Setting current-fiber to #f in %non-blocking will prevent put-message in the
new thread to try suspending itself, but will also cause the same behavior on
get-message, which is not desired.

* src/cuirass/utils.scm (%non-blocking): Reduce the scope of current-fiber
parameter to the newly created thread.
2020-07-29 19:36:45 +02:00
Mathieu Othacehe e41327350d
http: Handle error on /download.
* src/cuirass/http.scm (url-handler): Handle the error case on /download
route.
2020-07-28 18:14:08 +02:00
Mathieu Othacehe f71f026a41
templates: Handle missing input case.
It happens that some left-over checkout entries refer to removed inputs. In
that case, input will be #f, causing commit-hyperlink to fail with the
following error message:

In cuirass/http.scm:
   475:25  9 (url-handler _ _)
    193:3  8 (evaluation-html-page ((#:id . 5103) (# . 0) (# . 39) ?) ?)
In cuirass/templates.scm:
   612:14  7 (evaluation-build-table _ #:checkouts _ #:inputs _ # _ # ?)
In srfi/srfi-1.scm:
   586:17  6 (map1 (((#:commit . "3a3e9f2bb586e79a7931163f0191d?") ?)))
In cuirass/templates.scm:
   621:39  5 (_ _)
   584:15  4 (commit-hyperlink #f "3a3e9f2bb586e79a7931163f0191df615?")
In web/uri.scm:
   308:23  3 (string->uri _)
   278:14  2 (string->uri-reference _)
In unknown file:
           1 (regexp-exec #<regexp 7f3a76c05980> #f #<undefined> #<u?>)
In ice-9/boot-9.scm:
  1669:16  0 (raise-exception _ #:continuable? _)
In procedure regexp-exec: Wrong type argument in position 2 (expecting string): #f

* src/cuirass/templates.scm (evaluation-build-table): Do not call
"commit-hyperlink" if the matching input could not be found.
2020-07-26 17:28:03 +02:00
Mathieu Othacehe 17395e85d2
Fix spec reading when restarting builds.
When "spawn-builds" is called to restart builds, the spec is not known,
preventing build products from being created as reported here:

https://issues.guix.gnu.org/42523

Fix this issue by reading the specification in database in
"set-build-successful!" procedure.

* src/cuirass/database.scm (db-get-specification): New exported procedure,
(db-get-specifications): add an optional name argument.
* tests/database.scm (db-get-specification): Add a corresponding test-case.
* src/cuirass/base.scm (set-build-successful!): Remove spec argument and read
it directly from database instead,
(update-build-statuses!): also remove spec argument, adapt
set-build-successful! call accordingly,
(spawn-builds): remove spec argument and adapt handle-build-event and
update-build-statuses! calls accordingly,
(handle-build-event): remove spec argument, adapt
set-build-successful! call accordingly,
(build-packages): remove spec argument, adapt spawn-builds call accordingly,
(process-specs): adapt build-packages call.
2020-07-25 14:22:20 +02:00
Mathieu Othacehe d11ce40a10
navbar: Fix typo.
* src/cuirass/templates.scm (html-page): Turn "Latest builds" into "Running
builds".
2020-07-03 08:36:27 +02:00
Mathieu Othacehe 136a8295e4
Add "latest builds" support.
Add a "status" dropdown menu in the navigation bar. For now this menu only
contains one item, a link to the "latest builds" page at "/status" location.

* src/cuirass/database.scm (db-get-builds): Add support for 'started status.
* src/cuirass/http.scm (url-handler): Add "/status" route.
* src/cuirass/templates.scm (running-builds-table): New procedure,
(html-page): add a dropdown menu containing one item, a link to "/status"
route defined above.
* src/static/css/cuirass.css: Add new class to allow bootstrap dropdown menus
to work without javascript plugin.
2020-07-02 21:07:30 +02:00
Mathieu Othacehe 882393dee0
Add debug log.
* src/cuirass/base.scm (create-build-outputs): Add a debug message.
2020-06-30 16:57:10 +02:00
Mathieu Othacehe 83e79f38c8
database: Ignore BuildProducts duplicates.
Ignore errors when trying to insert an already existing build product.

* src/cuirass/database.scm (db-add-build-product): Ignore insertion errors.
2020-06-30 15:02:06 +02:00
Mathieu Othacehe 4dd9664bf9
Factorize build products creation.
Make sure that build products are also created when a batch of derivations
finishes, and not only when single build success events are received.

Factorize build status update to success and build products creation into a
single procedure.

* src/cuirass/base.scm (set-build-successful!): New procedure,
(update-build-statuses!): call it here,
(handle-build-event): and here.
2020-06-29 17:32:04 +02:00
Mathieu Othacehe 91204db33a
Check for derivation before creating build products.
It happens that we receive build succeeded notifications for derivations that
are not stored in the Builds table. In that case, do not try to create build
products.

* src/cuirass/base.scm (handle-build-event): Check if the derivation is
registered in the Builds table.
2020-06-26 10:32:00 +02:00
Mathieu Othacehe 300f6253f6
http: Display gzipped log files in the browser.
This is a follow-up of 2280ae18eb. The gzipped
log files are supposed to be displayed directly in the browser and not
downloaded. Set "Content-Disposition" header to "inline" to ensure that.

* src/cuirass/http.scm (respond-gzipped-file): Set to "Content-Disposition" to
"inline".
2020-06-23 14:02:42 +02:00
Mathieu Othacehe 10b16ec092
Create build products as soon as the build succeeded.
When searching for successful builds in Cuirass, it is expected that the build
products are already available. Hence, make sure that build products are
computed before the build is marked as successful.

* src/cuirass/base.scm (spawn-builds): Add a spec argument,
(handle-build-event): ditto, and call create-build-outputs when the
build-succeeded event is received,
(create-build-outputs): take a single build argument instead of a builds list
and adapt accordingly,
(build-packages): pass spec argument to spawn-builds and remove
create-build-outputs call.
2020-06-22 14:40:33 +02:00
Mathieu Othacehe 61cc56f6cc
http: Add /search/latest and /search/latest/<product-type> routes.
* src/cuirass/http.scm (url-handler): Add "/search/latest" and
"/search/latest/<product-type>" routes.
2020-06-21 12:56:50 +02:00
Mathieu Othacehe 3db603c191
http: Add build products support to the API.
* src/cuirass/http.scm (build->hydra-build)[build-products]: New variable,
added to "buildproducts" field.
* tests/http.scm (build-query-result): Adapt accordingly.
2020-06-14 18:45:38 +02:00
Mathieu Othacehe c2aed4a5c1
templates: Add build product type.
* src/cuirass/templates.scm (build-details): Display build product type.
2020-06-14 12:55:37 +02:00
Christopher Baines 76ec2967bc Add missing sql upgrade-8.sql file.
* Makefile.am (dist_sql_DATA): Add src/sql/upgrade-8.sql.
2020-06-13 16:59:44 +01:00
Christopher Baines 7f71d9b7ce sql: Add a couple of indexes.
Remove the Builds_index from the schema, as it would have been removed in
error by the upgrade-6 upgrade.  Add a specific index on the Builds status
field, as this helps with db-get-builds queries, and add an index on the
Outputs derivation field, as this helps with the db-get-outputs part of
db-get-builds.

* src/sql/upgrade-8.sql: New file.
* src/schema.sql: Update accordingly.
2020-06-13 16:02:59 +01:00
Mathieu Othacehe 2280ae18eb
cuirass: Use sendfiles instead of raw copies.
* src/cuirass/http.scm (respond-file): Send the file name as 'x-raw-file
header argument, instead of the raw file content,
(respond-gzipped-file): ditto. Also set 'content-disposition header.
* src/web/server/fiberized.scm (strip-headers, with-content-length): New procedures,
(client-loop): Check if 'x-raw-file is set. If it's the case, use sendfiles to
send the given file. Otherwise, keep the existing behaviour and send directly
the received bytevector.
2020-06-10 16:42:21 +02:00
Mathieu Othacehe f44618fc79
Add support for build products downloading.
* src/sql/upgrade-7.sql: New file.
* Makefile.am: Add it.
* src/cuirass/base.scm (create-build-outputs): New procedure,
(build-packages): call it,
(process-spec): add the new spec argument and pass it to create-build-outputs.
* src/cuirass/database.scm (db-add-build-product, db-get-build-product-path,
db-get-build-products): New exported procedures.
* src/cuirass/http.scm (respond-static-file): Move file sending to ...
(respond-file): ... this new procedure,
(url-handler): add a new "download/<id>" route, serving the requested file
with the new respond-file procedure. Also gather build products and pass them
to "build-details" for "build/<id>/details" route.
* src/cuirass/templates.scm (build-details): Honor the new "products" argument
to display all the build products associated to the given build.
* src/schema.sql (BuildProducts): New table,
(Specifications)[build_outputs]: new field.
* tests/database.scm: Add empty build-outputs spec.
* tests/http.scm: Ditto.
* examples/guix-jobs.scm: Ditto.
* examples/hello-git.scm: Ditto.
* examples/hello-singleton.scm: Ditto.
* examples/hello-subset.scm: Ditto.
* examples/random.scm: Ditto.
* doc/cuirass.texi (overview): Document it.
2020-06-10 16:42:21 +02:00
Christopher Baines 78986d9623 database: Begin tuning db-get-builds for performance.
This commit does several things, the big change is to try and construct a
simpler query for SQLite. I'm not confident that SQLite's query planner can
look past handling the NULL parameters, so I think it could be helpful to try
and create a simpler query, both to avoid that problem if it exists, but also
move the complexity in to Guile code, which I think is a bit more manageable.

The way ordering is handled is also changed. Order is one of the filters,
although it's not a filter, and some of the other filters also influenced the
order. I think there are things still to fix/improve with the handling of
ordering, but at least this commit just has the ordering happen once in the
query.

* src/cuirass/database.scm (filters->order): Remove procedure, inline in to
db-get-builds.
(db-get-builds): Change query generation in an attempt to make it easier to
tune the queries for performance.
2020-06-09 19:58:29 +01:00
Christopher Baines 9265949cf6 cuirass: Perform some database "optimization" at startup.
Add a "optimize" step that occurs when starting up the main Curiass
process. Currently this does two things, but could be extended to do more.

The "PRAGMA optimize;" command prompts SQLite to ANALYZE tables where that
might help. The "PRAGMA wal_checkpoint(TRUNCATE);" command has SQLite process
any unprocessed changes from the WAL file, then truncate it to 0 bytes. I've
got no data to suggest this helps with performance, but I'm hoping that going
from a large WAL file to a small one occasionally might be useful.

* src/cuirass/database.scm (db-optimize): New procedure.
* bin/cuirass.in (main): Run it.
2020-05-25 11:08:20 +01:00
Christopher Baines 68a6912ce2 build-aux: Update for Guile 3.
* build-aux/guix.scm (arguments): Change 2.2 to 3.0.
(inputs): Change guile@2.2 to guile.
2020-05-25 11:05:27 +01:00
Ludovic Courtès 9559fd18d4 templates: Evaluation page links to VCS web view.
* src/cuirass/templates.scm (%vcs-web-views): New variable.
(commit-hyperlink): New procedure.
(evaluation-build-table): Use it in the input/commit table.
2020-04-17 15:07:17 +02:00
Ludovic Courtès c961de2f63 templates: Evaluation page shows each input and commit.
* src/cuirass/database.scm (db-get-inputs, db-get-checkouts): Export.
* src/cuirass/http.scm (evaluation-html-page): Pass #:checkouts and
 #:inputs to 'evaluation-build-table'.
* src/cuirass/templates.scm (evaluation-build-table): Add #:checkouts
and #:inputs.  Emit a table with "Input" and "Commit" columns.
2020-04-17 15:07:17 +02:00
Ludovic Courtès ae8c067d19 database: Add missing (ice-9 threads) import.
This is required on Guile 3 for 'current-processor-count'.

* src/cuirass/database.scm: Use (ice-9 threads).
2020-04-17 15:07:17 +02:00
Ludovic Courtès 7744583920 templates: 'time->string' doesn't show timezone for old builds.
* src/cuirass/templates.scm (time->string): Remove ~z for old builds.
2020-04-17 15:07:17 +02:00
Ludovic Courtès 9b40113ec2 templates: Fix typo in 'time->string'.
This is a followup to a1d353b152.
Until now we'd never display the year.

* src/cuirass/templates.scm (time->string): Check for (= year current).
2020-04-17 15:07:17 +02:00
Ricardo Wurmus 27af1d3464
templates: html-page: Fix indentation.
* src/cuirass/templates.scm (html-page): Fix indentation.
2020-04-15 19:54:38 +02:00
Ricardo Wurmus 6aef31bd93
templates: Display search hints.
* src/static/css/cuirass.css: New file.
* Makefile.am (dist_css_DATA): Add it.
* src/cuirass/http.scm (%file-white-list): Add css/cuirass.css.
* src/cuirass/templates.scm (search-form): Add search-hints div.
(html-page): Load cuirass.css.
2020-04-15 19:54:09 +02:00
Ricardo Wurmus dde1a93564
database: Support "status:" keyword in queries.
* src/cuirass/database.scm (query->bind-arguments): Handle "status" query.
(db-get-builds-by-search, db-get-builds-query-min, db-get-builds-query-max):
Add status filter.
2020-04-15 19:50:25 +02:00
Ludovic Courtès a436895372 http: Move "/eval" page to (cuirass templates).
* src/cuirass/http.scm (url-handler): Move inline code for ('GET "eval" id)
to...
(evaluation-html-page): ... here.  New procedure.
* src/cuirass/templates.scm (evaluation-build-table): New procedure.
2020-02-24 00:09:22 +01:00
Ludovic Courtès 1f5e5796ef templates: Build page links to corresponding evaluation.
* src/cuirass/templates.scm (build-details): Define 'evaluation'.  Add
"Evaluation" row with a link to EVALUATION.
2020-02-24 00:09:22 +01:00
Ludovic Courtès ed0f905cc7 database: 'db-get-builds' returns each build's evaluation ID.
* src/cuirass/database.scm (db-get-builds): Fetch 'Builds.evaluation'
and return it as #:eval-id.
2020-02-24 00:09:22 +01:00
Christopher Baines bb225189fd utils: Handle errors in worker threads.
Previously, if an error occurred, the worker fiber simply never sends a
reply. In the case of HTTP requests to Cuirass, where an exception occurs when
performing a database query, the fiber handling the request blocks as it never
gets a response. I think that this has the potential to cause the process to
hit file descriptor limits, as the connections are never responded to.

This is fixed by responding with the details of the exception, and then
throwing it within the fiber that made the call.

* src/cuirass/utils.scm (make-worker-thread-channel): Catch exceptions when
calling proc.
(call-with-worker-thread): Handle receiving exceptions from the worker thread.
2020-02-05 18:12:44 +00:00
Christopher Baines b9031db946 database: Enable running up to 4 database queries at once.
The number of threads is copied from bin/cuirass.in. When you have at least
two processors, this will allow database queries to be executed in parallel.

With some crude testing using the Apache HTTP server benchmarking tool (ab
from the httpd package), the max request latency does seem to drop when
multiple threads are used, especially when the database queries are slow (I
tested by adding usleep to the worker thread code).

* src/cuirass/database.scm (with-database): Pass #:parallelism to
make-worker-thread-channel.
2020-01-25 22:32:09 +00:00