Browse Source

enhance: trigger master-re-check by another atom(instead of reuse *master-client?)

rcmerci 6 months ago
parent
commit
d6b85f10a4

+ 3 - 3
src/main/frontend/worker/db_worker.cljs

@@ -873,9 +873,9 @@
                                   (let [[_graph service] @*service
                                         method-k (keyword (first args))]
                                     (cond
-                                      (or (contains? #{:thread-api/init-shared-service :thread-api/sync-app-state} method-k)
-                                          (nil? service)
-                                          @shared-service/*master-client?)
+                                      (or @shared-service/*master-client?
+                                          (contains? #{:thread-api/init-shared-service :thread-api/sync-app-state} method-k)
+                                          (nil? service))
                                       (apply f args)
 
                                       :else

+ 8 - 8
src/main/frontend/worker/shared_service.cljs

@@ -5,8 +5,6 @@
             [lambdaisland.glogi :as log]
             [promesa.core :as p]))
 
-;; TODO:
-
 ;; Idea and code copied from https://github.com/Matt-TOTW/shared-service/blob/master/src/sharedService.ts
 ;; Related thread: https://github.com/rhashimoto/wa-sqlite/discussions/81
 
@@ -14,6 +12,8 @@
 
 (defonce *master-client? (atom false))
 
+(defonce *master-re-check-trigger (atom nil))
+
 ;;; common-channel - Communication related to master-client election.
 ;;; client-channel - For API request-response data communication.
 (defonce *common-channel (atom nil))
@@ -188,7 +188,7 @@
                                       (fn [_lock]
                                         ;; The master has gone, elect the new master
                                         (log/debug "master has gone" nil)
-                                        (reset! *master-client? :re-check)))))
+                                        (reset! *master-re-check-trigger :re-check)))))
       (p/resolve! @*register-finish-promise?))))
 
 (defn- <re-requests-in-flight-on-slave!
@@ -289,7 +289,7 @@
           common-channel (ensure-common-channel service-name)
           client-id (ensure-client-id)
           check-master-slave-fn!
-          (fn [_re-elect?]
+          (fn []
             (check-master-or-slave-client!
              service-name
              #(on-become-master
@@ -297,14 +297,14 @@
                on-become-master-handler (:ready status))
              #(on-become-slave
                client-id service-name common-channel (:ready status))))]
-    (check-master-slave-fn! false)
+    (check-master-slave-fn!)
 
-    (add-watch *master-client? :check-master
+    (add-watch *master-re-check-trigger :check-master
                (fn [_ _ _ new-value]
                  (when (= new-value :re-check)
                    (p/do!
-                    (p/delay 100)
-                    (check-master-slave-fn! true)))))
+                    (p/delay 100)     ; why need delay here?
+                    (check-master-slave-fn!)))))
 
     {:proxy (js/Proxy. target
                        #js {:get (fn [target method]