Example #1
0
        private FabricTestAction GetMovePrimaryReplicaAction(MovePrimaryReplicaStateTransitionAction ragAction)
        {
            Uri    serviceUri  = ragAction.ServiceUri;
            Guid   guid        = ragAction.PartitionId;
            string newNodeName = ragAction.NodeTo;

            string report = StringHelper.Format(
                "Generating Action: {0}\n\t\tService: {1}\n\t\tPartition: {2}\n\t\tTo: {3}",
                ragAction.ActionType,
                serviceUri,
                guid,
                newNodeName);

            Log.WriteInfo(TraceType, report);
            if (this.reportFunction != null)
            {
                this.reportFunction(report);
            }

            var partitionSelector = PartitionSelector.PartitionIdOf(serviceUri, guid);

            return(new MovePrimaryAction(newNodeName, partitionSelector, ragAction.ForceMove));
        }
        private StateTransitionAction GenerateOneMovePrimaryAction(Guid activityId = default(Guid))
        {
            var availablePrimaryReplicas = this.stateSnapshot.GetFaultableReplicas(true /*IsStateful*/).Where(r => this.SelectReadyPrimary(r));

            if (availablePrimaryReplicas.Count() <= 0)
            {
                return(null);
            }

            var primaryChosen = availablePrimaryReplicas.ElementAt(this.Random.Next(availablePrimaryReplicas.Count()));

            var availableNodesToMove = this.stateSnapshot.GetFaultableNodes().Where(n => n.CurrentNodeInfo.NodeName != primaryChosen.Replica.NodeName);

            if (availableNodesToMove.Count() <= 0)
            {
                return(null);
            }

            var newPrimaryNode = availableNodesToMove.ElementAt(this.Random.Next(availableNodesToMove.Count()));

            TestabilityTrace.TraceSource.WriteInfo(
                this.TraceType,
                "{0}: Replica:'{1}' has been chosen for MovePrimary to '{2}'.",
                activityId,
                primaryChosen,
                newPrimaryNode.CurrentNodeInfo.NodeName);

            primaryChosen.MoveReplica(newPrimaryNode.CurrentNodeInfo.NodeName, activityId);

            var replicaAction = new MovePrimaryReplicaStateTransitionAction(
                primaryChosen.ParentPartitionEntity.ParentServiceEntity.ServiceName(),
                primaryChosen.ParentPartitionEntity.Guid,
                newPrimaryNode.CurrentNodeInfo.NodeName,
                this.stateSnapshot.ClusterSnapshotId);

            return(replicaAction);
        }