Skip to content

Commit 5eb141e

Browse files
committed
Add nemeses support to runner and db
Works: clock nemesis Closes #34 Closes #16 (kill) Closes #17 (partition) Closes #21 (pause) Closes #25 (clock)
1 parent 110e7d4 commit 5eb141e

File tree

2 files changed

+74
-12
lines changed

2 files changed

+74
-12
lines changed

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: 57 additions & 12 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]]))
@@ -74,6 +74,32 @@
7474
;:pages {:serialized-indices [true false]}
7575
:register {}})
7676

77+
(def nemeses
78+
"Types of faults a nemesis can create."
79+
#{:pause :kill :partition :clock})
80+
81+
(def standard-nemeses
82+
"Combinations of nemeses for tests."
83+
[[]
84+
[:pause]
85+
[:kill]
86+
[:partition]
87+
[:pause :kill :partition :clock]])
88+
89+
(def special-nemeses
90+
"A map of special nemesis names to collections of faults."
91+
{:none []
92+
:standard [:pause :kill :partition :clock]
93+
:all [:pause :kill :partition :clock]})
94+
95+
(defn parse-nemesis-spec
96+
"Takes a comma-separated nemesis string and
97+
returns a collection of keyword faults."
98+
[spec]
99+
(->> (str/split spec #",")
100+
(map keyword)
101+
(mapcat #(get special-nemeses % [%]))))
102+
77103
(def cli-opts
78104
"Options for test runners."
79105
[["-v" "--version VERSION"
@@ -82,6 +108,15 @@
82108
[nil "--mvcc"
83109
"Enable MVCC engine"
84110
:default false]
111+
[nil "--nemesis FAULTS" "A comma-separated list of nemesis faults to enable"
112+
:parse-fn parse-nemesis-spec
113+
:validate [(partial every? (into nemeses (keys special-nemeses)))
114+
(str "Faults must be one of " nemeses " or "
115+
(cli/one-of special-nemeses))]]
116+
[nil "--nemesis-interval SECONDS" "How long to wait between nemesis faults"
117+
:default 3
118+
:parse-fn read-string
119+
:validate [#(and (number? %) (pos? %)) "must be a positive number"]]
85120
["-e" "--engine NAME"
86121
"What Tarantool data engine should we use?"
87122
:default "memtx"]])
@@ -140,7 +175,15 @@
140175
(defn tarantool-test
141176
[opts]
142177
(let [workload ((get workloads (:workload opts)) opts)
143-
nemesis nemesis/noop
178+
nemesis (nemesis/nemesis-package
179+
{:db db/db
180+
:nodes (:nodes opts)
181+
:faults (:nemesis opts)
182+
:partition {:targets [:primaries]}
183+
:pause {:targets [nil :one :primaries :majority :all]}
184+
:kill {:targets [nil :one :primaries :majority :all]}
185+
:interval (:nemesis-interval opts)})
186+
_ (info (pr-str nemesis))
144187
gen (->> (:generator workload)
145188
(gen/nemesis (:generator nemesis))
146189
(gen/time-limit (:time-limit opts)))
@@ -154,15 +197,15 @@
154197
(merge tests/noop-test
155198
opts
156199
{:client (:client workload)
157-
:nemesis nemesis
200+
:nemesis (:nemesis nemesis)
158201
:name (str "tarantool-" (:version opts))
159202
:os ubuntu/os
160203
:db (db/db (:version opts))
161204
:engine (:engine opts)
162205
:mvcc (:mvcc opts)
163206
:pure-generators true
164207
:generator gen
165-
:checker (checker/compose {:perf (checker/perf)
208+
:checker (checker/compose {:perf (checker/perf {:nemeses (:perf nemesis)})
166209
:clock-skew (checker/clock-plot)
167210
:crash (crash-checker)
168211
:timeline (timeline/html)
@@ -171,22 +214,24 @@
171214
:workload (:checker workload)})})))
172215

173216
(defn all-test-options
174-
"Takes base cli options, a collection of workloads, and a test count,
217+
"Takes base cli options, a collection of nemeses, workloads, and a test count,
175218
and constructs a sequence of test options."
176-
[cli workloads]
177-
(for [w workloads, i (range (:test-count cli))]
219+
[cli nemeses workloads]
220+
(for [n nemeses, w workloads, i (range (:test-count cli))]
178221
(assoc cli
222+
:nemesis n
179223
:workload w)))
180224

181225
(defn all-tests
182226
"Takes parsed CLI options and constructs a sequence of test options, by
183-
combining all workloads."
184-
[test-fn opts]
185-
(let [workloads (if-let [w (:workload opts)] [w]
186-
(if (:only-workloads-expected-to-pass opts)
227+
combining all workloads and nemeses."
228+
[test-fn cli]
229+
(let [nemeses (if-let [n (:nemesis cli)] [n] standard-nemeses)
230+
workloads (if-let [w (:workload cli)] [w]
231+
(if (:only-workloads-expected-to-pass cli)
187232
workloads-expected-to-pass
188233
standard-workloads))]
189-
(->> (all-test-options opts workloads)
234+
(->> (all-test-options cli nemeses workloads)
190235
(map test-fn))))
191236

192237
(defn -main

0 commit comments

Comments
 (0)