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); }