blob: e59bb61136f857e66db02867a521001194385b50 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
|
(ns dumpfm.millstone
(:use clojure.contrib.def
clojure.contrib.seq-utils
clojure-http.client))
(def *spec*)
(def *cookies*)
(def printer (agent nil))
(defn log [& args]
(send printer (fn [_] (apply println args))))
(defmacro with-timing [e]
`(let [s# (System/nanoTime)
r# ~e
f# (System/nanoTime)]
[(float (/ (- f# s#) 1e6)) r#]))
(defn do-base-request [server path method cookies params]
(let [method (.toUpperCase method)
url (str server path)]
(if (= method "GET")
(request (add-query-params url params) method nil cookies)
(request url method nil cookies params))))
(defnk do-setup-request! [path
:params nil
:method "GET"]
(let [res (do-base-request (:server *spec*) path method *cookies* params)]
(if (:cookies res)
(set! *cookies* (merge *cookies* (:cookies res))))
res))
(defnk do-request! [path
:params nil
:method :GET]
(let [[time res] (with-timing
(do-base-request (:server *spec*)
path
method
*cookies*
params))]
(log (format "%s - %sms [%s %s]" path time (:code res) (:msg res)))
(if (:cookies res)
(log "should set cookies" (:cookies res)))
res))
(defn build-client! [spec client-id]
(binding [*cookies* {}]
(if (:setup-func spec)
((:setup-func spec)))
{:client-id client-id
:cookies *cookies*}))
(defn print-run-results [spec elapsed]
(log (format "\nFinished\n--------\n%s runs in %s s (%s r/s)\n%s clients"
(:requests spec)
(/ elapsed 1000)
(/ (:requests spec) elapsed 1000)
(:clients spec))))
(defn build-func-list [routes]
(flatten (for [[n f] routes]
(repeat n f))))
(defn grind! [spec]
(binding [*spec* spec]
(let [clients (doall
(for [id (range (:clients spec))]
(build-client! spec id)))
funcs (build-func-list (:funcs spec))
results (atom [])
counter (atom (:requests spec))
threads (doall
(for [c clients]
(Thread.
(fn []
(log "starting thread" (:client-id c))
(binding [*spec* spec
*cookies* (:cookies c)]
(loop []
(if (> (swap! counter dec) 0)
(let [f (rand-elt funcs)]
(f)
(recur))))
(log "finishing thread" (:client-id c)))))))]
(println "Finished setup")
(let [[elapsed _] (with-timing
(do
(doseq [t threads]
(.start t))
(doseq [t threads]
(.join t))))]
(print-run-results spec elapsed)))))
|