예제 #1
0
        /// <inheritdoc/>
        public override Task <RpcResponse> Exit(BuildEndData message, ServerCallContext context)
        {
            var failure = string.IsNullOrEmpty(message.Failure) ? Optional <string> .Empty : message.Failure;

            m_workerService.ExitRequested(failure);
            return(Task.FromResult(new RpcResponse()));
        }
예제 #2
0
        /// <inheritdoc/>
        public override Task <RpcResponse> Exit(BuildEndData message, ServerCallContext context)
        {
            m_workerService.BeforeExit();
            m_workerService.Exit(timedOut: false, failure: message.Failure);

            return(Task.FromResult(new RpcResponse()));
        }
예제 #3
0
        /// <inheritdoc/>
        public override Task <RpcResponse> Exit(BuildEndData message, ServerCallContext context)
        {
            m_workerService.ExitCallReceivedFromMaster();
            m_workerService.Exit(failure: message.Failure);

            return(Task.FromResult(new RpcResponse()));
        }
예제 #4
0
        public void Exit(BuildEndData message)
        {
            WorkerService.ExitCallReceivedFromOrchestrator();
            var failure = string.IsNullOrEmpty(message.Failure) ? Optional <string> .Empty : message.Failure;

            WorkerService.Exit(failure);
        }
예제 #5
0
        /// <inheritdoc />
        public override async Task FinishAsync(string buildFailure)
        {
            m_buildRequests.CompleteAdding();
            if (m_sendThread.IsAlive)
            {
                m_sendThread.Join();
            }

            bool initiatedStop = false;

            while (true)
            {
                WorkerNodeStatus status = Status;
                if (status == WorkerNodeStatus.Stopping || status == WorkerNodeStatus.Stopped)
                {
                    break;
                }

                if (ChangeStatus(status, WorkerNodeStatus.Stopping))
                {
                    initiatedStop = true;
                    break;
                }
            }

            if (initiatedStop)
            {
                CancellationTokenSource exitCancellation = new CancellationTokenSource();

                // Only wait a short amount of time for exit (15 seconds) if worker is not successfully attached.
                if (m_attachCompletion.Task.Status != TaskStatus.RanToCompletion || !await m_attachCompletion.Task)
                {
                    exitCancellation.CancelAfter(TimeSpan.FromSeconds(15));
                }

                var buildEndData = new BuildEndData()
                {
                    Failure = buildFailure ?? m_exitFailure
                };

                await m_workerClient.ExitAsync(buildEndData, exitCancellation.Token);

                m_executionBlobQueue.CompleteAdding();

                using (m_masterService.Environment.Counters.StartStopwatch(PipExecutorCounter.RemoteWorker_AwaitExecutionBlobCompletionDuration))
                {
                    if (!m_executionBlobQueue.IsCompleted)
                    {
                        // Wait for execution blobs to be processed.
                        await m_executionBlobCompletion.Task;
                    }
                }

                ChangeStatus(WorkerNodeStatus.Stopping, WorkerNodeStatus.Stopped);
            }
        }
예제 #6
0
        public Task <RpcCallResult <Unit> > ExitAsync(OpenBond.BuildEndData message, CancellationToken cancellationToken)
        {
            var grpcBuildEndData = new BuildEndData();

            if (message.Failure != null)
            {
                grpcBuildEndData.Failure = message.Failure;
            }

            return(m_connectionManager.CallAsync(
                       (callOptions) => m_client.ExitAsync(grpcBuildEndData, options: callOptions),
                       "Exit",
                       cancellationToken));
        }
예제 #7
0
        public async Task <RpcCallResult <Unit> > ExitAsync(OpenBond.BuildEndData message, CancellationToken cancellationToken = default(CancellationToken))
        {
            var buildEndData = new BuildEndData()
            {
                Failure = message.Failure,
            };

            var result = await m_proxyManager.Call <BuildEndData, Void>(
                buildEndData,
                functionName : "Exit",
                cancellationToken : cancellationToken);

            return(result.ToUnit());
        }
예제 #8
0
        public override async void Finish(string buildFailure)
        {
            m_buildRequests.CompleteAdding();
            if (m_sendThread.IsAlive)
            {
                m_sendThread.Join();
            }

            bool initiatedStop = false;

            while (true)
            {
                WorkerNodeStatus status = Status;
                if (status == WorkerNodeStatus.Stopping || status == WorkerNodeStatus.Stopped)
                {
                    break;
                }

                if (ChangeStatus(status, WorkerNodeStatus.Stopping))
                {
                    initiatedStop = true;
                    break;
                }
            }

            if (initiatedStop)
            {
                CancellationTokenSource exitCancellation = new CancellationTokenSource();

                // Only wait a short amount of time for exit (15 seconds) if worker is not successfully attached.
                if (m_attachCompletion.Task.Status != TaskStatus.RanToCompletion || !await m_attachCompletion.Task)
                {
                    exitCancellation.CancelAfter(TimeSpan.FromSeconds(15));
                }

                var buildEndData = new BuildEndData()
                {
                    Failure = buildFailure ?? m_exitFailure
                };

                await m_workerClient.ExitAsync(buildEndData, exitCancellation.Token);

                ChangeStatus(WorkerNodeStatus.Stopping, WorkerNodeStatus.Stopped);
            }
        }
예제 #9
0
 public void Exit(BuildEndData message)
 {
     var failure = string.IsNullOrEmpty(message.Failure) ? Optional<string>.Empty : message.Failure;
     WorkerService.ExitRequested(failure);
 }