AtlatestRepositoryfolio

folio / tree / toolscheck-index-maintenance.sgl

1;;; Measure a quiescent, disposable corpus after offline migration.
2(import (sigil fs)
3 (sigil list)
4 (sigil string)
5 (sigil time)
6 (sigil process)
7 (sigil sqlite)
8 (folio store)
9 (folio index))
11(define root (getenv "FOLIO_CORPUS"))
12(unless root (error "FOLIO_CORPUS must name a disposable corpus copy"))
13(define idx (make-folio-index (make-folio-store root)))
14(define db (folio-index-db idx))
16;; A counter distinguishes a metadata-only census from an unnoticed reparse.
17(unless (sqlite-exec db "CREATE TABLE maintenance_counts (n INTEGER)")
18 (error "Counter table could not be created"))
19(unless (sqlite-exec db "CREATE TRIGGER count_maintenance AFTER INSERT ON notes_versions
20 BEGIN INSERT INTO maintenance_counts VALUES (1); END")
21 (error "Counter trigger could not be created"))
23(define (cpu-ms)
24 (/ (string->number
25 (car (string-split (read-file-string "/proc/self/schedstat") " ")))
26 1000000.0))
27(define (wall-ms)
28 (* 1000.0 (/ (current-jiffy) (jiffies-per-second))))
29(define (percentile samples p)
30 (list-ref (list-sort < samples)
31 (max 0 (- (quotient (+ (* p (length samples)) 99) 100) 1))))
33(let loop ((n 0) (walls '()) (cpus '()))
34 (if (= n 10)
35 (display
36 (format "CENSUS n=10 wall_p50_ms=~a wall_p95_ms=~a cpu_p50_ms=~a cpu_p95_ms=~a\n"
37 (percentile walls 50) (percentile walls 95)
38 (percentile cpus 50) (percentile cpus 95)))
39 (let* ((cpu (cpu-ms))
40 (wall (wall-ms))
41 (_ (index-reconcile! idx))
42 (elapsed (- (wall-ms) wall))
43 (used (- (cpu-ms) cpu)))
44 (loop (+ n 1) (cons elapsed walls) (cons used cpus)))))
46(define replacements
47 (cdr (assoc 'n (car (sqlite-query db "SELECT count(*) AS n FROM maintenance_counts")))))
48(unless (= replacements 0) (error "Unchanged census replaced documents" replacements))
49(display (format "UNCHANGED_DOCUMENT_REPLACEMENTS=~a\n" replacements))
50(sqlite-exec db "DROP TRIGGER count_maintenance")
51(sqlite-exec db "DROP TABLE maintenance_counts")
52(sqlite-close db)