narendly commented on a change in pull request #690: Reset the WAGED rebalancer
once the controller newly acquires leadership.
URL: https://github.com/apache/helix/pull/690#discussion_r371499479
##########
File path:
helix-core/src/main/java/org/apache/helix/controller/GenericHelixController.java
##########
@@ -1258,4 +1293,57 @@ private void initPipeline(Thread eventThread,
BaseControllerDataProvider cache)
eventThread.setDaemon(true);
eventThread.start();
}
+
+ /**
+ * A wrapper class for the stateful rebalancer instance that will be tracked
in the
+ * GenericHelixController.
+ */
+ private abstract class StatefulRebalancerRef<T extends StatefulRebalancer> {
+ private T _rebalancer = null;
+ private boolean _isRebalancerValid = true;
+
+ /**
+ * @param helixManager
+ * @return A new stateful rebalancer instance with initial state.
+ */
+ protected abstract T createRebalancer(HelixManager helixManager);
+
+ /**
+ * Mark the current rebalancer object to be invalid, which indicates it
needs to be reset before
+ * the next usage.
+ */
+ synchronized void invalidateRebalancer() {
+ _isRebalancerValid = false;
+ }
+
+ /**
+ * @return A valid rebalancer object.
+ * If the rebalancer is no longer valid, it will be reset before
returning.
+ */
+ synchronized T getRebalancer(HelixManager helixManager) {
+ // Lazily initialize the stateful rebalancer instance since the
GenericHelixController
+ // instance is instantiated without the HelixManager information that is
required.
+ if (_rebalancer == null) {
+ _rebalancer = createRebalancer(helixManager);
+ _isRebalancerValid = true;
+ }
+ // If the rebalance exists but has been marked as invalid (due to
leadership switch), it needs
+ // to be reset before return.
+ if (!_isRebalancerValid) {
+ _rebalancer.reset();
+ _isRebalancerValid = true;
+ }
+ return _rebalancer;
Review comment:
Adding volatile is for correctness and I don't think we should sacrifice
correctness in favor of a minor performance improvement. And I am not positive
if the performance is a valid concern at this juncture with so many
synchronization primitives that are already in use.
Now is Helix Controller single-thread? Yes. Will it remain that way? Not
necessarily. If we do make this change (which should happen soon, especially
due to the memory pressure Controller is facing), we should revisit this code.
Could we add a TODO here as well, marking it not thread-safe?
----------------------------------------------------------------
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.
For queries about this service, please contact Infrastructure at:
[email protected]
With regards,
Apache Git Services
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]