Skip to content

Commit f767a11

Browse files
committed
Add nemeses support to runner and db
Closes #34 Closes #16 Closes #17 Closes #21 Closes #25
1 parent b52ef9d commit f767a11

File tree

3 files changed

+89
-4
lines changed

3 files changed

+89
-4
lines changed

src/tarantool/db.clj

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,31 @@
247247
(stop! test node)
248248
(wipe! test node))
249249

250+
;db/Primary
251+
;(setup-primary! [_ test node])
252+
253+
;(primaries [_ test]
254+
; (->> (node-state test)
255+
; (filter (comp #{:leader} :role))
256+
; (map :node)))
257+
258+
db/Process
259+
(start! [_ test node]
260+
(start! node {}))
261+
;{:initial-cluster-state (if @(:initialized? test)
262+
; :existing
263+
; :new)
264+
; :nodes @(:members test)}))
265+
266+
(kill! [_ test node]
267+
(c/su
268+
;(cu/stop-daemon! binary pidfile)))
269+
(cu/grepkill! :kill "tarantool")))
270+
271+
db/Pause
272+
(pause! [_ test node] (c/su (cu/grepkill! :stop "tarantool")))
273+
(resume! [_ test node] (c/su (cu/grepkill! :cont "tarantool")))
274+
250275
db/LogFiles
251276
(log-files [_ test node]
252277
[logfile])))

src/tarantool/nemesis.clj

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
(ns tarantool.nemesis
2+
"Nemeses for Tarantool"
3+
(:require [clojure.pprint :refer [pprint]]
4+
[clojure.tools.logging :refer [info warn]]
5+
[dom-top.core :refer [real-pmap]]
6+
[jepsen [nemesis :as n]
7+
[net :as net]
8+
[util :as util]]
9+
[jepsen.generator :as gen]
10+
[jepsen.nemesis [combined :as nc]
11+
[time :as nt]]))
12+
13+
(defn nemesis-package
14+
"Constructs a nemesis and generators for Tarantool"
15+
[opts]
16+
(let [opts (update opts :faults set)]
17+
(nc/nemesis-package opts)))

src/tarantool/runner.clj

Lines changed: 47 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,14 @@
1212
[control :as c]
1313
[independent :as independent]
1414
[generator :as gen]
15-
[nemesis :as nemesis]
1615
[tests :as tests]
1716
[util :refer [timeout meh]]]
1817
[jepsen.checker.timeline :as timeline]
1918
;[knossos.model :as model]
2019
[jepsen.os.ubuntu :as ubuntu]
2120
[tarantool [db :as db]
2221
[errcode :as err]
22+
[nemesis :as nemesis]
2323
[register :as register]
2424
[sets :as sets]
2525
[counter :as counter]]))
@@ -69,6 +69,32 @@
6969
;:pages {:serialized-indices [true false]}
7070
:register {}})
7171

72+
(def nemeses
73+
"Types of faults a nemesis can create."
74+
#{:pause :kill :partition :clock})
75+
76+
(def standard-nemeses
77+
"Combinations of nemeses for tests"
78+
[[]
79+
[:pause]
80+
[:kill]
81+
[:partition]
82+
[:pause :kill :partition :clock]])
83+
84+
(def special-nemeses
85+
"A map of special nemesis names to collections of faults"
86+
{:none []
87+
:standard [:pause :kill :partition :clock :member]
88+
:all [:pause :kill :partition :clock :member]})
89+
90+
(defn parse-nemesis-spec
91+
"Takes a comma-separated nemesis string and returns a collection of keyword
92+
faults."
93+
[spec]
94+
(->> (str/split spec #",")
95+
(map keyword)
96+
(mapcat #(get special-nemeses % [%]))))
97+
7298
(def cli-opts
7399
"Options for test runners."
74100
[["-v" "--version VERSION"
@@ -81,6 +107,15 @@
81107
:parse-fn keyword
82108
:missing (str "--workload " (cli/one-of workloads))
83109
:validate [workloads (cli/one-of workloads)]]
110+
[nil "--nemesis FAULTS" "A comma-separated list of nemesis faults to enable"
111+
:parse-fn parse-nemesis-spec
112+
:validate [(partial every? (into nemeses (keys special-nemeses)))
113+
(str "Faults must be one of " nemeses " or "
114+
(cli/one-of special-nemeses))]]
115+
[nil "--nemesis-interval SECONDS" "How long to wait between nemesis faults"
116+
:default 3
117+
:parse-fn read-string
118+
:validate [#(and (number? %) (pos? %)) "must be a positive number"]]
84119
["-e" "--engine NAME"
85120
"What Tarantool data engine should we use?"
86121
:default "memtx"]])
@@ -122,7 +157,15 @@
122157
(defn tarantool-test
123158
[opts]
124159
(let [workload ((get workloads (:workload opts)) opts)
125-
nemesis nemesis/noop
160+
nemesis (nemesis/nemesis-package
161+
{:db db/db
162+
:nodes (:nodes opts)
163+
:faults (:nemesis opts)
164+
:partition {:targets [:primaries]}
165+
:pause {:targets [nil :one :primaries :majority :all]}
166+
:kill {:targets [nil :one :primaries :majority :all]}
167+
:interval (:nemesis-interval opts)})
168+
_ (info (pr-str nemesis))
126169
gen (->> (:generator workload)
127170
(gen/nemesis (:generator nemesis))
128171
(gen/time-limit (:time-limit opts)))
@@ -136,15 +179,15 @@
136179
(merge tests/noop-test
137180
opts
138181
{:client (:client workload)
139-
:nemesis nemesis
182+
:nemesis (:nemesis nemesis)
140183
:name (str "tarantool-" (:version opts))
141184
:os ubuntu/os
142185
:db (db/db (:version opts))
143186
:engine (:engine opts)
144187
:mvcc (:mvcc opts)
145188
:pure-generators true
146189
:generator gen
147-
:checker (checker/compose {:perf (checker/perf)
190+
:checker (checker/compose {:perf (checker/perf {:nemeses (:perf nemesis)})
148191
:clock-skew (checker/clock-plot)
149192
:crash (crash-checker)
150193
:timeline (timeline/html)

0 commit comments

Comments
 (0)