perf: track tx-log entry count in a field instead of length per append

ober

ac7064f7a02a10a5f71ef5d31f8b328ac11bf00c

diff --git a/lib/jerboa-db/tx-log.ss b/lib/jerboa-db/tx-log.ss
index 1b99150..0dde810 100644
--- a/lib/jerboa-db/tx-log.ss
+++ b/lib/jerboa-db/tx-log.ss
@@ -120,6 +120,7 @@
             segment-dir                    ;; directory for segment files (or #f for in-memory)
             segment-size                   ;; max entries per segment
             (mutable current-segment-count) ;; entries in current segment
+            (mutable entry-count)          ;; total entries (avoids O(n) length per append)
             mutex))
 
   (def (new-tx-log . opts)
@@ -131,7 +132,7 @@
                    (<= seg-size +tx-log-max-segment-size+))
         (error 'new-tx-log "invalid transaction log segment size" seg-size))
       (make-tx-log '() (checked-tx-log-dir dir 'new-tx-log)
-                   seg-size 0 (make-mutex))))
+                   seg-size 0 0 (make-mutex))))
 
   ;; ---- Append ----
 
@@ -145,6 +146,7 @@
           (write-entry-to-segment! log entry))
         ;; Prepend to in-memory list
         (tx-log-entries-set! log (cons entry (tx-log-entries log)))
+        (tx-log-entry-count-set! log (+ (tx-log-entry-count log) 1))
         (tx-log-current-segment-count-set! log
           (+ (tx-log-current-segment-count log) 1))
         ;; Rotate after the durable append and in-memory publication.
@@ -191,7 +193,7 @@
 
   (def (tx-log-count log)
     (with-mutex (tx-log-mutex log)
-      (length (tx-log-entries log))))
+      (tx-log-entry-count log)))
 
   (def (tx-log-latest-tx log)
     (with-mutex (tx-log-mutex log)
@@ -261,8 +263,8 @@
 
   (def (write-entry-to-segment! log entry)
     (let* ([dir (tx-log-segment-dir log)]
-           [segment-num (quotient (length (tx-log-entries log))
-                                  (tx-log-segment-size log))]
+           [segment-num (quotient (tx-log-entry-count log)
+                                   (tx-log-segment-size log))]
            [path (checked-segment-path dir
                    (string-append "segment-" (number->string segment-num) ".fasl")
                    'tx-log-append!)])
@@ -371,6 +373,8 @@
                                  (vector-ref v 2))])
                     (tx-log-entries-set! log
                       (cons entry (tx-log-entries log)))
+                    (tx-log-entry-count-set! log
+                      (+ (tx-log-entry-count log) 1))
                     (loop)))))))
         (lambda () (close-port port)))))