racket/collects/tests/db/programs/memleak.rkt
Ryan Culpepper 1b7368f80c db: fix memory leaks
- sqlite3: table prevented pst gc unless close-on-exec
 - statement cache wrongly disabled close-on-exec
   (not a leak, just gc'd very slowly)
 - limit statement cache size
2012-03-13 19:50:08 -06:00

57 lines
1.2 KiB
Racket

#lang racket/base
(require (prefix-in db: db)
racket/match
racket/class)
;; Test for db memory leaks
;; FIXME: mysql quickly exhausts prepared statement limit
(define the-dsn
(match (current-command-line-arguments)
[(vector x)
(string->symbol x)]
[_
(printf "No dsn argument given, exiting.\n")
(exit 0)]))
;; 'tx, 'no
(define start-tx-mode 'no)
(define query-tx-mode 'no)
;; boolean
(define reconnect? #f)
(define random-query? #f)
;; ----
(define (get-c)
(printf "-- connect\n")
(let ([c (db:dsn-connect the-dsn)])
(case start-tx-mode
((tx) (db:start-transaction c))
((no) (void)))
c))
(define c #f)
(define (c-test)
;; Randomize to prevent statement caching
(define (go)
(db:query-value c (if random-query?
(format "SELECT ~a" (random #e1e6))
"SELECT 1")))
(case query-tx-mode
((tx) (db:call-with-transaction c go))
((no) (go))))
(let loop ()
(collect-garbage)
(collect-garbage)
(when (or (not c) reconnect?)
(set! c (get-c)))
(displayln (quotient (current-memory-use) #e1e6))
(for ([i (in-range 10000)])
(c-test))
(loop))