Sync complete state on checksum failure

This commit is contained in:
Nicholas Kariniemi 2014-08-30 07:35:43 +03:00
parent bd08ea5ec5
commit 763e6f2fc8
2 changed files with 27 additions and 39 deletions

View file

@ -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]

View file

@ -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)))