Sync complete state on checksum failure
This commit is contained in:
parent
bd08ea5ec5
commit
763e6f2fc8
2 changed files with 27 additions and 39 deletions
|
@ -18,30 +18,24 @@
|
||||||
(let [client-id (java.util.UUID/randomUUID)
|
(let [client-id (java.util.UUID/randomUUID)
|
||||||
server-shadow (atom cs/empty-state)]
|
server-shadow (atom cs/empty-state)]
|
||||||
(add-watch state client-id (fn [_ _ _ new-state]
|
(add-watch state client-id (fn [_ _ _ new-state]
|
||||||
(when-let [msg (cs/diff-states new-state server-shadow)]
|
(when-let [msg (cs/diff-states new-state @server-shadow)]
|
||||||
(a/put! to msg)
|
(a/put! to msg)
|
||||||
(reset! server-shadow new-state))))
|
(reset! server-shadow new-state))))
|
||||||
(a/go-loop []
|
(a/go-loop []
|
||||||
(when-let [{:keys [type diff hash shadow-hash] :as msg} (<! from)]
|
(if-let [{:keys [type diff hash shadow-hash] :as msg} (<! from)]
|
||||||
(condp = type
|
(do (condp = type
|
||||||
:diff (do
|
:diff (let [new-shadow (swap! server-shadow sync/patch-state diff)]
|
||||||
(println "Received client diff:" shadow-hash "->" hash)
|
(if (= (hasch/uuid new-shadow) hash)
|
||||||
(println "Before shadow:" (hasch/uuid @server-shadow) @server-shadow)
|
(let [new-state (swap! state sync/patch-state diff)]
|
||||||
(if (= (hasch/uuid @server-shadow) shadow-hash)
|
(>! @to-db diff))
|
||||||
(println "Before hash check: good")
|
(do (println "Hash check failed --> complete sync")
|
||||||
(println "Before hash check: FAIL"))
|
(let [sync-state @state]
|
||||||
(let [new-shadow (swap! server-shadow #(sync/patch-state % diff))
|
(reset! server-shadow sync-state)
|
||||||
new-state (swap! state #(sync/patch-state % diff))]
|
(a/put! to (cs/complete-sync-response sync-state))))))
|
||||||
;; TODO: check if hashes match
|
:complete (let [new-state (reset! server-shadow @state)]
|
||||||
(println "After shadow:" (hasch/uuid new-shadow) new-shadow)
|
(a/put! to (cs/complete-sync-response new-state)))
|
||||||
(if (= (hasch/uuid new-shadow) hash)
|
(println "Invalid msg:" msg))
|
||||||
(println "After hash check: good")
|
(recur))
|
||||||
(println "After hash check: FAIL"))
|
|
||||||
(>! @to-db diff)))
|
|
||||||
:complete (let [new-state (reset! server-shadow @state)]
|
|
||||||
(a/put! to (cs/complete-sync-response new-state)))
|
|
||||||
(println "Invalid msg:" msg))
|
|
||||||
(recur)
|
|
||||||
(remove-watch state client-id)))))
|
(remove-watch state client-id)))))
|
||||||
|
|
||||||
(defn init [_to-db grubs recipes]
|
(defn init [_to-db grubs recipes]
|
||||||
|
|
|
@ -16,22 +16,16 @@
|
||||||
;; TODO: reset shadow only if send succeeds
|
;; TODO: reset shadow only if send succeeds
|
||||||
(reset! client-shadow new))))
|
(reset! client-shadow new))))
|
||||||
(go-loop []
|
(go-loop []
|
||||||
(when-let [{:keys [type diff hash shadow-hash] :as msg} (<! to)]
|
(if-let [{:keys [type diff hash shadow-hash] :as msg} (<! to)]
|
||||||
(condp = type
|
(do (condp = type
|
||||||
:diff (do
|
:diff (let [new-shadow (swap! client-shadow #(sync/patch-state % diff))]
|
||||||
;(logs "Received server diff:" shadow-hash "->" hash)
|
(if (= (hasch/uuid new-shadow) hash)
|
||||||
;(logs "Before shadow:" (hasch/uuid @client-shadow) @client-shadow)
|
(swap! app-state #(sync/patch-state % diff))
|
||||||
(if (= (hasch/uuid @client-shadow) shadow-hash)
|
(do (log "Hash check failed --> complete sync")
|
||||||
(log "Before hash check: good")
|
(a/put! from cs/complete-sync-request))))
|
||||||
(log "Before hash check: FAIL"))
|
:complete (do (reset! client-shadow (:state msg))
|
||||||
(let [new-shadow (swap! client-shadow #(sync/patch-state % diff))
|
(reset! app-state (:state msg)))
|
||||||
new-state (swap! app-state #(sync/patch-state % diff))]
|
(logs "Invalid msg:" msg))
|
||||||
;(logs "After shadow:" (hasch/uuid @client-shadow) @client-shadow)
|
(recur))
|
||||||
(if (= (hasch/uuid new-shadow) hash)
|
(remove-watch app-state :app-state)))
|
||||||
(log "After hash check: good")
|
|
||||||
(log "After hash check: FAIL"))))
|
|
||||||
:complete (do (reset! client-shadow (:state msg))
|
|
||||||
(reset! app-state (:state msg)))
|
|
||||||
(logs "Invalid msg:" msg))
|
|
||||||
(recur)))
|
|
||||||
(a/put! from cs/complete-sync-request)))
|
(a/put! from cs/complete-sync-request)))
|
||||||
|
|
Loading…
Add table
Reference in a new issue