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. Nov 25, 2020
    • Mathieu Othacehe's avatar
      Use specification for periodic builds. · fd432b8e
      Mathieu Othacehe authored
      When the periodic argument is passed to a job, it will be registered only if
      the time difference between the current time and the registration time of the
      last build is greater than the specified period. Make sure that the last job
      that is searched is part of the same specification.
      
      * src/sql/upgrade-16.sql: New file.
      * Makefile.am (dist_sql_DATA): Add it.
      * src/schema.sql (Builds_job_name_timestamp): New index.
      * src/cuirass/database.scm (db-get-time-since-previous-build): Add
      "specification" argument,
      (db-register-builds): pass it.
      Unverified
      fd432b8e
    • Mathieu Othacehe's avatar
      Fix interactive checkout. · e0f97e47
      Mathieu Othacehe authored
      This is a work-around: https://issues.guix.gnu.org/44742.
      
      * src/cuirass/base.scm (fetch-inputs): Set "current-error-port" parameter to a
      void port to prevent the fetch progression bar to appear.
      Unverified
      e0f97e47
    • Mathieu Othacehe's avatar
      Add periodical build support. · 053f9227
      Mathieu Othacehe authored
      * src/cuirass/database.scm (db-get-time-since-previous-build): New procedure,
      (db-register-builds): if the period argument is set, only register builds
      which last registration is older than the specified period.
      Unverified
      053f9227
  2. Nov 02, 2020
    • Mathieu Othacehe's avatar
      Revert "Use a non-blocking socket for store communication." · 3fd0eb15
      Mathieu Othacehe authored
      This reverts commit 38790945 that causes:
      
      2020-11-02T11:05:08 fatal: uncaught exception 'wrong-type-arg' in 'build' fiber!
      2020-11-02T11:05:08 exception arguments: ("struct-vtable" "Wrong type argument in position 1 (expecting struct): ~S" (#f) (#f))
      In ice-9/boot-9.scm:
        1731:15 12 (with-exception-handler #<procedure 7fb1a93f9930 at ic…> …)
        1736:10 11 (with-exception-handler _ _ #:unwind? _ # _)
          718:2 10 (call-with-prompt ("break") #<procedure 7fb1ab76f440 a…> …)
          718:2  9 (call-with-prompt ("continue") #<procedure 7fb1ab77084…> …)
      In ice-9/eval.scm:
          619:8  8 (_ #(#(#<directory (guile-user) 7fb1ac680f00> #<var…> …)))
      In srfi/srfi-1.scm:
          634:9  7 (for-each #<procedure 7fb1a9525900 at cuirass/base.scm…> …)
      In ice-9/boot-9.scm:
        1731:15  6 (with-exception-handler #<procedure 7fb1a95a94e0 at ic…> …)
        1669:16  5 (raise-exception _ #:continuable? _)
        1764:13  4 (_ #<&compound-exception components: (#<&assertion-fail…>)
      In cuirass/utils.scm:
          319:8  3 (_ _ . _)
      In ice-9/boot-9.scm:
        1731:15  2 (with-exception-handler #<procedure 7fb1ab2e3720 at ic…> …)
      In cuirass/utils.scm:
         320:22  1 (_)
      In unknown file:
                 0 (make-stack #t)
      ERROR: In procedure make-stack:
      In procedure struct-vtable: Wrong type argument in position 1 (expecting struct): #f
      Unverified
      3fd0eb15
  3. Oct 28, 2020
  4. Oct 15, 2020
    • Mathieu Othacehe's avatar
      Use with-db-writer-worker-thread/force macro. · f141dd20
      Mathieu Othacehe authored
      * src/cuirass/database.scm (db-register-builds): Use
      "with-db-writer-worker-thread/force" macro.
      Unverified
      f141dd20
    • Mathieu Othacehe's avatar
      Use the writer worker for all write queries. · df2d1362
      Mathieu Othacehe authored
      * .dir-locals.el: Add "with-queue-writer-worker".
      * bin/cuirass.in: Modify "with-queue-writer-worker" scope to include the
      web-server operations.
      * src/cuirass/database.scm (with-db-writer-worker-thread): Export it.
      (with-db-writer-worker-thread/force): New macro.
      (db-add-input, db-add-checkout, db-add-specification, db-remove-specification,
      db-add-evaluation, db-abort-pending-evaluations, db-set-evaluation-status,
      db-set-evaluation-time, db-add-output, db-add-build-product, db-add-event,
      db-delete-events-with-ids-<=-to): Use "with-db-writer-worker-thread" or
      "with-db-writer-worker-thread/force" instead of "with-db-worker-thread".
      * src/cuirass/metrics.scm (db-update-metrics): Ditto.
      * tests/database.scm ("db-init"): Set "%db-writer-channel".
      * tests/http.scm ("db-init"): Ditto.
      * tests/metrics.scm ("db-init"): Ditto.
      Unverified
      df2d1362
    • Mathieu Othacehe's avatar
      Remove unused procedure. · a0e70b9d
      Mathieu Othacehe authored
      * src/cuirass/base.scm (cancel-old-builds): Remove it.
      Unverified
      a0e70b9d
  5. Oct 14, 2020
    • Mathieu Othacehe's avatar
      Fix tests. · 38ee2c5b
      Mathieu Othacehe authored
      This is a follow-up of b67f38a7.
      
      * src/cuirass/database.scm (catch-sqlite-error): New macro.
      (SQLITE_CONSTRAINT_PRIMARYKEY, SQLITE_CONSTRAINT_UNIQUE, %db-writer-channel):
      New variables.
      * tests/database.scm (with-temporary-database): Set "%db-writer-channel".
      (db-add-build-with-fixed-output): Catch sqlite error.
      (db-get-pending-derivations): Do not add builds with duplicated outputs.
      Unverified
      38ee2c5b
    • Mathieu Othacehe's avatar
      Optimize SQLite database. · 65e3624b
      Mathieu Othacehe authored
      * src/cuirass/database.scm (set-db-options): Optimize database parameters.
      Unverified
      65e3624b
    • Mathieu Othacehe's avatar
      Queue write operations. · b67f38a7
      Mathieu Othacehe authored
      SQLite only allows one concurrent write query operation. Having multiple
      database workers calling "db-update-build-status!", will thus increase worker
      starvation. Every write operation will also be done is a single transaction.
      
      For those reasons, create a database worker dedicated to write queries. Have
      this worker queue work and issue all the queued work queries in a single
      transaction.
      
      * .dir-locals.el: Add with-db-writer-worker-thread.
      * src/cuirass/database.scm (with-queue-writer-worker): Rename
      "with-registration-workers" macro.
      (%db-writer-channel): Rename "%db-registration-channel" variable.
      (with-queue-writer-worker): Rename "with-registration-workers".
      (db-register-builds): Use "with-db-writer-worker-thread" instead of
      "with-db-registration-worker-thread".
      (db-update-build-status!): Ditto
      * src/cuirass/utils.scm (make-worker-thread-channel): Add "queue-size" and
      "queue-proc" arguments.
      (call-with-worker-thread): Add "options" argument.
      * bin/cuirass.in (main): Use "with-queue-writer-worker" instead of
      "with-registration-workers". Modify the macro scope to include all the
      possible write operations.
      Unverified
      b67f38a7
    • Mathieu Othacehe's avatar
      Update metrics in a single transaction. · 514f20a9
      Mathieu Othacehe authored
      * src/cuirass/metrics.scm (db-update-metrics): Update all metrics in a single
      transaction.
      Unverified
      514f20a9
    • Mathieu Othacehe's avatar
      Register new builds in a single transaction. · 038150a3
      Mathieu Othacehe authored
      Registering an evaluation can cause a large number of write queries using
      individual transactions. This is really sub-optimal as commiting a transaction
      will often result in a database sync to the disk.
      
      * src/cuirass/database.scm (db-add-build): Do not create a new transaction for
      each new build, instead ...
      (db-register-builds): ..., create a single transaction per evaluation
      registration.
      Unverified
      038150a3
    • Jonathan Brielmaier's avatar
      doc: Update path for gcroots. · fd7e7b5f
      Jonathan Brielmaier authored
      
      * doc/cuirass.texi (Invoking cuirass): Update path for gcroots.
      
      Signed-off-by: default avatarMathieu Othacehe <othacehe@gnu.org>
      Unverified
      fd7e7b5f
  6. Oct 09, 2020
  7. Oct 07, 2020
    • Mathieu Othacehe's avatar
      Optimize build query. · cb2c4e3d
      Mathieu Othacehe authored
      Make sure that db-get-builds only performs one query and add build products to
      the result. Also add indexes so that all "order" filters are covered.
      
      Limit the maximum of build objects returned in "/api/latestbuilds" and
      "/api/queue" to 1000.
      
      Fixes: <https://issues.guix.gnu.org/43826>.
      
      * src/sql/upgrade-15.sql: New file.
      * Makefile (dist_sql_DATA): Add it.
      * src/cuirass/database.scm (db-get-builds-by-search): Add "buildproducts" to
      the returned build objects.
      (db-get-builds): Remove unused filters. Join Outputs and BuildProducts table
      in the query. Add "buildproducts" to the returned build objects.
      * src/cuirass/http.scm (build->hydra-build): Use "buildproducts" from
      "db-get-builds" procedure.
      (url-handler): Forbid limit parameters greater than 1000 and use
      "buildproducts" from "db-get-builds" procedure.
      * src/schema.sql (Builds_stoptime, Builds_stoptime_id, Builds_status_ts_id):
      New indexes.
      Unverified
      cb2c4e3d
    • Mathieu Othacehe's avatar
      Add index on builds table. · 04e95afa
      Mathieu Othacehe authored
      * src/sql/upgrade-14.sql: New file.
      * src/schema.sql (dist_sql_DATA): Add it.
      * src/schema.sql (Builds_timestamp_stoptime): New index.
      Unverified
      04e95afa
  8. Oct 06, 2020
  9. Oct 05, 2020
    • Mathieu Othacehe's avatar
      Do not allow full search on nix_name field. · 930c2f31
      Mathieu Othacehe authored
      Searching for something like "%a%" can take up to ten minutes. Remove the
      usage of special characters "^" and "$" in queries. Instead, always add a "%"
      character at the end of the query. Also add an index on the nix_name field.
      
      Fixes: <https://issues.guix.gnu.org/43791>.
      
      * src/sql/upgrade-13.sql: New file.
      * Makefile.am (dist_sql_DATA): Add it.
      * src/schema.sql (Builds_nix_name): New index.
      * src/cuirass/database.scm (query->bind-arguments): Remove support for "^" and
      "$" special characters. Instead make sure that the query does not contain any
      "%" character and prefix the query by "%".
      (db-get-builds-by-search): Remove an useless query nesting level.
      * src/cuirass/templates.scm (search-form): Adapt the search help message
      accordingly.
      Unverified
      930c2f31
  10. Oct 03, 2020
  11. Oct 02, 2020
    • Mathieu Othacehe's avatar
      Do not browse the store during registration. · cd89fc43
      Mathieu Othacehe authored
      * src/cuirass/database.scm (db-register-builds): Remove store argument and
      assume that 'log and 'outputs properties are provided by the evaluation.
      * src/cuirass/base.scm (build-packages): Adapt accordingly.
      Unverified
      cd89fc43
    • Mathieu Othacehe's avatar
      Add evaluation database workers. · 39db021a
      Mathieu Othacehe authored
      Evaluation registration involves running a large number of SQL queries. This
      can cause some database worker starvation as well as some contention. To avoid
      this issue, spawn database workers dedicated to evaluation registration.
      
      * src/cuirass/database.scm (%db-registration-channel): New variable.
      (with-db-registration-worker-thread, with-registration-workers): New macros.
      (with-db-worker-thread-no-timeout): Remove it.
      (db-register-builds): Run registration in dedicated database workers using
      "with-db-registration-worker-thread" macro.
      * bin/cuirass.in (main): Spawn database registration workers by calling
      "with-registration-workers" macro.
      Unverified
      39db021a
  12. Oct 01, 2020
    • Mathieu Othacehe's avatar
      Register all new outputs in one worker. · ce624ea7
      Mathieu Othacehe authored
      Make sure that all registration queries are done from within a single database
      worker. Otherwise, when builds from multiple evaluations are registered at
      the same time, some contention occurs communicating with workers.
      
      * src/cuirass/base.scm (new-outputs?, build-packages): Move build registration
      to ...
      * src/cuirass/database.scm (db-register-builds): ... this new procedure.
      (with-db-worker-thread-no-timeout): New procedure. Use it in
      "db-register-builds" to avoid timeout messages.
      Unverified
      ce624ea7
    • Mathieu Othacehe's avatar
      Expect nix-name and system to be part of the evaluation. · 39f6e930
      Mathieu Othacehe authored
      * src/cuirass/base.scm (evaluate): Expect 'nix-name and 'system properties to
      be provided by the evaluation.
      (build-packages): Use the eval-id provided as argument.
      Unverified
      39f6e930
  13. Sep 29, 2020
    • Mathieu Othacehe's avatar
      metrics: Optimize queries. · 4d7864c0
      Mathieu Othacehe authored
      Avoid full Builds table scans.
      
      * src/cuirass/metrics.scm (db-average-build-start-time-per-eval,
      db-average-build-complete-time-per-eval, db-evaluation-completion-speed):
      Rewrite query to avoid full Builds table scans.
      Unverified
      4d7864c0
    • Mathieu Othacehe's avatar
      Add watchdog support. · eb8d1b88
      Mathieu Othacehe authored
      * src/cuirass/watchdog.scm: New file.
      * Makefile.am (dist_pkgmodule_DATA): Add it.
      * src/cuirass/utils.scm (with-timeout, get-message-with-timeout): Export them.
      * bin/cuirass.in (main): Start the watchdog.
      Unverified
      eb8d1b88
  14. Sep 28, 2020
    • Mathieu Othacehe's avatar
      Optimize database queries. · 0ffcb80e
      Mathieu Othacehe authored
      Avoid full scans of Builds table that can be very time consuming by rewriting
      some queries and using new indexes.
      
      * src/sql/upgrade-12.sql: New file.
      * Makefile.am (dist_sql_DATA): Add it.
      * src/schema.sql (Builds_evaluation_index, Evaluations_status_index,
      Evaluations_specification_index): New indexes.
      * src/cuirass/database.scm (db-get-evaluations-build-summary,
      db-get-evaluation-summary): Rewrite queries to avoid full Builds table scan
      and use the new indexes.
      Unverified
      0ffcb80e
    • Mathieu Othacehe's avatar
      Limit builds insertion queries. · 461e07e1
      Mathieu Othacehe authored
      Once the evaluation is over, the new builds are registered. This registration
      tries to insert a new build for each derivation returned by the evaluation
      phase. If the new build does not add a new output, the insertion query is then
      rollbacked. This means that there are at least as many insertion queries as
      new derivations.
      
      SQlite allows at most one writer at a time, and even though we are using WAL
      mode, performing a lot of insertions will reduce the reading perforances.
      When multiple evaluations are performed in parallel, the large number of
      concurrent insertion queries also causes contention.
      
      To avoid those issues, check first in the "Outputs" table which derivations
      are already registered. This means that most of the insertion queries will be
      replaced by reading queries, that are much less expensive and more suitable
      for Cuirass concurrent implementation.
      
      * src/cuirass/base.scm (new-outputs?): New procedure.
      (build-packages): Use it to insert only builds registering new outputs.
      Unverified
      461e07e1
  15. Sep 24, 2020
    • Mathieu Othacehe's avatar
      Do not raise an exception at gcroot directory creation. · d1386d85
      Mathieu Othacehe authored
      On fresh Guix System installations, Cuirass will not be allowd to create its
      own profile directory. Instead this should be take care of by guix-daemon when
      Cuirass will initiate its first connection to it.
      
      * bin/cuirass.in (main): Do not raise an exception on gcroot directory
      creation failure.
      Unverified
      d1386d85
    • Mathieu Othacehe's avatar
      Add SQL query logging support. · b310f17a
      Mathieu Othacehe authored
      * bin/cuirass.in (show-help): Document "--log-queries" option.
      (%options): Add it.
      (main): Enable query logging if the above option is set.
      * src/cuirass/database.scm (db-log-queries): New procedure.
      * src/cuirass/logging.scm (query-logging-port): New parameter.
      (log-query): New procedure.
      Unverified
      b310f17a
  16. Sep 18, 2020
    • Mathieu Othacehe's avatar
      Fix GC race-condition in spawn-builds. · e7bebbe3
      Mathieu Othacehe authored
      If a derivation is GC'd just before calling "spawn-builds",
      "build-derivations: will throw an exception that will be catched. Then,
      "update-build-statuses!"  will call "derivation-path->output-paths" that will
      throw another exception because the derivation does not exit. This exception
      is not handled, causing Cuirass to crash.
      
      2020-09-18T10:41:18 batch of builds (partially) failed: build of `/gnu/store/zrmxzjf025nc89a7vdy5i94zavprc7fs-emacs-guix-0.5.2-2.58a840d.drv' failed (status: 1)
      Backtrace:
      In ice-9/boot-9.scm:
        1736:10 11 (with-exception-handler _ _ #:unwind? _ #:unwind-for-type _)
      In unknown file:
                10 (apply-smob/0 #<thunk 7ffff5cbd4a0>)
      In ice-9/boot-9.scm:
          718:2  9 (call-with-prompt _ _ #<procedure default-prompt-handler (k proc)>)
      In ice-9/eval.scm:
          619:8  8 (_ #(#(#<directory (guile-user) 7ffff58f8f00>)))
      In ice-9/boot-9.scm:
         2806:4  7 (save-module-excursion _)
        4351:12  6 (_)
      In cuirass/base.scm:
         562:10  5 (spawn-builds #<store-connection 256.99 7fffec03f910> _ #:max-batch-size _)
      In srfi/srfi-1.scm:
          634:9  4 (for-each #<procedure update! (drv)> ("/gnu/store/zrmxzjf025nc89a7vdy5i94zavprc7fs-emacs-guix-0.5.2-2.58a840d.drv"))
      In cuirass/base.scm:
          474:4  3 (update! "/gnu/store/zrmxzjf025nc89a7vdy5i94zavprc7fs-emacs-guix-0.5.2-2.58a840d.drv")
      In guix/derivations.scm:
         552:17  2 (derivation-path->output-paths "/gnu/store/zrmxzjf025nc89a7vdy5i94zavprc7fs-emacs-guix-0.5.2-2.58a840d.drv")
      In ice-9/ports.scm:
         440:11  1 (call-with-input-file "/gnu/store/zrmxzjf025nc89a7vdy5i94zavprc7fs-emacs-guix-0.5.2-2.58a840d.drv" #<procedure read-derivation (drv-port #:optional read-derivation-from-file)> #:binary _ …)
      In unknown file:
                 0 (open-file "/gnu/store/zrmxzjf025nc89a7vdy5i94zavprc7fs-emacs-guix-0.5.2-2.58a840d.drv" "r" #:encoding #f #:guess-encoding #f)
      
      * src/cuirass/base.scm (update-build-statuses!): Catch
      "derivation-path->output-paths" exceptions and set the build status to
      "failed".
      Unverified
      e7bebbe3
  17. Sep 17, 2020
Loading