yea. the fix has already been checked into helix-0.6.x and master branch
On Tue, Dec 16, 2014 at 11:15 AM, kishore g <[email protected]> wrote: > > lets do that. > > On Tue, Dec 16, 2014 at 11:04 AM, Zhen Zhang <[email protected]> wrote: > > > if we are using both resourceName and partitonId for indexing a state > > model, this problem should be fixed. > > > > On Tue, Dec 16, 2014 at 10:25 AM, kishore g <[email protected]> wrote: > > > > > > is it possible to completely avoid this scenario in 0.7.1+ > > > > > > On Tue, Dec 16, 2014 at 10:19 AM, Zhen Zhang (JIRA) <[email protected]> > > > wrote: > > > > > > > > > > > [ > > > > > > > > > > https://issues.apache.org/jira/browse/HELIX-561?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14248601#comment-14248601 > > > > ] > > > > > > > > Zhen Zhang commented on HELIX-561: > > > > ---------------------------------- > > > > > > > > [~vinayakb] are you using same partition name for different > resources? > > we > > > > recently fixed a bug (see > > > https://issues.apache.org/jira/browse/HELIX-552) > > > > regarding this. Previously a state model is indexed by partition id > > only > > > > and the assumption is we use the naming convention like > > > > resourceName_partitionId. If you are using the same partition name > for > > > > different resources, then it's possible that the same state model is > > > > invoked for different resources. > > > > > > > > > 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<MasterSlaveStateModel> { > > > > > 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) > > > > > > > > > >
