Fix static instance bug in DistViewAggregatorStateModel (#2124)
Change to use non-static reference in statemodel
diff --git a/helix-view-aggregator/src/main/java/org/apache/helix/view/statemodel/DistViewAggregatorStateModel.java b/helix-view-aggregator/src/main/java/org/apache/helix/view/statemodel/DistViewAggregatorStateModel.java
index 1ccf52d..7ac20b0 100644
--- a/helix-view-aggregator/src/main/java/org/apache/helix/view/statemodel/DistViewAggregatorStateModel.java
+++ b/helix-view-aggregator/src/main/java/org/apache/helix/view/statemodel/DistViewAggregatorStateModel.java
@@ -32,8 +32,7 @@
})
public class DistViewAggregatorStateModel extends AbstractHelixLeaderStandbyStateModel {
private final static Logger logger = LoggerFactory.getLogger(DistViewAggregatorStateModel.class);
- private final static Object stateTransitionLock = new Object();
- private static HelixViewAggregator _aggregator;
+ private HelixViewAggregator _aggregator;
public DistViewAggregatorStateModel(String zkAddr) {
super(zkAddr);
@@ -48,25 +47,22 @@
public void onBecomeLeaderFromStandby(Message message, NotificationContext context)
throws Exception {
String viewClusterName = message.getPartitionName();
-
- synchronized (stateTransitionLock) {
- if (_aggregator != null) {
- logger.warn("Aggregator already exists for view cluster {}: {}: cleaning it up.",
- viewClusterName, _aggregator.getAggregatorInstanceName());
- reset();
- }
- logger.info("Creating new HelixViewAggregator for view cluster {}", viewClusterName);
- try {
- _aggregator = new HelixViewAggregator(viewClusterName, _zkAddr);
- _aggregator.start();
- } catch (Exception e) {
- logger.error("Aggregator failed to become leader from stand by for view cluster {}",
- viewClusterName, e);
- reset();
- throw e;
- }
- logStateTransition("STANDBY", "LEADER", message.getPartitionName(), message.getTgtName());
+ if (_aggregator != null) {
+ logger.warn("Aggregator already exists for view cluster {}: {}: cleaning it up.",
+ viewClusterName, _aggregator.getAggregatorInstanceName());
+ reset();
}
+ logger.info("Creating new HelixViewAggregator for view cluster {}", viewClusterName);
+ try {
+ _aggregator = new HelixViewAggregator(viewClusterName, _zkAddr);
+ _aggregator.start();
+ } catch (Exception e) {
+ logger.error("Aggregator failed to become leader from stand by for view cluster {}",
+ viewClusterName, e);
+ reset();
+ throw e;
+ }
+ logStateTransition("STANDBY", "LEADER", message.getPartitionName(), message.getTgtName());
}
@@ -86,15 +82,12 @@
logStateTransition("OFFLINE", "DROPPED", message.getPartitionName(), message.getTgtName());
}
-
@Override
public void reset() {
- synchronized (stateTransitionLock) {
- if (_aggregator != null) {
- logger.error("Resetting view aggregator {}", _aggregator.getAggregatorInstanceName());
- _aggregator.shutdown();
- _aggregator = null;
- }
+ if (_aggregator != null) {
+ logger.info("Resetting view aggregator {}", _aggregator.getAggregatorInstanceName());
+ _aggregator.shutdown();
+ _aggregator = null;
}
}
diff --git a/helix-view-aggregator/src/test/java/org/apache/helix/view/integration/TestHelixViewAggregator.java b/helix-view-aggregator/src/test/java/org/apache/helix/view/integration/TestHelixViewAggregator.java
index 9ffb906..adf16ec 100644
--- a/helix-view-aggregator/src/test/java/org/apache/helix/view/integration/TestHelixViewAggregator.java
+++ b/helix-view-aggregator/src/test/java/org/apache/helix/view/integration/TestHelixViewAggregator.java
@@ -56,6 +56,7 @@
private HelixAdmin _helixAdmin;
private MockViewClusterSpectator _monitor;
private Set<String> _allResources = new HashSet<>();
+ // TODO: add test coverage on multiple statemodel instances for different view clusters
private DistViewAggregatorStateModel _viewAggregatorStateModel;
@BeforeClass