Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision

Target

Select target project
  • edbaunton/buildgrid
  • BuildGrid/buildgrid
  • bloomberg/buildgrid
  • devcurmudgeon/buildgrid
  • mhadjimichael/buildgrid
  • jmacarthur/buildgrid
  • rkothur/buildgrid
  • valentindavid/buildgrid
  • jjardon/buildgrid
  • RichKen/buildgrid
  • jbonney/buildgrid
  • onsha_alexander/buildgrid
  • santigl/buildgrid
  • mostynb/buildgrid
  • hoffbrinkle/buildgrid
  • Malinskiy/buildgrid
  • coldtom/buildgrid
  • azeemb_a/buildgrid
  • pointswaves/buildgrid
  • BenjaminSchubert/buildgrid
  • michaellee8/buildgrid
  • anil-anil/buildgrid
  • seanborg/buildgrid
  • jdelong12/buildgrid
  • jclay/buildgrid
  • bweston92/buildgrid
  • zchen723/buildgrid
  • cpratt34/buildgrid
  • armbiant/apache-buildgrid
  • armbiant/android-buildgrid
  • itsme300/buildgrid
  • sbairoliya/buildgrid
32 results
Select Git revision
  • coverity
  • master
  • sminskyprimu/blake3
  • sotk/features/lease-audit-table
  • sotk/logstream-testing
  • zchen723/skip-scheduler-metrics
  • 0.0.10
  • 0.0.11
  • 0.0.12
  • 0.0.13
  • 0.0.14
  • 0.0.16
  • 0.0.17
  • 0.0.19
  • 0.0.2
  • 0.0.20
  • 0.0.21
  • 0.0.23
  • 0.0.25
  • 0.0.26
  • 0.0.27
  • 0.0.28
  • 0.0.29
  • 0.0.3
  • 0.0.30
  • 0.0.31
  • 0.0.32
  • 0.0.33
  • 0.0.34
  • 0.0.35
  • 0.0.36
  • 0.0.37
  • 0.0.38
  • 0.0.39
  • 0.0.4
  • 0.0.40
  • 0.0.41
  • 0.0.42
  • 0.0.43
  • 0.0.44
  • 0.0.45
  • 0.0.46
  • 0.0.47
  • 0.0.48
  • 0.0.49
  • 0.0.5
  • 0.0.50
  • 0.0.51
  • 0.0.52
  • 0.0.53
  • 0.0.54
  • 0.0.55
  • 0.0.56
  • 0.0.57
  • 0.0.58
  • 0.0.59
  • 0.0.6
  • 0.0.60
  • 0.0.61
  • 0.0.62
  • 0.0.63
  • 0.0.64
  • 0.0.65
  • 0.0.66
  • 0.0.67
  • 0.0.68
  • 0.0.69
  • 0.0.7
  • 0.0.70
  • 0.0.71
  • 0.0.72
  • 0.0.73
  • 0.0.74
  • 0.0.75
  • 0.0.76
  • 0.0.78
  • 0.0.79
  • 0.0.8
  • 0.0.80
  • 0.0.81
  • 0.0.82
  • 0.0.83
  • 0.0.84
  • 0.0.85
  • 0.0.86
  • 0.0.87
  • 0.0.88
  • 0.0.89
  • 0.0.9
  • 0.0.90
  • 0.0.91
  • 0.0.92
  • 0.0.93
  • 0.0.94
  • 0.0.95
  • 0.0.96
  • 0.0.97
  • 0.0.98
  • 0.1.0
  • 0.1.1
  • 0.1.10
  • 0.1.11
  • 0.1.12
  • 0.1.13
  • 0.1.14
  • 0.1.15
