From 8dff5eec4dced2f359d7d35d2697ce86e1f26f1f Mon Sep 17 00:00:00 2001 From: Janne Valkealahti Date: Sun, 23 Aug 2015 19:16:51 +0100 Subject: [PATCH] Tweak jepsen partition tests having better output" --- docs/src/reference/asciidoc/appendix.adoc | 64 +++++++++++++++--- .../images/sm-tech-partition-half-1.png | Bin 0 -> 33382 bytes .../images/sm-tech-partition-half-2.png | Bin 0 -> 34596 bytes .../images/sm-tech-partition-half.png | Bin 32077 -> 0 bytes .../spring_statemachine_jepsen/checker.clj | 55 ++++++++++++++- .../src/spring_statemachine_jepsen/core.clj | 51 ++++++++------ 6 files changed, 142 insertions(+), 28 deletions(-) create mode 100644 docs/src/reference/asciidoc/images/sm-tech-partition-half-1.png create mode 100644 docs/src/reference/asciidoc/images/sm-tech-partition-half-2.png delete mode 100644 docs/src/reference/asciidoc/images/sm-tech-partition-half.png diff --git a/docs/src/reference/asciidoc/appendix.adoc b/docs/src/reference/asciidoc/appendix.adoc index 144a94b2..b26a464b 100644 --- a/docs/src/reference/asciidoc/appendix.adoc +++ b/docs/src/reference/asciidoc/appendix.adoc @@ -537,31 +537,79 @@ What's happening in above chart: ==== Partition Tolerance We need to always assume that sooner or later things in a cluster will -go bad whether that is just a crash of a `Zookeeper` or a state +go bad whether it is just a crash of a `Zookeeper` instance, a state machine or a network problem like a `brain split`. Brain split is a situation where existing cluster members are isolated so that only part of a hosts are able to see each others. Usual scenario is that a -brain split will create a minority and majority of an ensemble where -hosts in a minority cannot participate in an ensemble anymore until -network status has been healed. +brain split will create a minority and majority partitions of an +ensemble where hosts in a minority cannot participate in an ensemble +anymore until network status has been healed. -In this test we will demostrate that a various types of brain-split's in -an ensemble will eventually cause n fully synchronized state of all +In below tests we will demostrate that various types of brain-split's in +an ensemble will eventually cause fully synchronized state of all distributed state machines. -image::images/sm-tech-partition-half.png[width=500] +There are two scenarious having a one straight brain split in a +network where where `Zookeeper` and `Statemachine` instances are +split in half, assuming each `Statemachine` will connect into a +local `Zookeeper` instance: +* If current zookeeper leader is kept in a majority, all clients + connected into majority will keep functioning properly. +* If current zookeeper leader is left in minority, all clients will + disconnect from it and will try to connect back till previous + minority members has succesfully joined back to existing majority + ensemble. + +[NOTE] +==== +In our current `jepsen` tests we can't separate zookeeper split brains +scenarios between leader left in marojity or minority so we need to +run tests multiple time to accomplish this situation. +==== + +[NOTE] +==== +In below plots we have mapped a state machine error state into a +`error` to indicate that `state machine` is in error stete instead or +a normal state. Please indicate this when interpering chart states. +==== + +In this first test we show that when existing zookeeper leader was +kept in majority, 3 out of 5 machines will continue as is. + +image::images/sm-tech-partition-half-1.png[width=500] What's happening in above chart: * First event `C` is sent to all machine leading a state change to `S211`. * Jepsen nemisis will cause a brain-split which is causing partitions of `n1/n2/n5` and `n3/n4`. Nodes `n3/n4` are left in minority and - nodes `n1/n2/n5` constructs a new healthy majority. Nodes in + nodes `n1/n2/n5` construct a new healthy majority. Nodes in majority will keep function without problems but nodes in minority will get into error state. * Jepsen will heal network and after some time nodes `n3/n4` will join back into ensemble and synchronize its distributed status. +* Lastly event `K1` is sent to all state machines to ensure that ensemble + is working properly. This state change will lead back to state + `S21`. + +In this second test we show that when existing zookeeper leader was +kept in majority, all machines will error out: + +image::images/sm-tech-partition-half-2.png[width=500] +What's happening in above chart: + +* First event `C` is sent to all machine leading a state change to + `S211`. +* Jepsen nemisis will cause a brain-split which is causing partitions + so that existing `Zookeeper` leader is kept in minority and all + instances are disconnected from ensemble. +* Jepsen will heal network and after some time all nodes will join + back into ensemble and synchronize its distributed status. +* Lastly event `K1` is sent to all state machines to ensure that ensemble + is working properly. This state change will lead back to state + `S21`. ==== Crash and Join Tolerance In this test we will demostrate that killing existing state machine diff --git a/docs/src/reference/asciidoc/images/sm-tech-partition-half-1.png b/docs/src/reference/asciidoc/images/sm-tech-partition-half-1.png new file mode 100644 index 0000000000000000000000000000000000000000..73e1c7cad3f3038e018d265f477a3960a1aad8b9 GIT binary patch literal 33382 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 literal 0 HcmV?d00001 diff --git a/docs/src/reference/asciidoc/images/sm-tech-partition-half-2.png b/docs/src/reference/asciidoc/images/sm-tech-partition-half-2.png new file mode 100644 index 0000000000000000000000000000000000000000..a046ffefb0baaad6addb6d8536e0f65b0460db87 GIT binary patch literal 34596 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 Q{=Uf6c&X84L%aR|5BH0Bg8%>k literal 0 HcmV?d00001 diff --git a/docs/src/reference/asciidoc/images/sm-tech-partition-half.png b/docs/src/reference/asciidoc/images/sm-tech-partition-half.png deleted file mode 100644 index a8ccb099642469d9d32b5ede27e18beeefa77955..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32077 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

