Skip to content

Commit b609de8

Browse files
committed
Initial setup for hazelcast-raft testing
1 parent 3bfb8a2 commit b609de8

File tree

4 files changed

+80
-27
lines changed

4 files changed

+80
-27
lines changed

hazelcast/project.clj

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
1-
(defproject jepsen.hazelcast "0.1.0-SNAPSHOT"
2-
:description "Jepsen tests for hazelcast"
1+
(defproject jepsen.hazelcast-raft "0.1.0-SNAPSHOT"
2+
:description "Jepsen tests for hazelcast-raft"
33
:url "http://jepsen.io/"
44
:license {:name "Eclipse Public License"
55
:url "http://www.eclipse.org/legal/epl-v10.html"}
6+
:repositories [["jitpack" "https://jitpack.io"]]
67
:dependencies [[org.clojure/clojure "1.8.0"]
78
[jepsen "0.1.6"]
8-
[com.hazelcast/hazelcast-client "3.8"]]
9+
[com.github.mdogan.hazelcast/hazelcast-raft-client "raft-v3"]]
910
:main jepsen.hazelcast)

hazelcast/server/project.clj

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,12 @@
55
:url "http://www.eclipse.org/legal/epl-v10.html"}
66
:source-paths ["src"]
77
:java-source-paths ["java"]
8+
:repositories [["jitpack" "https://jitpack.io"]]
89
:dependencies [[org.clojure/clojure "1.8.0"]
910
[org.clojure/tools.cli "0.3.5"]
1011
[org.clojure/tools.logging "0.3.1"]
1112
[spootnik/unilog "0.7.13"]
12-
[com.hazelcast/hazelcast "3.8.3"]]
13+
[com.github.mdogan.hazelcast/hazelcast-raft "raft-v3"]]
1314
:profiles {:uberjar {:uberjar-name "hazelcast-server.jar"}}
1415
:main jepsen.hazelcast-server
1516
:aot [jepsen.hazelcast-server])

hazelcast/server/src/jepsen/hazelcast_server.clj

Lines changed: 47 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,49 @@
77
(:import (com.hazelcast.core Hazelcast)
88
(com.hazelcast.config Config
99
LockConfig
10+
ServiceConfig
1011
MapConfig
11-
QuorumConfig)))
12+
QuorumConfig)
13+
(com.hazelcast.raft RaftConfig
14+
RaftMember)))
1215