106 results
Show changes
Commits on Source (5)
......@@ -52,6 +52,11 @@ class BotError(BgdError):
super().__init__(message, detail=detail, domain=ErrorDomain.BOT, reason=reason)
class CancelledError(BgdError):
def __init__(self, message, detail=None, reason=None):
super().__init__(message, detail=detail, domain=ErrorDomain.SERVER, reason=reason)
class InvalidArgumentError(BgdError):
"""A bad argument was passed, such as a name which doesn't exist."""
def __init__(self, message, detail=None, reason=None):
......
......@@ -21,8 +21,9 @@ An instance of the Remote Execution Service.
import logging
from buildgrid._exceptions import FailedPreconditionError, InvalidArgumentError
from buildgrid._protos.build.bazel.remote.execution.v2.remote_execution_pb2 import Action
from buildgrid._exceptions import CancelledError, FailedPreconditionError, InvalidArgumentError
from buildgrid._protos.build.bazel.remote.execution.v2 import remote_execution_pb2
from buildgrid._protos.google.rpc import code_pb2
from ..job import Job
......@@ -43,7 +44,7 @@ class ExecutionInstance:
this action.
"""
action = self._storage.get_message(action_digest, Action)
action = self._storage.get_message(action_digest, remote_execution_pb2.Action)
if not action:
raise FailedPreconditionError("Could not get action from storage.")
......@@ -77,4 +78,11 @@ class ExecutionInstance:
while not operation.done:
yield operation
operation = message_queue.get()
response = remote_execution_pb2.ExecuteResponse()
operation.response.Unpack(response)
if response.status.code == code_pb2.CANCELLED:
raise CancelledError(response.status.message)
yield operation
......@@ -26,7 +26,7 @@ from functools import partial
import grpc
from buildgrid._exceptions import FailedPreconditionError, InvalidArgumentError
from buildgrid._exceptions import CancelledError, FailedPreconditionError, InvalidArgumentError
from buildgrid._protos.build.bazel.remote.execution.v2 import remote_execution_pb2_grpc
from buildgrid._protos.google.longrunning import operations_pb2
......@@ -67,6 +67,12 @@ class ExecutionService(remote_execution_pb2_grpc.ExecutionServicer):
context.set_code(grpc.StatusCode.FAILED_PRECONDITION)
yield operations_pb2.Operation()
except CancelledError as e:
self.logger.error(e)
context.set_details(str(e))
context.set_code(grpc.StatusCode.CANCELLED)
yield operations_pb2.Operation()
def WaitExecution(self, request, context):
try:
names = request.name.split("/")
......
......@@ -20,6 +20,7 @@ from enum import Enum
from buildgrid._protos.build.bazel.remote.execution.v2 import remote_execution_pb2
from buildgrid._protos.google.devtools.remoteworkers.v1test2 import bots_pb2
from buildgrid._protos.google.longrunning import operations_pb2
from buildgrid._protos.google.rpc import code_pb2
class OperationStage(Enum):
......@@ -60,6 +61,7 @@ class Job:
self.__execute_response = None
self.__operation_metadata = remote_execution_pb2.ExecuteOperationMetadata()
self.__operation_canceled = False
self.__operation_metadata.action_digest.CopyFrom(action_digest)
self.__operation_metadata.stage = OperationStage.UNKNOWN.value
......@@ -196,6 +198,10 @@ class Job:
self.__execute_response.cached_result = False
self.__execute_response.status.CopyFrom(status)
def cancel_lease(self):
if self._lease is not None:
self.update_lease_state(LeaseState.CANCELLED)
def update_operation_stage(self, stage):
"""Operates a stage transition for the job's :class:Operation.
......@@ -219,3 +225,14 @@ class Job:
for queue in self._operation_update_queues:
queue.put(self._operation)
def cancel_operation(self):
self.__operation_canceled = True
if self._lease is not None:
self.cancel_lease()
self.__execute_response = remote_execution_pb2.ExecuteResponse()
self.__execute_response.status.code = code_pb2.CANCELLED
self.__execute_response.status.message = "The operation was cancelled by the caller."
self.update_operation_stage(OperationStage.COMPLETED)
......@@ -128,3 +128,13 @@ class Scheduler:
def get_job_operation(self, job_name):
"""Returns the operation associated to job."""
return self.jobs[job_name].operation
def cancel_job_operation(self, job_name):
""""Cancels the underlying operation of a given job.
This will also cancel any job's lease that may have been issued.
Args:
job_name (str): name of the job holding the operation to cancel.
"""
self.jobs[job_name].cancel_operation()