guix-data-service/guix-data-service/model/lint-checker.scm
Christopher Baines 66793a5568 Rework how data is inserted
This is the big change needed to allow for parallel revision
processing. Previously, a lock was used to prevent this since the parallel
transactions could deadlock if each inserted data that the other then went to
insert.

By defining the order in which inserts happen, both in terms of the order of
tables, and the order of rows within the table, this change should guarantee
that there won't be deadlocks.

I'm also hoping this change will address whatever issue was causing some
derivation data to be missing from the database.
2026-01-03 20:40:09 +00:00

72 lines
2.9 KiB
Scheme

;;; Guix Data Service -- Information about Guix over time
;;; Copyright © 2019 Christopher Baines <mail@cbaines.net>
;;;
;;; This program is free software: you can redistribute it and/or
;;; modify it under the terms of the GNU Affero General Public License
;;; as published by the Free Software Foundation, either version 3 of
;;; the License, or (at your option) any later version.
;;;
;;; This program is distributed in the hope that it will be useful,
;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
;;; Affero General Public License for more details.
;;;
;;; You should have received a copy of the GNU Affero General Public
;;; License along with this program. If not, see
;;; <http://www.gnu.org/licenses/>.
(define-module (guix-data-service model lint-checker)
#:use-module (srfi srfi-1)
#:use-module (srfi srfi-43)
#:use-module (ice-9 match)
#:use-module (squee)
#:use-module (guix-data-service model utils)
#:export (lint-warning-count-by-lint-checker-for-revision
lint-checkers-for-revision
lint-checker-description-data->lint-checker-description-set-id))
(define (lint-warning-count-by-lint-checker-for-revision conn commit-hash)
(define query
"
SELECT lint_checkers.name, lint_checker_descriptions.description,
lint_checkers.network_dependent, revision_data.count
FROM lint_checkers
INNER JOIN lint_checker_description_sets
ON lint_checkers.lint_checker_description_set_id = lint_checker_description_sets.id
INNER JOIN lint_checker_descriptions
ON lint_checker_descriptions.id = ANY (lint_checker_description_sets.description_ids)
AND lint_checker_descriptions.locale = 'en_US.UTF-8'
INNER JOIN (
SELECT lint_checker_id, COUNT(*)
FROM lint_warnings
WHERE id IN (
SELECT lint_warning_id
FROM guix_revision_lint_warnings
INNER JOIN guix_revisions
ON guix_revision_lint_warnings.guix_revision_id = guix_revisions.id
WHERE commit = $1
)
GROUP BY lint_checker_id
) AS revision_data ON lint_checkers.id = revision_data.lint_checker_id
ORDER BY count DESC")
(exec-query conn query (list commit-hash)))
(define (lint-checkers-for-revision conn commit-hash)
(exec-query
conn
"
SELECT lint_checkers.name, lint_checker_descriptions.description, lint_checkers.network_dependent
FROM lint_checkers
INNER JOIN lint_checker_description_sets
ON lint_checkers.lint_checker_description_set_id = lint_checker_description_sets.id
INNER JOIN lint_checker_descriptions
ON lint_checker_descriptions.id = ANY (lint_checker_description_sets.description_ids)
AND lint_checker_descriptions.locale = 'en_US.UTF-8'
WHERE lint_checkers.id IN (
SELECT lint_checker_id
FROM guix_revision_lint_checkers
INNER JOIN guix_revisions
ON guix_revisions.id = guix_revision_lint_checkers.guix_revision_id
WHERE commit = $1)"
(list commit-hash)))