aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristopher Baines <mail@cbaines.net>2019-02-08 11:19:12 +0000
committerChristopher Baines <mail@cbaines.net>2019-02-08 11:19:12 +0000
commit0a49c0a84af6fc95a6deba8584da7517b135abf2 (patch)
tree1d7132154680476f577b92341b5fe502e79840df
parent5a9262b38d506008b21fd73eb8f7c3046b47de92 (diff)
downloaddata-service-0a49c0a84af6fc95a6deba8584da7517b135abf2.tar
data-service-0a49c0a84af6fc95a6deba8584da7517b135abf2.tar.gz
Actually close database connections
Previously, the connections were not closed, so eventually PostgreSQL would run out. Using a pool of connections would be better, but as a short term solution, just close the connection after each request.
-rw-r--r--guix-data-service/web/controller.scm4
-rw-r--r--guix-data-service/web/server.scm23
2 files changed, 21 insertions, 6 deletions
diff --git a/guix-data-service/web/controller.scm b/guix-data-service/web/controller.scm
index 1d7bd72..7fc934a 100644
--- a/guix-data-service/web/controller.scm
+++ b/guix-data-service/web/controller.scm
@@ -50,9 +50,7 @@
;; (render-html (error-page message))))
)
-(define (controller request body)
- (define conn (connect-to-postgres-paramstring "dbname=guix_data_service"))
-
+(define (controller request body conn)
(match-lambda
((GET)
(apply render-html (index (most-recent-n-guix-revisions conn 10))))
diff --git a/guix-data-service/web/server.scm b/guix-data-service/web/server.scm
index 2077629..b220b20 100644
--- a/guix-data-service/web/server.scm
+++ b/guix-data-service/web/server.scm
@@ -21,15 +21,32 @@
#:use-module (web http)
#:use-module (web request)
#:use-module (web uri)
+ #:use-module (squee)
#:use-module (fibers web server)
#:use-module (guix-data-service web controller)
#:use-module (guix-data-service web util)
#:export (start-guix-data-service-web-server))
+;; TODO This isn't exported for some reason
+(define pg-conn-finish
+ (@@ (squee) pg-conn-finish))
+
+(define (with-postgresql-connection paramstring f)
+ (let* ((conn (connect-to-postgres-paramstring paramstring)))
+ (dynamic-wind
+ (const #t)
+ (lambda ()
+ (f conn))
+ (lambda ()
+ (pg-conn-finish conn)))))
+
(define (run-controller controller request body)
- ((controller request body)
- (cons (request-method request)
- (request-path-components request))))
+ (with-postgresql-connection
+ "dbname=guix_data_service"
+ (lambda (conn)
+ ((controller request body conn)
+ (cons (request-method request)
+ (request-path-components request))))))
(define (handler request body controller)
(format #t "~a ~a\n"