You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@helix.apache.org by zz...@apache.org on 2014/08/15 00:06:09 UTC
git commit: HELIX-485: Remove controller leader election duplicate
code
Repository: helix
Updated Branches:
refs/heads/master ecfedff24 -> 325fe8b14
HELIX-485: Remove controller leader election duplicate code
Project: http://git-wip-us.apache.org/repos/asf/helix/repo
Commit: http://git-wip-us.apache.org/repos/asf/helix/commit/325fe8b1
Tree: http://git-wip-us.apache.org/repos/asf/helix/tree/325fe8b1
Diff: http://git-wip-us.apache.org/repos/asf/helix/diff/325fe8b1
Branch: refs/heads/master
Commit: 325fe8b147b7f9c139364f89044e2b78e141a7b9
Parents: ecfedff
Author: zzhang <zz...@apache.org>
Authored: Thu Aug 14 14:08:34 2014 -0700
Committer: zzhang <zz...@apache.org>
Committed: Thu Aug 14 14:08:34 2014 -0700
----------------------------------------------------------------------
.../manager/zk/DistributedLeaderElection.java | 110 --------
.../helix/manager/zk/ZkCallbackHandler.java | 10 +-
.../apache/helix/manager/zk/MockController.java | 5 +
.../manager/zk/MockMultiClusterController.java | 8 +
.../helix/manager/zk/MockParticipant.java | 4 +
.../helix/participant/MockZKHelixManager.java | 248 -------------------
.../participant/TestControllerElection.java | 121 +++++++++
.../participant/TestDistControllerElection.java | 192 --------------
8 files changed, 141 insertions(+), 557 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/helix/blob/325fe8b1/helix-core/src/main/java/org/apache/helix/manager/zk/DistributedLeaderElection.java
----------------------------------------------------------------------
diff --git a/helix-core/src/main/java/org/apache/helix/manager/zk/DistributedLeaderElection.java b/helix-core/src/main/java/org/apache/helix/manager/zk/DistributedLeaderElection.java
deleted file mode 100644
index fe1ca4b..0000000
--- a/helix-core/src/main/java/org/apache/helix/manager/zk/DistributedLeaderElection.java
+++ /dev/null
@@ -1,110 +0,0 @@
-package org.apache.helix.manager.zk;
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-import java.util.List;
-
-import org.apache.helix.ControllerChangeListener;
-import org.apache.helix.HelixDataAccessor;
-import org.apache.helix.HelixManager;
-import org.apache.helix.HelixTimerTask;
-import org.apache.helix.InstanceType;
-import org.apache.helix.NotificationContext;
-import org.apache.helix.PropertyKey.Builder;
-import org.apache.helix.controller.GenericHelixController;
-import org.apache.log4j.Logger;
-
-/**
- * do distributed leader election
- */
-public class DistributedLeaderElection implements ControllerChangeListener {
- private static Logger LOG = Logger.getLogger(DistributedLeaderElection.class);
-
- final HelixManager _manager;
- final GenericHelixController _controller;
- final List<HelixTimerTask> _controllerTimerTasks;
-
- public DistributedLeaderElection(HelixManager manager, GenericHelixController controller,
- List<HelixTimerTask> controllerTimerTasks) {
- _manager = manager;
- _controller = controller;
- _controllerTimerTasks = controllerTimerTasks;
- }
-
- /**
- * may be accessed by multiple threads: zk-client thread and
- * ZkHelixManager.disconnect()->reset() TODO: Refactor accessing
- * HelixMangerMain class statically
- */
- @Override
- public synchronized void onControllerChange(NotificationContext changeContext) {
- HelixManager manager = changeContext.getManager();
- if (manager == null) {
- LOG.error("missing attributes in changeContext. requires HelixManager");
- return;
- }
-
- InstanceType type = manager.getInstanceType();
- if (type != InstanceType.CONTROLLER && type != InstanceType.CONTROLLER_PARTICIPANT) {
- LOG.error("fail to become controller because incorrect instanceType (was " + type.toString()
- + ", requires CONTROLLER | CONTROLLER_PARTICIPANT)");
- return;
- }
-
- ControllerManagerHelper controllerHelper =
- new ControllerManagerHelper(_manager, _controllerTimerTasks);
- try {
- if (changeContext.getType().equals(NotificationContext.Type.INIT)
- || changeContext.getType().equals(NotificationContext.Type.CALLBACK)) {
- LOG.info(_manager.getInstanceName() + " is trying to acquire leadership for cluster: "
- + _manager.getClusterName());
- HelixDataAccessor accessor = manager.getHelixDataAccessor();
- Builder keyBuilder = accessor.keyBuilder();
-
- while (accessor.getProperty(keyBuilder.controllerLeader()) == null) {
- boolean success = ZkHelixLeaderElection.tryUpdateController(manager);
- if (success) {
- LOG.info(_manager.getInstanceName() + " acquired leadership for cluster: "
- + _manager.getClusterName());
-
- ZkHelixLeaderElection.updateHistory(manager);
- _manager.getHelixDataAccessor().getBaseDataAccessor().reset();
- controllerHelper.addListenersToController(_controller);
- controllerHelper.startControllerTimerTasks();
- }
- }
- } else if (changeContext.getType().equals(NotificationContext.Type.FINALIZE)) {
- LOG.info(_manager.getInstanceName() + " reqlinquish leadership for cluster: "
- + _manager.getClusterName());
- controllerHelper.stopControllerTimerTasks();
- controllerHelper.removeListenersFromController(_controller);
- _controller.shutdownClusterStatusMonitor(_manager.getClusterName());
-
- /**
- * clear write-through cache
- */
- _manager.getHelixDataAccessor().getBaseDataAccessor().reset();
- }
-
- } catch (Exception e) {
- LOG.error("Exception when trying to become leader", e);
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/helix/blob/325fe8b1/helix-core/src/main/java/org/apache/helix/manager/zk/ZkCallbackHandler.java
----------------------------------------------------------------------
diff --git a/helix-core/src/main/java/org/apache/helix/manager/zk/ZkCallbackHandler.java b/helix-core/src/main/java/org/apache/helix/manager/zk/ZkCallbackHandler.java
index 374a30b..ee420b9 100644
--- a/helix-core/src/main/java/org/apache/helix/manager/zk/ZkCallbackHandler.java
+++ b/helix-core/src/main/java/org/apache/helix/manager/zk/ZkCallbackHandler.java
@@ -67,18 +67,14 @@ import org.apache.log4j.Logger;
import org.apache.zookeeper.Watcher.Event.EventType;
/**
- * This is a copy of {@link CallbackHandler} We need to synchronize on ZkHelixConnection
- * instead ofHelixManager to avoid dead-lock.
- * Otherwise an example deadlock scenario would be:
+ * We need to synchronize on {@link ZkHelixConnection} instead of {@link HelixManager} to avoid
+ * dead-lock. Otherwise an example deadlock scenario would be:
* 1) main-thread calls ZkHelixConnection#disconnect(), results in:
* - ZkHelixController#reset(), holding ZkHelixConnection, waiting HelixConnectionAdaptor
* 2) zk-event-thread calls CallbackHandler#handleChildChange(), results in:
* - CallbackHandler#invoke(), holding HelixConnectionAdaptor, waiting ZkHelixConnection
- * TODO remove code duplication
*/
-public class ZkCallbackHandler implements IZkChildListener, IZkDataListener
-
-{
+public class ZkCallbackHandler implements IZkChildListener, IZkDataListener {
private static Logger logger = Logger.getLogger(ZkCallbackHandler.class);
/**
http://git-wip-us.apache.org/repos/asf/helix/blob/325fe8b1/helix-core/src/test/java/org/apache/helix/manager/zk/MockController.java
----------------------------------------------------------------------
diff --git a/helix-core/src/test/java/org/apache/helix/manager/zk/MockController.java b/helix-core/src/test/java/org/apache/helix/manager/zk/MockController.java
index f4d2159..8649aa9 100644
--- a/helix-core/src/test/java/org/apache/helix/manager/zk/MockController.java
+++ b/helix-core/src/test/java/org/apache/helix/manager/zk/MockController.java
@@ -83,4 +83,9 @@ public class MockController extends ZKHelixManager implements Runnable {
ZkHelixConnection conn = (ZkHelixConnection)getConn();
return conn._handlers.get(_role);
}
+
+ public ZkHelixController getController() {
+ return (ZkHelixController) _role;
+ }
+
}
http://git-wip-us.apache.org/repos/asf/helix/blob/325fe8b1/helix-core/src/test/java/org/apache/helix/manager/zk/MockMultiClusterController.java
----------------------------------------------------------------------
diff --git a/helix-core/src/test/java/org/apache/helix/manager/zk/MockMultiClusterController.java b/helix-core/src/test/java/org/apache/helix/manager/zk/MockMultiClusterController.java
index a39bd84..f68444c 100644
--- a/helix-core/src/test/java/org/apache/helix/manager/zk/MockMultiClusterController.java
+++ b/helix-core/src/test/java/org/apache/helix/manager/zk/MockMultiClusterController.java
@@ -97,4 +97,12 @@ public class MockMultiClusterController extends ZKHelixManager implements Runnab
return handlers;
}
+
+ public ZkHelixMultiClusterController getRole() {
+ return (ZkHelixMultiClusterController) _role;
+ }
+
+ public ZkHelixController getController() {
+ return getRole()._controller;
+ }
}
http://git-wip-us.apache.org/repos/asf/helix/blob/325fe8b1/helix-core/src/test/java/org/apache/helix/manager/zk/MockParticipant.java
----------------------------------------------------------------------
diff --git a/helix-core/src/test/java/org/apache/helix/manager/zk/MockParticipant.java b/helix-core/src/test/java/org/apache/helix/manager/zk/MockParticipant.java
index 3936680..15451b5 100644
--- a/helix-core/src/test/java/org/apache/helix/manager/zk/MockParticipant.java
+++ b/helix-core/src/test/java/org/apache/helix/manager/zk/MockParticipant.java
@@ -117,4 +117,8 @@ public class MockParticipant extends ZKHelixManager implements Runnable {
ZkHelixConnection conn = (ZkHelixConnection)getConn();
return conn._handlers.get(_role);
}
+
+ public ZkHelixParticipant getParticipant() {
+ return (ZkHelixParticipant) _role;
+ }
}
http://git-wip-us.apache.org/repos/asf/helix/blob/325fe8b1/helix-core/src/test/java/org/apache/helix/participant/MockZKHelixManager.java
----------------------------------------------------------------------
diff --git a/helix-core/src/test/java/org/apache/helix/participant/MockZKHelixManager.java b/helix-core/src/test/java/org/apache/helix/participant/MockZKHelixManager.java
deleted file mode 100644
index 3efbffb..0000000
--- a/helix-core/src/test/java/org/apache/helix/participant/MockZKHelixManager.java
+++ /dev/null
@@ -1,248 +0,0 @@
-package org.apache.helix.participant;
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-import java.util.UUID;
-
-import org.apache.helix.ClusterMessagingService;
-import org.apache.helix.ConfigAccessor;
-import org.apache.helix.ControllerChangeListener;
-import org.apache.helix.CurrentStateChangeListener;
-import org.apache.helix.ExternalViewChangeListener;
-import org.apache.helix.HelixAdmin;
-import org.apache.helix.HelixDataAccessor;
-import org.apache.helix.HelixManager;
-import org.apache.helix.HelixManagerProperties;
-import org.apache.helix.IdealStateChangeListener;
-import org.apache.helix.InstanceConfigChangeListener;
-import org.apache.helix.InstanceType;
-import org.apache.helix.LiveInstanceChangeListener;
-import org.apache.helix.LiveInstanceInfoProvider;
-import org.apache.helix.MessageListener;
-import org.apache.helix.PreConnectCallback;
-import org.apache.helix.PropertyKey;
-import org.apache.helix.ScopedConfigChangeListener;
-import org.apache.helix.ZNRecord;
-import org.apache.helix.manager.zk.ZKHelixDataAccessor;
-import org.apache.helix.manager.zk.ZkBaseDataAccessor;
-import org.apache.helix.manager.zk.ZkClient;
-import org.apache.helix.messaging.DefaultMessagingService;
-import org.apache.helix.model.HelixConfigScope.ConfigScopeProperty;
-import org.apache.helix.store.zk.ZkHelixPropertyStore;
-
-public class MockZKHelixManager implements HelixManager {
- private final ZKHelixDataAccessor _accessor;
- private final String _instanceName;
- private final String _clusterName;
- private final InstanceType _type;
-
- public MockZKHelixManager(String clusterName, String instanceName, InstanceType type,
- ZkClient zkClient) {
- _instanceName = instanceName;
- _clusterName = clusterName;
- _type = type;
- _accessor = new ZKHelixDataAccessor(clusterName, new ZkBaseDataAccessor<ZNRecord>(zkClient));
- }
-
- @Override
- public void connect() throws Exception {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public boolean isConnected() {
- // TODO Auto-generated method stub
- return false;
- }
-
- @Override
- public void disconnect() {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public void addIdealStateChangeListener(IdealStateChangeListener listener) throws Exception {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public void addLiveInstanceChangeListener(LiveInstanceChangeListener listener) throws Exception {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public void addMessageListener(MessageListener listener, String instanceName) throws Exception {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public void addCurrentStateChangeListener(CurrentStateChangeListener listener,
- String instanceName, String sessionId) throws Exception {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public void addExternalViewChangeListener(ExternalViewChangeListener listener) throws Exception {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public boolean removeListener(PropertyKey key, Object listener) {
- // TODO Auto-generated method stub
- return false;
- }
-
- @Override
- public HelixDataAccessor getHelixDataAccessor() {
- return _accessor;
- }
-
- @Override
- public String getClusterName() {
- return _clusterName;
- }
-
- @Override
- public String getInstanceName() {
- return _instanceName;
- }
-
- @Override
- public String getSessionId() {
- // TODO Auto-generated method stub
- return UUID.randomUUID().toString();
- }
-
- @Override
- public long getLastNotificationTime() {
- // TODO Auto-generated method stub
- return 0;
- }
-
- @Override
- public void addControllerListener(ControllerChangeListener listener) {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public HelixAdmin getClusterManagmentTool() {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public ClusterMessagingService getMessagingService() {
- return new DefaultMessagingService(this);
- }
-
- @Override
- public InstanceType getInstanceType() {
- return _type;
- }
-
- @Override
- public String getVersion() {
- // TODO Auto-generated method stub
- return UUID.randomUUID().toString();
- }
-
- @Override
- public StateMachineEngine getStateMachineEngine() {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public boolean isLeader() {
- // TODO Auto-generated method stub
- return false;
- }
-
- @Override
- public ConfigAccessor getConfigAccessor() {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public void startTimerTasks() {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public void stopTimerTasks() {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public void addPreConnectCallback(PreConnectCallback callback) {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public ZkHelixPropertyStore<ZNRecord> getHelixPropertyStore() {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public void addInstanceConfigChangeListener(InstanceConfigChangeListener listener)
- throws Exception {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public void addConfigChangeListener(ScopedConfigChangeListener listener, ConfigScopeProperty scope)
- throws Exception {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public void setLiveInstanceInfoProvider(LiveInstanceInfoProvider liveInstanceInfoProvider) {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public HelixManagerProperties getProperties() {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public void addControllerMessageListener(MessageListener listener) {
- // TODO Auto-generated method stub
-
- }
-
-}
http://git-wip-us.apache.org/repos/asf/helix/blob/325fe8b1/helix-core/src/test/java/org/apache/helix/participant/TestControllerElection.java
----------------------------------------------------------------------
diff --git a/helix-core/src/test/java/org/apache/helix/participant/TestControllerElection.java b/helix-core/src/test/java/org/apache/helix/participant/TestControllerElection.java
new file mode 100644
index 0000000..ddc4d4b
--- /dev/null
+++ b/helix-core/src/test/java/org/apache/helix/participant/TestControllerElection.java
@@ -0,0 +1,121 @@
+package org.apache.helix.participant;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import java.util.Date;
+
+import org.apache.helix.NotificationContext;
+import org.apache.helix.PropertyKey;
+import org.apache.helix.TestHelper;
+import org.apache.helix.controller.GenericHelixController;
+import org.apache.helix.manager.zk.MockController;
+import org.apache.helix.manager.zk.MockMultiClusterController;
+import org.apache.helix.manager.zk.ZKHelixDataAccessor;
+import org.apache.helix.manager.zk.ZkHelixLeaderElection;
+import org.apache.helix.model.LiveInstance;
+import org.apache.helix.testutil.TestUtil;
+import org.apache.helix.testutil.ZkTestBase;
+import org.apache.log4j.Logger;
+import org.testng.AssertJUnit;
+import org.testng.annotations.Test;
+
+public class TestControllerElection extends ZkTestBase {
+ private static Logger LOG = Logger.getLogger(TestControllerElection.class);
+
+ @Test()
+ public void testController() throws Exception {
+ String clusterName = TestUtil.getTestName();
+
+ System.out.println("START " + clusterName + " at " + new Date(System.currentTimeMillis()));
+
+ ZKHelixDataAccessor accessor = new ZKHelixDataAccessor(clusterName, _baseAccessor);
+ PropertyKey.Builder keyBuilder = accessor.keyBuilder();
+
+ TestHelper.setupEmptyCluster(_zkclient, clusterName);
+
+ String controllerName = "controller_0";
+ MockController controller = new MockController(_zkaddr, clusterName, controllerName);
+ GenericHelixController pipeline = new GenericHelixController();
+
+ ZkHelixLeaderElection leader = new ZkHelixLeaderElection(controller.getController(), pipeline);
+ NotificationContext context = new NotificationContext(controller);
+ context.setType(NotificationContext.Type.INIT);
+ leader.onControllerChange(context);
+
+ LiveInstance liveInstance = accessor.getProperty(keyBuilder.controllerLeader());
+ AssertJUnit.assertEquals(controllerName, liveInstance.getInstanceName());
+
+ // Start another controller, leader should remain unchanged
+ String controllerName1 = "controller_1";
+ MockController controller1 = new MockController(_zkaddr, clusterName, controllerName1);
+ GenericHelixController pipeline1 = new GenericHelixController();
+ ZkHelixLeaderElection leader1 = new ZkHelixLeaderElection(controller1.getController(), pipeline1);
+ NotificationContext context1 = new NotificationContext(controller1);
+ context1.setType(NotificationContext.Type.INIT);
+ leader1.onControllerChange(context1);
+ liveInstance = accessor.getProperty(keyBuilder.controllerLeader());
+ AssertJUnit.assertEquals(controllerName, liveInstance.getInstanceName());
+
+ // clean up
+ controller1.getConn().disconnect();
+ controller.getConn().disconnect();
+ System.out.println("END " + clusterName + " at " + new Date(System.currentTimeMillis()));
+ }
+
+ @Test()
+ public void testMultiClusterController() throws Exception {
+ String clusterName = TestUtil.getTestName();
+ System.out.println("START " + clusterName + " at " + new Date(System.currentTimeMillis()));
+
+ ZKHelixDataAccessor accessor = new ZKHelixDataAccessor(clusterName, _baseAccessor);
+ PropertyKey.Builder keyBuilder = accessor.keyBuilder();
+
+ TestHelper.setupEmptyCluster(_zkclient, clusterName);
+
+ String controllerName = "controller_0";
+ MockMultiClusterController controller = new MockMultiClusterController(_zkaddr, clusterName, controllerName);
+ GenericHelixController pipeline = new GenericHelixController();
+
+ ZkHelixLeaderElection leader = new ZkHelixLeaderElection(controller.getController(), pipeline);
+ NotificationContext context = new NotificationContext(controller);
+ context.setType(NotificationContext.Type.CALLBACK);
+ leader.onControllerChange(context);
+
+ LiveInstance liveInstance = accessor.getProperty(keyBuilder.controllerLeader());
+ AssertJUnit.assertEquals(controllerName, liveInstance.getInstanceName());
+
+ // Start another controller, leader should remain unchanged
+ MockMultiClusterController controller1 = new MockMultiClusterController(_zkaddr, clusterName, "controller_1");
+
+ GenericHelixController pipeline1 = new GenericHelixController();
+ ZkHelixLeaderElection leader1 = new ZkHelixLeaderElection(controller.getController(), pipeline1);
+ context = new NotificationContext(controller);
+ context.setType(NotificationContext.Type.CALLBACK);
+ leader1.onControllerChange(context);
+ liveInstance = accessor.getProperty(keyBuilder.controllerLeader());
+ AssertJUnit.assertEquals(controllerName, liveInstance.getInstanceName());
+
+ // clean up
+ controller1.getConn().disconnect();
+ controller.getConn().disconnect();
+ System.out.println("END " + clusterName + " at " + new Date(System.currentTimeMillis()));
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/helix/blob/325fe8b1/helix-core/src/test/java/org/apache/helix/participant/TestDistControllerElection.java
----------------------------------------------------------------------
diff --git a/helix-core/src/test/java/org/apache/helix/participant/TestDistControllerElection.java b/helix-core/src/test/java/org/apache/helix/participant/TestDistControllerElection.java
deleted file mode 100644
index de510c1..0000000
--- a/helix-core/src/test/java/org/apache/helix/participant/TestDistControllerElection.java
+++ /dev/null
@@ -1,192 +0,0 @@
-package org.apache.helix.participant;
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-import java.util.Collections;
-import java.util.Date;
-import java.util.List;
-
-import org.apache.helix.HelixManager;
-import org.apache.helix.HelixTimerTask;
-import org.apache.helix.InstanceType;
-import org.apache.helix.NotificationContext;
-import org.apache.helix.PropertyKey.Builder;
-import org.apache.helix.PropertyPathConfig;
-import org.apache.helix.PropertyType;
-import org.apache.helix.TestHelper;
-import org.apache.helix.ZNRecord;
-import org.apache.helix.controller.GenericHelixController;
-import org.apache.helix.manager.zk.DistributedLeaderElection;
-import org.apache.helix.manager.zk.ZKHelixDataAccessor;
-import org.apache.helix.model.LiveInstance;
-import org.apache.helix.testutil.TestUtil;
-import org.apache.helix.testutil.ZkTestBase;
-import org.apache.log4j.Logger;
-import org.testng.AssertJUnit;
-import org.testng.annotations.Test;
-
-public class TestDistControllerElection extends ZkTestBase {
- private static Logger LOG = Logger.getLogger(TestDistControllerElection.class);
-
- @Test()
- public void testController() throws Exception {
- System.out.println("START TestDistControllerElection at "
- + new Date(System.currentTimeMillis()));
- String className = TestUtil.getTestName();
-
- final String clusterName = className;
- String path = "/" + clusterName;
- if (_zkclient.exists(path)) {
- _zkclient.deleteRecursive(path);
- }
-
- ZKHelixDataAccessor accessor =
- new ZKHelixDataAccessor(clusterName, _baseAccessor);
- Builder keyBuilder = accessor.keyBuilder();
-
- TestHelper.setupEmptyCluster(_zkclient, clusterName);
-
- final String controllerName = "controller_0";
- HelixManager manager =
- new MockZKHelixManager(clusterName, controllerName, InstanceType.CONTROLLER, _zkclient);
- GenericHelixController controller0 = new GenericHelixController();
-
- List<HelixTimerTask> timerTasks = Collections.emptyList();
- DistributedLeaderElection election =
- new DistributedLeaderElection(manager, controller0, timerTasks);
- NotificationContext context = new NotificationContext(manager);
- context.setType(NotificationContext.Type.INIT);
- election.onControllerChange(context);
-
- // path = PropertyPathConfig.getPath(PropertyType.LEADER, clusterName);
- // ZNRecord leaderRecord = zkclient.<ZNRecord> readData(path);
- LiveInstance liveInstance = accessor.getProperty(keyBuilder.controllerLeader());
- AssertJUnit.assertEquals(controllerName, liveInstance.getInstanceName());
- // AssertJUnit.assertNotNull(election.getController());
- // AssertJUnit.assertNull(election.getLeader());
-
- manager =
- new MockZKHelixManager(clusterName, "controller_1", InstanceType.CONTROLLER, _zkclient);
- GenericHelixController controller1 = new GenericHelixController();
- election = new DistributedLeaderElection(manager, controller1, timerTasks);
- context = new NotificationContext(manager);
- context.setType(NotificationContext.Type.INIT);
- election.onControllerChange(context);
- // leaderRecord = zkclient.<ZNRecord> readData(path);
- liveInstance = accessor.getProperty(keyBuilder.controllerLeader());
- AssertJUnit.assertEquals(controllerName, liveInstance.getInstanceName());
- // AssertJUnit.assertNull(election.getController());
- // AssertJUnit.assertNull(election.getLeader());
-
- System.out.println("END TestDistControllerElection at " + new Date(System.currentTimeMillis()));
- }
-
- @Test()
- public void testControllerParticipant() throws Exception {
- String className = TestUtil.getTestName();
- LOG.info("RUN " + className + " at " + new Date(System.currentTimeMillis()));
-
- final String clusterName = className;
-
- String path = "/" + clusterName;
- if (_zkclient.exists(path)) {
- _zkclient.deleteRecursive(path);
- }
-
- ZKHelixDataAccessor accessor =
- new ZKHelixDataAccessor(clusterName, _baseAccessor);
- Builder keyBuilder = accessor.keyBuilder();
-
- TestHelper.setupEmptyCluster(_zkclient, clusterName);
-
- final String controllerName = "controller_0";
- HelixManager manager =
- new MockZKHelixManager(clusterName, controllerName, InstanceType.CONTROLLER_PARTICIPANT,
- _zkclient);
- GenericHelixController controller0 = new GenericHelixController();
- List<HelixTimerTask> timerTasks = Collections.emptyList();
-
- DistributedLeaderElection election =
- new DistributedLeaderElection(manager, controller0, timerTasks);
- NotificationContext context = new NotificationContext(manager);
- context.setType(NotificationContext.Type.CALLBACK);
- election.onControllerChange(context);
-
- LiveInstance liveInstance = accessor.getProperty(keyBuilder.controllerLeader());
- AssertJUnit.assertEquals(controllerName, liveInstance.getInstanceName());
-
- // path = PropertyPathConfig.getPath(PropertyType.LEADER, clusterName);
- // ZNRecord leaderRecord = zkclient.<ZNRecord> readData(path);
- // AssertJUnit.assertEquals(controllerName, leaderRecord.getSimpleField("LEADER"));
- // AssertJUnit.assertNotNull(election.getController());
- // AssertJUnit.assertNotNull(election.getLeader());
-
- manager =
- new MockZKHelixManager(clusterName, "controller_1", InstanceType.CONTROLLER_PARTICIPANT,
- _zkclient);
- GenericHelixController controller1 = new GenericHelixController();
- election = new DistributedLeaderElection(manager, controller1, timerTasks);
- context = new NotificationContext(manager);
- context.setType(NotificationContext.Type.CALLBACK);
- election.onControllerChange(context);
-
- liveInstance = accessor.getProperty(keyBuilder.controllerLeader());
- AssertJUnit.assertEquals(controllerName, liveInstance.getInstanceName());
-
- // leaderRecord = zkclient.<ZNRecord> readData(path);
- // AssertJUnit.assertEquals(controllerName, leaderRecord.getSimpleField("LEADER"));
- // AssertJUnit.assertNull(election.getController());
- // AssertJUnit.assertNull(election.getLeader());
-
- LOG.info("END " + className + " at " + new Date(System.currentTimeMillis()));
- }
-
- @Test()
- public void testParticipant() throws Exception {
- String className = TestUtil.getTestName();
- LOG.info("RUN " + className + " at " + new Date(System.currentTimeMillis()));
-
- final String clusterName = className;
- String path = "/" + clusterName;
- if (_zkclient.exists(path)) {
- _zkclient.deleteRecursive(path);
- }
- TestHelper.setupEmptyCluster(_zkclient, clusterName);
-
- final String controllerName = "participant_0";
- HelixManager manager =
- new MockZKHelixManager(clusterName, controllerName, InstanceType.PARTICIPANT, _zkclient);
- GenericHelixController participant0 = new GenericHelixController();
- List<HelixTimerTask> timerTasks = Collections.emptyList();
-
- DistributedLeaderElection election =
- new DistributedLeaderElection(manager, participant0, timerTasks);
- NotificationContext context = new NotificationContext(manager);
- context.setType(NotificationContext.Type.INIT);
- election.onControllerChange(context);
-
- path = PropertyPathConfig.getPath(PropertyType.LEADER, clusterName);
- ZNRecord leaderRecord = _zkclient.<ZNRecord> readData(path, true);
- AssertJUnit.assertNull(leaderRecord);
- // AssertJUnit.assertNull(election.getController());
- // AssertJUnit.assertNull(election.getLeader());
- }
-
-}