1316
(def opt-spec
1417
[["-m" "--members MEMBER-LIST" "Comma-separated list of peers to connect to"
1518
:parse-fn (fn [m]
1619
(str/split m #"\s*,\s*"))]])
1720

21+
(defn prepareRaftServiceConfig
22+
"Prepare Hazelcast RaftConfig and ServiceConfig"
23+
[members]
24+
(let [raftConfig (RaftConfig.)
25+
serviceConfig (ServiceConfig.)
26+
27+
; add raft members
28+
_ (doseq [member members]
29+
(info "Adding " member " to raft group")
30+
(.addMember raftConfig (RaftMember. (str member ":5701") member)))
31+
32+
_ (.setLeaderElectionTimeoutInMillis raftConfig 1000)
33+
_ (.setLeaderHeartbeatPeriodInMillis raftConfig 1000)
34+
35+
; prepare service config
36+
_ (.setEnabled serviceConfig true)
37+
_ (.setName serviceConfig com.hazelcast.raft.impl.service.RaftService/SERVICE_NAME)
38+
_ (.setClassName serviceConfig (.getName com.hazelcast.raft.impl.service.RaftService))
39+
_ (.setConfigObject serviceConfig raftConfig)
40+
]
41+
serviceConfig))
42+
43+
(defn prepareAtomicLongServiceConfig
44+
"Prepare Raft AtomicLong service config"
45+
[]
46+
(let [serviceConfig (ServiceConfig.)
47+
_ (.setEnabled serviceConfig true)
48+
_ (.setName serviceConfig com.hazelcast.raft.service.atomiclong.RaftAtomicLongService/SERVICE_NAME)
49+
_ (.setClassName serviceConfig (.getName com.hazelcast.raft.service.atomiclong.RaftAtomicLongService))
50+
]
51+
serviceConfig))
52+
1853
(defn -main
1954
"Go go go"
2055
[& args]
@@ -23,25 +58,30 @@
2358
summary
2459
errors]} (cli/parse-opts args opt-spec)
2560
config (Config.)
61+
members (:members options)
2662

2763
; Timeouts
28-
_ (.setProperty config "hazelcast.client.heartbeat.interval" "1000")
29-
_ (.setProperty config "hazelcast.client.heartbeat.timeout" "5000")
30-
_ (.setProperty config "hazelcast.client.invocation.timeout.seconds" "5")
64+
_ (.setProperty config "hazelcast.client.max.no.heartbeat.seconds" "5")
3165
_ (.setProperty config "hazelcast.heartbeat.interval.seconds" "1")
32-
_ (.setProperty config "hazelcast.master.confirmation.interval.seconds" "1")
3366
_ (.setProperty config "hazelcast.max.no.heartbeat.seconds" "5")
34-
_ (.setProperty config "hazelcast.max.no.master.confirmation.seconds" "10")
3567
_ (.setProperty config "hazelcast.operation.call.timeout.millis" "5000")
68+
_ (.setProperty config "hazelcast.wait.seconds.before.join" "0")
69+
_ (.setProperty config "hazelcast.merge.first.run.delay.seconds" "1")
70+
_ (.setProperty config "hazelcast.merge.next.run.delay.seconds" "1")
3671

3772
; Network config
3873
_ (.. config getNetworkConfig getJoin getMulticastConfig
3974
(setEnabled false))
4075
tcp-ip (.. config getNetworkConfig getJoin getTcpIpConfig)
41-
_ (doseq [member (:members options)]
76+
_ (doseq [member members]
4277
(.addMember tcp-ip member))
4378
_ (.setEnabled tcp-ip true)
4479

80+
; prepare raft services
81+
servicesConfig (.getServicesConfig config)
82+
_ (.addServiceConfig servicesConfig (prepareRaftServiceConfig members))
83+
_ (.addServiceConfig servicesConfig (prepareAtomicLongServiceConfig))
84+
4585
; Quorum for split-brain protection
4686
quorum (doto (QuorumConfig.)
4787
(.setName "majority")

hazelcast/src/jepsen/hazelcast.clj

Lines changed: 27 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,7 @@
2626
(com.hazelcast.client.config ClientConfig)
2727
(com.hazelcast.client HazelcastClient)
2828
(com.hazelcast.core HazelcastInstance)
29-
(com.hazelcast.core IMap)
30-
(com.hazelcast.spi.discovery NodeFilter)))
29+
(com.hazelcast.core IMap)))
3130

3231
(def local-server-dir
3332
"Relative path to local server project directory"
@@ -79,7 +78,6 @@
7978
"/usr/bin/java"
8079
:-jar jar
8180
:--members (->> (:nodes test)
82-
(remove #{node})
8381
(map cn/ip)
8482
(str/join ",")))))
8583

@@ -119,11 +117,6 @@
119117
_ (.setProperty config "hazelcast.client.heartbeat.interval" "1000")
120118
_ (.setProperty config "hazelcast.client.heartbeat.timeout" "5000")
121119
_ (.setProperty config "hazelcast.client.invocation.timeout.seconds" "5")
122-
_ (.setProperty config "hazelcast.heartbeat.interval.seconds" "1")
123-
_ (.setProperty config "hazelcast.master.confirmation.interval.seconds" "1")
124-
_ (.setProperty config "hazelcast.max.no.heartbeat.seconds" "5")
125-
_ (.setProperty config "hazelcast.max.no.master.confirmation.seconds" "10")
126-
_ (.setProperty config "hazelcast.operation.call.timeout.millis" "5000")
127120

128121
net (doto (.getNetworkConfig config)
129122
; Don't retry operations when network fails (!?)
@@ -140,14 +133,6 @@
140133
; Only talk to our node (the client's smart and will try to talk to
141134
; everyone, but we're trying to simulate clients in different network
142135
; components here)
143-
node-filter (reify NodeFilter
144-
(test [this candidate]
145-
(prn node :testing candidate)
146-
(info node :testing candidate)
147-
true))
148-
_ (.. net
149-
getDiscoveryConfig
150-
(setNodeFilter node-filter))
151136
; Connect to our node
152137
_ (.addAddress net (into-array String [node]))]
153138
(HazelcastClient/newHazelcastClient config)))
@@ -168,6 +153,28 @@
168153
(teardown! [this test]
169154
(.terminate conn))))
170155

156+
157+
(defn create-raft-atomic-long
158+
"Creates a new Raft based AtomicLong"
159+
[client name test]
160+
(com.hazelcast.raft.impl.client.RaftAtomicLong/create client name (count (:nodes test))))
161+
162+
(defn raft-atomic-long-id-client
163+
"Generates unique IDs using a Raft based AtomicLong"
164+
[conn atomic-long]
165+
(reify client/Client
166+
(setup! [_ test node]
167+
(let [conn (connect node)]
168+
(raft-atomic-long-id-client conn
169+
(create-raft-atomic-long conn "jepsen.atomic-long" test))))
170+
171+
(invoke! [this test op]
172+
(assert (= (:f op) :generate))
173+
(assoc op :type :ok, :value (.incrementAndGet atomic-long)))
174+
175+
(teardown! [this test]
176+
(.terminate conn))))
177+
171178
(defn atomic-ref-id-client
172179
"Generates unique IDs using an AtomicReference"
173180
[conn atomic-ref]
@@ -394,6 +401,10 @@
394401
:generator (->> {:type :invoke, :f :generate}
395402
(gen/stagger 1))
396403
:checker (checker/unique-ids)}
404+
:raft-atomic-long-ids {:client (raft-atomic-long-id-client nil nil)
405+
:generator (->> {:type :invoke, :f :generate}
406+
(gen/stagger 1))
407+
:checker (checker/unique-ids)}
397408
:id-gen-ids {:client (id-gen-id-client nil nil)
398409
:generator {:type :invoke, :f :generate}
399410
:checker (checker/unique-ids)}})

0 commit comments

Comments
 (0)