[ https://issues.apache.org/jira/browse/HELIX-561?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14247816#comment-14247816 ] Vinayak Borkar commented on HELIX-561: -------------------------------------- In your code I see: @Override public MasterSlaveStateModel createStateTransitionHandler(ResourceId resourceId, PartitionId partitionId) { return new MasterSlaveStateModel(); } The code I am implementing by extending StateTransitionHandlerFactory implements a create method that has only one arg: @Override public TransitionHandler createStateTransitionHandler(PartitionId partitionId) { return new MasterSlaveStateModel(partitionId.stringify()); } I just verified that I am using 0.7.1. Are we using the same version? > Participant receive same transition twice > ----------------------------------------- > > Key: HELIX-561 > URL: https://issues.apache.org/jira/browse/HELIX-561 > Project: Apache Helix > Issue Type: Bug > Reporter: Zhen Zhang > Assignee: Zhen Zhang > > Some user reports that when upgrade from 0.6.x to 0.7.1, participant receives OFFLINE->SLAVE transition twice for a partition. > Can't reproduce it with the following test case: > {noformat} > package org.apache.helix; > import java.util.Date; > import org.apache.helix.api.StateTransitionHandlerFactory; > import org.apache.helix.api.TransitionHandler; > import org.apache.helix.api.id.PartitionId; > import org.apache.helix.api.id.ResourceId; > import org.apache.helix.api.id.StateModelDefId; > import org.apache.helix.manager.zk.MockController; > import org.apache.helix.model.Message; > import org.apache.helix.participant.statemachine.Transition; > import org.apache.helix.testutil.TestUtil; > import org.apache.helix.testutil.ZkTestBase; > import org.testng.annotations.Test; > public class AppTest extends ZkTestBase { > @Test > public void test() throws Exception { > String clusterName = TestUtil.getTestName(); > int n = 2; > System.out.println("START " + clusterName + " at " + new Date(System.currentTimeMillis())); > TestHelper.setupCluster(clusterName, _zkaddr, 12918, // participant port > "localhost", // participant name prefix > "TestDB", // resource name prefix > 1, // resources > 2, // partitions per resource > n, // number of nodes > 2, // replicas > "MasterSlave", true); // do rebalance > MockController controller = new MockController(_zkaddr, clusterName, "controller"); > controller.syncStart(); > String id = "localhost_12918"; > StateModelDefId masterSlave = StateModelDefId.from("MasterSlave"); > HelixManager hManager = > HelixManagerFactory.getZKHelixManager(clusterName, id, InstanceType.PARTICIPANT, _zkaddr); > hManager.getStateMachineEngine().registerStateModelFactory(masterSlave, > new MasterSlaveStateModelFactory()); > hManager.connect(); > System.out.println("END " + clusterName + " at " + new Date(System.currentTimeMillis())); > } > class MasterSlaveStateModelFactory extends StateTransitionHandlerFactory { > public MasterSlaveStateModelFactory() { > } > @Override > public MasterSlaveStateModel createStateTransitionHandler(ResourceId resourceId, > PartitionId partitionId) { > return new MasterSlaveStateModel(); > } > } > public class MasterSlaveStateModel extends TransitionHandler { > @Transition(to = "SLAVE", from = "OFFLINE") > public void onBecomeSlaveFromOffline(Message message, NotificationContext context) > throws Exception { > System.out.println(message.getPartitionName() + ": OFFLINE->SLAVE"); > } > @Transition(to = "MASTER", from = "SLAVE") > public void onBecomeMasterFromSlave(Message message, NotificationContext context) > throws Exception { > } > @Transition(to = "SLAVE", from = "MASTER") > public void onBecomeSlaveFromMaster(Message message, NotificationContext context) > throws Exception { > } > @Transition(to = "OFFLINE", from = "SLAVE") > public void onBecomeOfflineFromSlave(Message message, NotificationContext context) > throws Exception { > } > @Transition(to = "DROPPED", from = "OFFLINE") > public void onBecomeDroppedFromOffline(Message message, NotificationContext context) > throws Exception { > } > @Transition(to = "OFFLINE", from = "ERROR") > public void onBecomeOfflineFromError(Message message, NotificationContext context) > throws Exception { > } > } > } > {noformat} -- This message was sent by Atlassian JIRA (v6.3.4#6332)