Skip to content
Snippets Groups Projects
This project is mirrored from https://git.savannah.gnu.org/git/guix/guix-cuirass.git/. Pull mirroring updated .
  1. Jul 30, 2020
    • Mathieu Othacehe's avatar
      utils: Do not block the calling fiber. · 6ad9c602
      Mathieu Othacehe authored
      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.
      6ad9c602
  2. Jul 29, 2020
  3. Jul 26, 2020
    • Mathieu Othacehe's avatar
      templates: Handle missing input case. · f71f026a
      Mathieu Othacehe authored
      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.
      f71f026a
  4. Jul 25, 2020
    • Mathieu Othacehe's avatar
      Fix spec reading when restarting builds. · 17395e85
      Mathieu Othacehe authored
      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.
      17395e85
  5. Jul 03, 2020
    • Mathieu Othacehe's avatar
      navbar: Fix typo. · d11ce40a
      Mathieu Othacehe authored
      * src/cuirass/templates.scm (html-page): Turn "Latest builds" into "Running
      builds".
      d11ce40a
    • Mathieu Othacehe's avatar
      Add "latest builds" support. · 136a8295
      Mathieu Othacehe authored
      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.
      136a8295
  6. Jun 30, 2020
  7. Jun 29, 2020
    • Mathieu Othacehe's avatar
      Factorize build products creation. · 4dd9664b
      Mathieu Othacehe authored
      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.
      4dd9664b
  8. Jun 26, 2020
    • Mathieu Othacehe's avatar
      Check for derivation before creating build products. · 91204db3
      Mathieu Othacehe authored
      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.
      91204db3
  9. Jun 23, 2020
    • Mathieu Othacehe's avatar
      http: Display gzipped log files in the browser. · 300f6253
      Mathieu Othacehe authored
      This is a follow-up of 2280ae18. 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".
      300f6253
  10. Jun 22, 2020
    • Mathieu Othacehe's avatar
      Create build products as soon as the build succeeded. · 10b16ec0
      Mathieu Othacehe authored
      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.
      10b16ec0
  11. Jun 21, 2020
  12. Jun 15, 2020
  13. Jun 14, 2020
  14. Jun 13, 2020
    • Christopher Baines's avatar
      Add missing sql upgrade-8.sql file. · 76ec2967
      Christopher Baines authored
      * Makefile.am (dist_sql_DATA): Add src/sql/upgrade-8.sql.
      76ec2967
    • Christopher Baines's avatar
      sql: Add a couple of indexes. · 7f71d9b7
      Christopher Baines authored
      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.
      7f71d9b7
  15. Jun 10, 2020
    • Mathieu Othacehe's avatar
      cuirass: Use sendfiles instead of raw copies. · 2280ae18
      Mathieu Othacehe authored
      * 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.
      2280ae18
    • Mathieu Othacehe's avatar
      Add support for build products downloading. · f44618fc
      Mathieu Othacehe authored
      * 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.
      f44618fc
    • Christopher Baines's avatar
      database: Begin tuning db-get-builds for performance. · 78986d96
      Christopher Baines authored
      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.
      78986d96
  16. May 25, 2020
    • Christopher Baines's avatar
      cuirass: Perform some database "optimization" at startup. · 9265949c
      Christopher Baines authored
      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.
      9265949c
    • Christopher Baines's avatar
      build-aux: Update for Guile 3. · 68a6912c
      Christopher Baines authored
      * build-aux/guix.scm (arguments): Change 2.2 to 3.0.
      (inputs): Change guile@2.2 to guile.
      68a6912c
  17. Apr 17, 2020
  18. Apr 16, 2020
  19. Feb 24, 2020
  20. Feb 06, 2020
    • Christopher Baines's avatar
      utils: Handle errors in worker threads. · bb225189
      Christopher Baines authored
      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.
      bb225189
  21. Jan 26, 2020
    • Christopher Baines's avatar
      database: Enable running up to 4 database queries at once. · b9031db9
      Christopher Baines authored
      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.
      b9031db9
    • Christopher Baines's avatar
      Enable make-worker-thread-channel to create multiple worker threads. · faf4bfdf
      Christopher Baines authored
      This will allow running multiple threads, that all listen on the same channel,
      enabling processing multiple jobs at one time.
      
      * src/cuirass/utils.scm (make-worker-thread-channel): Add a #:parallelism
      argument, and create as many threads as the given parallelism.
      faf4bfdf
    • Christopher Baines's avatar
      Adjust make-worker-thread-channel to take an initializer. · e34d773f
      Christopher Baines authored
      While this is a generic method, and initializer function will give the
      flexibility required to create multiple worker threads for performing SQLite
      queries, each with it's own database connection (as a result of calling the
      initializer once for each thread). Without this change, they'd all have to use
      the same connection, which would not work.
      
      * src/cuirass/utils.scm (make-worker-thread-channel): Change procedure to take
      an initializer, rather than arguments directly.
      * src/cuirass/database.scm (with-database): Adjust to call
      make-worker-thread-channel with an initializer.
      * tests/database.scm (db-init): Change to use make-worker-thread-channel
      initializer.
      * tests/http.scm (db-init): Change to use make-worker-thread-channel
      initializer.
      e34d773f
    • Christopher Baines's avatar
      utils: Change critical section terminology to worker threads. · 0d23a6d3
      Christopher Baines authored
      As far as I'm aware, it's necessary to use a separate thread for interacting
      with SQLite as one of the threads used for fibers will be blocked while the
      SQLite query is running.
      
      This doesn't mean all queries have to be executed one at a time though,
      providing the queries are executed outside the threads used by fibers, and a
      single connection isn't used in multiple threads.
      
      These changes start to move in this direction, first by just changing the
      terminology.
      
      * src/cuirass/base.scm (clear-build-queue, cancel-old-builds): Change
      with-db-critical-section to with-db-worker-thread.
      * src/cuirass/database.scm (with-db-critical-section): Rename syntax rule to
      with-db-worker-thread.
      (db-add-input, db-add-checkout, db-add-specification, db-remove-specification,
      db-get-inputs, db-get-specification, db-add-evaluation,
      db-set-evaluations-done, db-set-evaluation-done, db-add-derivation-output,
      db-add-build, db-update-build-status!, db-get-output, db-get-outputs,
      db-get-builds-by-search, db-get-builds, db-get-build derivation-or-id,
      db-add-event, db-get-events, db-delete-events-with-ids-<=-to,
      db-get-pending-derivations, db-get-checkouts, db-get-evaluations,
      db-get-evaluations-build-summary, db-get-evaluations-id-max,
      db-get-evaluation-summary, db-get-builds-query-min, db-get-builds-query-max,
      db-get-builds-min, db-get-builds-max, db-get-evaluation-specification): Change
      from using with-db-critical-section to
      with-db-worker-thread.
      (with-database): Change syntax rule to use make-worker-thread-channel,
      renaming from make-critical-section.
      * src/cuirass/utils.scm (%critical-section-args): Rename parameter to
      %worker-thread-args.
      (make-critical-section): Rename to make-worker-thread-channel, and adjust
      parameter and docstring.
      (call-with-critical-section): Rename to call-with-worker-thread and adjust
      parameter.
      (with-critical-section): Rename to with-worker-thread, and adjust to call
      call-with-worker-thread.
      * tests/database.scm (db-init): Use make-worker-thread-channel rather than
      make-critical-section.
      * tests/http.scm (db-init): Use make-worker-thread-channel rather than
      make-critical-section.
      0d23a6d3
    • Christopher Baines's avatar
      Alter the Builds table to have an id field · fa412cdb
      Christopher Baines authored
      The internal rowid's are used for builds as you can request builds by using
      the rowid in the URL.
      
      The motivation here is to enable running VACUUM operations in SQLite, without
      risking the rowid's for Builds changing. It would be bad if they change, as
      they're used in the URL's for builds.
      
      * src/schema.sql (Builds): Add id column.
      * src/curiass/dataabse.scm (db-add-build): Change PRIMARYKEY constraint to
      UNIQUE constraint.
      * src/sql/upgrade-6.sql: New file.
      * Makefile.am (dist_sql_DATA): Add it.
      fa412cdb
  22. Jan 25, 2020
Loading