You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@accumulo.apache.org by GitBox <gi...@apache.org> on 2022/09/15 15:57:06 UTC

[GitHub] [accumulo] ctubbsii commented on a diff in pull request #2778: Add version check to ZooPropStore

ctubbsii commented on code in PR #2778:
URL: https://github.com/apache/accumulo/pull/2778#discussion_r972166515


##########
server/base/src/main/java/org/apache/accumulo/server/conf/ServerConfigurationFactory.java:
##########
@@ -140,4 +158,114 @@ public void connectionEvent() {
       // no-op. changes handled by prop store impl
     }
   }
+
+  private class ConfigRefreshRunner {
+    private static final long MIN_JITTER_DELAY = 1;
+
+    private static final long MAX_JITTER_DELAY = 23;
+    private final ScheduledFuture<?> refreshTaskFuture;
+
+    ConfigRefreshRunner() {
+
+      Runnable refreshTask = this::verifySnapshotVersions;
+      // staggering the initial delay prevents synchronization of Accumulo servers communicating
+      // with ZooKeeper for the sync process.
+      long randDelay = jitter(REFRESH_PERIOD_MINUTES / 4, REFRESH_PERIOD_MINUTES);
+
+      ScheduledThreadPoolExecutor executor = ThreadPools.getServerThreadPools()
+          .createScheduledExecutorService(4, "config-refresh", false);
+      refreshTaskFuture =
+          executor.scheduleWithFixedDelay(refreshTask, randDelay, REFRESH_PERIOD_MINUTES, MINUTES);
+    }
+
+    /**
+     * Check that the stored version in ZooKeeper matches the version held in the local snapshot.
+     * When a mismatch is detected, a change event is sent to the prop store which will cause a
+     * re-load. If the Zookeeper node has been deleted, the local cache entries are removed.
+     * <p>
+     * This method is designed to be called as a scheduled task, so it does not propagate exceptions
+     * other than interrupted Exceptions so the scheduled tasks will continue to run.
+     */
+
+    private synchronized void verifySnapshotVersions() {

Review Comment:
   You can still guard with an AtomicBoolean, but without synchronizing on it. It has its own internal synchronization. In any case, I don't think it's a problem if there's only a single instance of this object with only a single background thread running these checks.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscribe@accumulo.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org