
- 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
57 lines
1.2 KiB
Racket
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))
|