diff options
author | Christopher Baines <mail@cbaines.net> | 2020-10-03 21:32:46 +0100 |
---|---|---|
committer | Christopher Baines <mail@cbaines.net> | 2020-10-03 21:32:46 +0100 |
commit | e2e55c69de1eceb77998ab059a943711ef7779fd (patch) | |
tree | 48cb91e3130c3cc8718529cbc699fc09df0ea94d /guix-data-service/database.scm | |
parent | 18b6dd9e6d4463e47ce457187d956c1c3dd8dd08 (diff) | |
download | data-service-e2e55c69de1eceb77998ab059a943711ef7779fd.tar data-service-e2e55c69de1eceb77998ab059a943711ef7779fd.tar.gz |
Rework the shortlived PostgreSQL specific connection channel
In to a generic thing more like (ice-9 futures). Including copying some bits
from the (ice-9 threads) module and adapting them to work with this fibers
approach, rather than futures. The advantage being that using fibers channels
doesn't block the threads being used by fibers, whereas futures would.
Diffstat (limited to 'guix-data-service/database.scm')
-rw-r--r-- | guix-data-service/database.scm | 95 |
1 files changed, 0 insertions, 95 deletions
diff --git a/guix-data-service/database.scm b/guix-data-service/database.scm index 89b1a09..4d1001b 100644 --- a/guix-data-service/database.scm +++ b/guix-data-service/database.scm @@ -20,9 +20,6 @@ #:use-module (ice-9 match) #:use-module (ice-9 threads) #:use-module (squee) - #:use-module (fibers) - #:use-module (fibers channels) - #:use-module (fibers conditions) #:use-module (guix-data-service config) #:export (with-postgresql-connection @@ -136,98 +133,6 @@ (f conn))))) -(define* (make-postgresql-connection-channel name - #:key - (statement-timeout #f) - (threads 2)) - (parameterize (((@@ (fibers internal) current-fiber) #f)) - (let ((channel (make-channel))) - (for-each - (lambda _ - (call-with-new-thread - (lambda () - (with-postgresql-connection - name - (lambda (conn) - (let loop () - (match (get-message channel) - (((? channel? reply) f (? boolean? allways-rollback?)) - (put-message - reply - (with-exception-handler - (lambda (exn) - (cons 'worker-thread-error exn)) - (lambda () - (with-exception-handler - (lambda (exn) - (simple-format - (current-error-port) - "postgresql connection thread: exception: ~A\n" - exn) - (backtrace) - (raise-exception exn)) - (lambda () - (call-with-values - (lambda () - (with-postgresql-transaction - conn - (lambda (conn) - (f conn)))) - (lambda vals vals))))) - #:unwind? #t)) - (loop)) - (((? channel? reply) . (? list? args)) - (put-message - reply - (with-exception-handler - (lambda (exn) - (cons 'worker-thread-error exn)) - (lambda () - (with-exception-handler - (lambda (exn) - (simple-format - (current-error-port) - "postgresql connection thread: exception: ~A\n" - exn) - (backtrace) - (raise-exception exn)) - (lambda () - (call-with-values - (lambda () - (apply exec-query - conn - args)) - (lambda vals vals))))) - #:unwind? #t)) - (loop)) - (_ #f)))) - #:statement-timeout statement-timeout)))) - (iota threads)) - channel))) - -(define (close-postgresql-connection-channel channel) - (put-message channel #f)) - -(define (exec-query/through-channel channel . args) - (let ((reply (make-channel))) - (put-message channel (cons reply args)) - (match (get-message reply) - (('worker-thread-error . exn) - (raise-exception exn)) - (result - (apply values result))))) - -(define* (with-postgresql-transaction/through-channel channel - f - #:key always-rollback?) - (let ((reply (make-channel))) - (put-message channel (list reply f always-rollback?)) - (match (get-message reply) - (('worker-thread-error . exn) - (raise-exception exn)) - (result - (apply values result))))) - (define* (with-postgresql-transaction conn f #:key always-rollback?) (exec-query conn "BEGIN;") |