예제 #1
0
        public override async Task ExecuteAsync(Guid activityId)
        {
            if (surpriseJob)
            {
                // TODO, add surprise in executordata
                this.Environment.DefaultTraceType.WriteWarning("MoveToPreparing: job bypassed normal automated workflow: [{0}]", tenantJob);
            }

            repairTask.State        = RepairTaskState.Preparing;
            repairTask.ExecutorData = args.ExecutorData.ToJson();
            repairTask.Impact       = args.Impact;

            bool?prepareHc = args.PerformPreparingHealthCheck;
            bool?restoreHc = args.PerformRestoringHealthCheck;

            if (prepareHc == repairTask.PerformPreparingHealthCheck)
            {
                prepareHc = null;
            }

            if (restoreHc == repairTask.PerformRestoringHealthCheck)
            {
                restoreHc = null;
            }

            // since IS has claimed the task, it is free to update the health policy as it seems fit
            if (prepareHc != null || restoreHc != null)
            {
                // TODO: See if this can be removed by allowing health policy updates via UpdateRepairExecutionStateAsync
                // (currently those ignored for backward compatibility reasons)
                repairTask.Version = await repairManager.UpdateRepairTaskHealthPolicyAsync(activityId, repairTask, prepareHc, restoreHc).ConfigureAwait(false);
            }

            await repairManager.UpdateRepairExecutionStateAsync(activityId, repairTask).ConfigureAwait(false);
        }
예제 #2
0
            public Task ExecuteAsync(IRepairManager repairManager)
            {
                this.repairTask.State        = RepairTaskState.Restoring;
                this.repairTask.ResultStatus = RepairTaskResult.Succeeded;

                return(repairManager.UpdateRepairExecutionStateAsync(Guid.Empty, this.repairTask));
            }
예제 #3
0
        public override async Task ExecuteAsync(Guid activityId)
        {
            repairTask.State         = RepairTaskState.Restoring;
            repairTask.ResultStatus  = repairTaskResult;
            repairTask.ResultDetails = repairTaskResultDetails;

            if (surpriseJob)
            {
                // TODO, add surprise in executordata
                this.Environment.DefaultTraceType.WriteWarning("MoveToRestoring: job bypassed normal automated workflow for repair task '{0}'", repairTask.TaskId);
            }

            if (processRemovedNodes && this.Environment.Config.ReadConfigValue(Constants.ConfigKeys.ProcessRemovedNodes, true))
            {
                await ProcessRemovedNodesAsync(activityId);
            }

            if (cancelRestoringHealthCheck)
            {
                // TODO: this is not processed, consider calling UpdateRepairTaskHealthPolicyAsync instead
                repairTask.PerformRestoringHealthCheck = false;
            }

            await repairManager.UpdateRepairExecutionStateAsync(activityId, repairTask);
        }
예제 #4
0
            public async Task ExecuteAsync(IRepairManager repairManager)
            {
                this.repairTask.State = RepairTaskState.Executing;

                await repairManager.UpdateRepairExecutionStateAsync(Guid.Empty, this.repairTask);

                this.record.IsApproved = true;
            }
예제 #5
0
        public override async Task ExecuteAsync(Guid activityId)
        {
            // TODO: Validate that state is already Executing; this action can have ActionType.None because
            // of this assumption that this action isn't the one that moves from Approved to Executing.
            repairTask.State = RepairTaskState.Executing;
            await repairManager.UpdateRepairExecutionStateAsync(activityId, repairTask).ConfigureAwait(false);

            approveJobAction(tenantJob.Id);
        }
