AtlatestRepositoryfolio
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_versions20
BEGIN INSERT INTO maintenance_counts VALUES (1); END")21
(error "Counter trigger could not be created"))23
(define (cpu-ms)24
(/ (string->number25
(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
(display36
(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 replacements47
(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)