O9Y2^_Q2?i6iFP;k`r?M`Wu{oQz$3u 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 E0py7@`Tzg` diff --git a/jepsen/spring-statemachine-jepsen/src/spring_statemachine_jepsen/checker.clj b/jepsen/spring-statemachine-jepsen/src/spring_statemachine_jepsen/checker.clj index d76965c8..3e61cc0e 100644 --- a/jepsen/spring-statemachine-jepsen/src/spring_statemachine_jepsen/checker.clj +++ b/jepsen/spring-statemachine-jepsen/src/spring_statemachine_jepsen/checker.clj @@ -13,7 +13,7 @@ [gnuplot.core :as g])) (def nodetovalue {"n1" 1 "n2" 2 "n3" 3 "n4" 4 "n5" 5 }) -(def statetovalue {"S11" 1 "S12" 2 "S211" 3 "S212" 4 }) +(def statetovalue {"S11" 1 "S12" 2 "S211" 3 "S212" 4 "error" 5 }) (def variabletovalue {"v1" 1 "v2" 2 "v3" 3 "v4" 4 "v5" 5 "v6" 6 "v7" 7 "v8" 8}) (defn shiftvalue @@ -76,6 +76,20 @@ (vector (reduce-kv (fn [vec key value] (conj vec (vector (get value :time) (get nodetovalue (name (last (keys (get value :value))))) "X")) ) [] (vec data))))) +(defn extract-plot-data6 + [history] + (let [data + (->> history + (filter #(= :ok (:type %))) + (filter #(= :statesnoexpect (:f %))) + (group-by :process))] + (vector + (reduce-kv (fn [vec key value] (conj vec (vector (get value :time) (shiftvalue (get statetovalue (last (get value :value))) (get value :process) ))) ) [] (get data 0)) + (reduce-kv (fn [vec key value] (conj vec (vector (get value :time) (shiftvalue (get statetovalue (last (get value :value))) (get value :process) ))) ) [] (get data 1)) + (reduce-kv (fn [vec key value] (conj vec (vector (get value :time) (shiftvalue (get statetovalue (last (get value :value))) (get value :process) ))) ) [] (get data 2)) + (reduce-kv (fn [vec key value] (conj vec (vector (get value :time) (shiftvalue (get statetovalue (last (get value :value))) (get value :process) ))) ) [] (get data 3)) + (reduce-kv (fn [vec key value] (conj vec (vector (get value :time) (shiftvalue (get statetovalue (last (get value :value))) (get value :process) ))) ) [] (get data 4))))) + (defn plot1! [test model history] @@ -172,6 +186,38 @@ output-path) {:valid? true}) +(defn plot4! + [test model history] + + (let [output-path (.getCanonicalPath (store/path! test "states.png"))] + (g/raw-plot! [[:set :key :outside] + [:set :style :textbox :opaque] + [:set :terminal :qt :size (keyword "900,450")] + [:set :yrange (keyword "[0.5:5.5]")] + [:set :y2range (keyword "[0.5:5.5]")] + [:set :xtics :format "%h\nns"] + [:set :xlabel "elapsed time"] + [:set :ylabel "states in nodes"] + [:set :y2label "events via nodes"] + [:set :ytics 1] + [:set :ytics (keyword "('S21' 1, 'S22' 2, 'S211' 3, 'S212' 4, 'error' 5)")] + [:set :ytics :nomirror] + [:set :y2tics 1] + [:set :y2tics (keyword "('n1' 1, 'n2' 2, 'n3' 3, 'n4' 4, 'n5' 5)")] + [:plot + (g/list ["-" :title "states n1" :with :steps :lw :3] + ["-" :title "states n2" :with :steps :lw :3] + ["-" :title "states n3" :with :steps :lw :3] + ["-" :title "states n4" :with :steps :lw :3] + ["-" :title "states n5" :with :steps :lw :3] + ["-" :title "events" :with :labels :center :boxed :font ",15" :axis :x1y2] + )]] + (into + (extract-plot-data6 history) + (extract-plot-data2 history))) + output-path) + {:valid? true}) + (defn checker1 "Constructs a Jepsen checker." [] @@ -192,3 +238,10 @@ (reify Checker (check [_ test model history] (if (env :plot) (plot3! test model history) {:valid? true})))) + +(defn checker4 + "Constructs a Jepsen checker." + [] + (reify Checker + (check [_ test model history] + (if (env :plot) (plot4! test model history) {:valid? true})))) diff --git a/jepsen/spring-statemachine-jepsen/src/spring_statemachine_jepsen/core.clj b/jepsen/spring-statemachine-jepsen/src/spring_statemachine_jepsen/core.clj index 22a651f5..d971c8e9 100644 --- a/jepsen/spring-statemachine-jepsen/src/spring_statemachine_jepsen/core.clj +++ b/jepsen/spring-statemachine-jepsen/src/spring_statemachine_jepsen/core.clj @@ -18,6 +18,7 @@ [spring-statemachine-jepsen.checker :refer [checker1]] [spring-statemachine-jepsen.checker :refer [checker2]] [spring-statemachine-jepsen.checker :refer [checker3]] + [spring-statemachine-jepsen.checker :refer [checker4]] [jepsen.checker.timeline :as timeline] [jepsen.control.net :as net] [jepsen.os.debian :as debian] @@ -41,18 +42,20 @@ (http/post (str "http://" (name node) ":8080/event") {:form-params {:id (str event) :testVariable value}})) -(defn sm-read-states - "Reading states from a state machine" - [node] - (let [response (http/get (str "http://" (name node) ":8080/states") {:as :json})] - (get response :body))) - (defn sm-read-status-ok? "Read status and check that there is no errors" [node] (let [response (http/get (str "http://" (name node) ":8080/status") {:as :json})] (= (get (get response :body) :hasStateMachineError) false))) +(defn sm-read-states + "Reading states from a state machine" + [node] + (if (sm-read-status-ok? node) + (let [response (http/get (str "http://" (name node) ":8080/states") {:as :json})] + (get response :body)) + (vec ["error"]))) + (defn sm-read-state-variable "Read status and check that there is no errors" [node key] @@ -82,8 +85,7 @@ (Thread/sleep 1000) (if (sm-read-status-ok? node) false true) (catch Exception e true)) - (recur)))) - ) + (recur))))) (defn start! [node] @@ -155,6 +157,11 @@ ) (catch RuntimeException e (assoc op :type :fail :value (.getMessage e)))) + :statesnoexpect (try + (let [res (sm-read-states client)] + (assoc op :type :ok :value (vec res))) + (catch RuntimeException e + (assoc op :type :fail :value (.getMessage e)))) :event (try (sm-send-event client (:e op)) (assoc op :type :ok :value (:e op)) @@ -187,6 +194,17 @@ :f :states :s expect}])))))) +(defn gen-read-states-noexpect + "Read states n times." + [times] + (gen/clients + (gen/each + (gen/seq + (take (* times 2) + (cycle [(gen/sleep 1) + {:type :invoke + :f :statesnoexpect}])))))) + (defn gen-send-event "Send event one time to random node." [event] @@ -307,24 +325,19 @@ "Generates event and checks states while splitting network" [] (gen/phases - (gen-read-states 5 ["S0","S1","S11"]) + (gen-read-states-noexpect 10) (gen-send-event-all "C") - (gen-read-states 5 ["S0","S2","S21","S211"]) - (gen-status 2) + (gen-read-states-noexpect 10) ;start nemesis, split network (gen/nemesis (gen/once {:type :info :f :start})) - (gen-read-states 15 ["S0","S2","S21","S211"]) - (gen-status 5) + (gen-read-states-noexpect 15) ;stop nemesis, heal network (gen/nemesis (gen/once {:type :info :f :stop})) - (gen-status 5) - (gen-read-states 15 ["S0","S2","S21","S211"]) + (gen-read-states-noexpect 100) (gen-send-event-all "K") - (gen-read-states 10 ["S0","S1","S11"]) - (gen-status 30) - (gen-read-states 10 ["S0","S1","S11"]))) + (gen-read-states-noexpect 10))) (defn event-gen-5 "Generates starts and stops and checks joins" @@ -431,7 +444,7 @@ (event-test "partition-half" {:nemesis (nemesis/partition-random-halves) :generator (event-gen-4) - :checker (checker1)})) + :checker (checker4)})) (defn stop-start-test "Stops and start nodes checking join is okk."