예제 #6
0
        public override Task ExecuteAsync(Guid activityId)
        {
            repairTask.State = RepairTaskState.Executing;

            if (warning != null)
            {
                this.Environment.DefaultTraceType.WriteWarning("{0}", warning);
            }

            return(repairManager.UpdateRepairExecutionStateAsync(activityId, repairTask));
        }
        public override async Task ExecuteAsync(Guid activityId)
        {
            if (repairTask.State != RepairTaskState.Created)
            {
                this.Environment.DefaultTraceType.WriteInfo("Repair task {0}: not claiming it since its state isn't {1}", repairTask.TaskId, RepairTaskState.Created);
                return;
            }

            // Is this an action that this executor can process?
            RepairActionTypeEnum?action = repairActionProvider.GetRepairAction(repairTask.Action);

            if (action == null)
            {
                this.Environment.DefaultTraceType.WriteInfo("Repair task {0}: ignoring unknown action {1}", repairTask.TaskId, repairTask.Action);
                return;
            }

            if (repairTask.Scope.Kind != RepairScopeIdentifierKind.Cluster)
            {
                this.Environment.DefaultTraceType.WriteInfo("Repair task {0}: ignoring unknown scope {1}", repairTask.TaskId, repairTask.Scope);
                return;
            }

            // Ignore requests for anything other than a single node
            IList <string> targetNodeNames = repairTask.GetTargetNodeNames();

            if (targetNodeNames == null || targetNodeNames.Count != 1)
            {
                this.Environment.DefaultTraceType.WriteInfo("Repair task {0}: ignoring bad target description {1}", repairTask.TaskId, repairTask.Target);
                return;
            }

            // Map Service Fabric node name to Azure role instance Id
            string targetRoleInstance = targetNodeNames[0].TranslateNodeNameToRoleInstance();

            // Is the target a valid role instance in this tenant?
            if (!roleInstanceNames.Contains(targetRoleInstance, StringComparer.OrdinalIgnoreCase))
            {
                this.Environment.DefaultTraceType.WriteInfo("Repair task {0}: ignoring unknown role instance {1}", repairTask.TaskId, targetRoleInstance);
                return;
            }

            // All checks passed; this executor can claim and execute this repair task
            repairTask.Executor = this.Environment.ServiceName;

            // Zero impact, because approval for actual execution will go through the
            // existing infrastructure task mechanism (MR job queue)
            repairTask.State = RepairTaskState.Claimed;

            await repairManager.UpdateRepairExecutionStateAsync(activityId, repairTask).ConfigureAwait(false);
        }
예제 #8
0
        private async Task <bool> CompleteRepairTaskAsync(Guid activityId, IRepairTask task)
        {
            traceType.WriteInfo(
                "Cancelling repair task {0} in state {1}:{2}{3}",
                task.TaskId,
                task.State,
                Environment.NewLine,
                task.ToJson());

            bool succeeded = true;

            try
            {
                switch (task.State)
                {
                case RepairTaskState.Claimed:
                case RepairTaskState.Preparing:
                    await repairManager.CancelRepairTaskAsync(activityId, task);

                    break;

                case RepairTaskState.Approved:
                case RepairTaskState.Executing:
                    task.State         = RepairTaskState.Restoring;
                    task.ResultStatus  = RepairTaskResult.Interrupted;
                    task.ResultDetails = "Repair task was cancelled because Azure coordination is disabled";
                    await repairManager.UpdateRepairExecutionStateAsync(activityId, task);

                    break;

                case RepairTaskState.Restoring:
                    await repairManager.UpdateRepairTaskHealthPolicyAsync(activityId, task, null, performRestoringHealthCheck : false);

                    break;
                }
            }
            catch (Exception e)
            {
                traceType.WriteWarning(
                    "Failed to cancel repair task {0} in state {1}: {2}",
                    task.TaskId,
                    task.State,
                    e);

                succeeded = false;
            }

            return(succeeded);
        }
예제 #9
0
        public override async Task ExecuteAsync(Guid activityId)
        {
            repairTask.State         = RepairTaskState.Completed;
            repairTask.ResultStatus  = repairTaskResult;
            repairTask.ResultDetails = repairTaskResultDetails;

            if (surpriseJob)
            {
                // TODO, add surprise in executordata
                this.Environment.DefaultTraceType.WriteWarning("MoveToCompleted: job bypassed normal automated workflow for repair task '{0}'", repairTask.TaskId);
            }

            await repairManager.UpdateRepairExecutionStateAsync(activityId, repairTask).ConfigureAwait(false);

            // assuming above call succeeds. Else exceptions are handled by caller and the tracing code below doesn't execute
            Environment.DefaultTraceType.WriteAggregatedEvent(
                "CompletedRepairTask",
                repairTask.TaskId,
                "{0}",
                repairTask.ToJson());
        }