Skip to content

Commit 2147c88

Browse files
committed
Support independent keys in a register workload
Since operations on independent keys linearize independently, we can lift our single-key register test into one which operates on multiple keys. NOTE: - Test with independent keys requires option `--concurrency` with a minimal value equal to 10. - To have more time to start workload threads `max-timeout` has been increased. Closes #39
1 parent cba5d2f commit 2147c88

File tree

2 files changed

+34
-24
lines changed

2 files changed

+34
-24
lines changed

src/tarantool/client.clj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
[dom-top.core :as dt]
77
[next.jdbc.connection :as connection]))
88

9-
(def max-timeout "Longest timeout, in ms" 300000)
9+
(def max-timeout "Longest timeout, in ms" 10000000)
1010

1111
(defn conn-spec
1212
"JDBC connection spec for a node."

src/tarantool/register.clj

Lines changed: 33 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -44,28 +44,34 @@
4444
(assoc this :conn conn :node node)))
4545

4646
(invoke! [this test op]
47+
(let [[k value] (:value op)]
4748
(case (:f op)
48-
:read (let [value (:VALUE
49-
(first (sql/query conn
50-
[(str "SELECT value FROM " table-name " WHERE id = 1")])))]
51-
(assoc op :type :ok :value value))
49+
50+
:read (let [r (first (sql/query conn [(str "SELECT value FROM " table-name " WHERE id = " k)]))
51+
v (:value r)]
52+
(assoc op :type :ok, :value (independent/tuple k v)))
5253

5354
:write (do (let [con (cl/open (jepsen/primary test) test)
5455
table (clojure.string/upper-case table-name)]
5556
(j/execute! con
56-
[(str "SELECT _UPSERT(1, " (:value op) ", '" table "')")])
57-
(assoc op :type :ok)))
57+
[(str "SELECT _UPSERT(" k ", " value ", '" table "')")])
58+
(assoc op
59+
:type :ok
60+
:value (independent/tuple k value))))
5861

59-
:cas (let [[old new] (:value op)
62+
:cas (do (let [[old new] value
6063
con (cl/open (jepsen/primary test) test)
61-
table (clojure.string/upper-case table-name)]
62-
(assoc op :type (if (->> (j/execute! conn
63-
[(str "SELECT _CAS(1, " old ", " new ", '" table "')")])
64-
(first)
65-
(vals)
66-
(first))
67-
:ok
68-
:fail)))))
64+
table (clojure.string/upper-case table-name)
65+
r (->> (j/execute! con
66+
[(str "SELECT _CAS(" k ", " old ", " new ", '" table "')")])
67+
(first)
68+
(vals)
69+
(first))]
70+
(if r
71+
(assoc op
72+
:type :ok
73+
:value (independent/tuple k value))
74+
(assoc op :type :fail)))))))
6975

7076
(teardown! [_ test]
7177
(cl/with-conn-failure-retry conn
@@ -76,11 +82,15 @@
7682
(defn workload
7783
[opts]
7884
{:client (Client. nil)
79-
:generator (->> (gen/mix [r w cas])
80-
(gen/stagger 1/10)
81-
(gen/nemesis nil)
82-
(gen/time-limit (:time-limit opts)))
83-
:checker (checker/compose
84-
{:timeline (timeline/html)
85-
:linearizable (checker/linearizable {:model (model/cas-register 0)
86-
:algorithm :linear})})})
85+
:generator (independent/concurrent-generator
86+
10
87+
(range)
88+
(fn [k]
89+
(->> (gen/mix [w cas])
90+
(gen/reserve 5 r)
91+
(gen/limit 100))))
92+
:checker (independent/checker
93+
(checker/compose
94+
{:timeline (timeline/html)
95+
:linearizable (checker/linearizable {:model (model/cas-register 0)
96+
:algorithm :linear})}))})

0 commit comments

Comments
 (0)