[Notes] [Git][BuildGrid/buildgrid][master] 2 commits: Add an option to ActionCache to only store successful actions



Title: GitLab

Jeremiah Bonney pushed to branch master at BuildGrid / buildgrid

Commits:

4 changed files:

Changes:

  • buildgrid/_app/settings/parser.py
    ... ... @@ -247,12 +247,13 @@ class Action(YamlFactory):
    247 247
           storage(:class:`buildgrid.server.cas.storage.storage_abc.StorageABC`): Instance of storage to use.
    
    248 248
           max_cached_refs(int): Max number of cached actions.
    
    249 249
           allow_updates(bool): Allow updates pushed to CAS. Defaults to ``True``.
    
    250
    +      cache_failed_actions(bool): Whether to store failed (non-zero exit code) actions. Default to ``True``.
    
    250 251
         """
    
    251 252
     
    
    252 253
         yaml_tag = u'!action-cache'
    
    253 254
     
    
    254
    -    def __new__(cls, storage, max_cached_refs, allow_updates=True):
    
    255
    -        return ActionCache(storage, max_cached_refs, allow_updates)
    
    255
    +    def __new__(cls, storage, max_cached_refs, allow_updates=True, cache_failed_actions=True):
    
    256
    +        return ActionCache(storage, max_cached_refs, allow_updates, cache_failed_actions)
    
    256 257
     
    
    257 258
     
    
    258 259
     class Reference(YamlFactory):
    

  • buildgrid/_app/settings/reference.yml
    ... ... @@ -74,6 +74,9 @@ instances:
    74 74
             ##
    
    75 75
             # Whether or not writing to the cache is allowed.
    
    76 76
             allow-updates: true
    
    77
    +        ##
    
    78
    +        # Whether failed actions (non-zero exit code) are stored
    
    79
    +        cache-failed-actions: true
    
    77 80
     
    
    78 81
           - !execution
    
    79 82
             ##
    

  • buildgrid/server/actioncache/storage.py
    ... ... @@ -26,6 +26,18 @@ from ..referencestorage.storage import ReferenceCache
    26 26
     
    
    27 27
     class ActionCache(ReferenceCache):
    
    28 28
     
    
    29
    +    def __init__(self, storage, max_cached_refs, allow_updates=True, cache_failed_actions=True):
    
    30
    +        """ Initialises a new ActionCache instance.
    
    31
    +
    
    32
    +        Args:
    
    33
    +            storage (StorageABC): storage backend instance to be used. Passed to ReferenceCache
    
    34
    +            max_cached_refs (int): maximum number of entries to be stored. Passed to ReferenceCache
    
    35
    +            allow_updates (bool): allow the client to write to storage. Passed to ReferenceCache
    
    36
    +            cache_failed_actions (bool): cache actions with non-zero exit codes.
    
    37
    +        """
    
    38
    +        super().__init__(storage, max_cached_refs, allow_updates)
    
    39
    +        self._cache_failed_actions = cache_failed_actions
    
    40
    +
    
    29 41
         def register_instance_with_server(self, instance_name, server):
    
    30 42
             server.add_action_cache_instance(self, instance_name)
    
    31 43
     
    
    ... ... @@ -34,8 +46,9 @@ class ActionCache(ReferenceCache):
    34 46
             return self.get_action_reference(key)
    
    35 47
     
    
    36 48
         def update_action_result(self, action_digest, action_result):
    
    37
    -        key = self._get_key(action_digest)
    
    38
    -        self.update_reference(key, action_result)
    
    49
    +        if self._cache_failed_actions or action_result.exit_code == 0:
    
    50
    +            key = self._get_key(action_digest)
    
    51
    +            self.update_reference(key, action_result)
    
    39 52
     
    
    40 53
         def _get_key(self, action_digest):
    
    41 54
             return (action_digest.hash, action_digest.size_bytes)

  • tests/integration/action_cache_service.py
    ... ... @@ -85,3 +85,37 @@ def test_disabled_update_action_result(context):
    85 85
         ac_service.UpdateActionResult(request, context)
    
    86 86
     
    
    87 87
         context.set_code.assert_called_once_with(grpc.StatusCode.UNIMPLEMENTED)
    
    88
    +
    
    89
    +
    
    90
    +def test_disabled_cache_failed_actions(cas, context):
    
    91
    +    disabled_failed_actions = ActionCache(cas, 50, True, False)
    
    92
    +    with mock.patch.object(service, 'remote_execution_pb2_grpc'):
    
    93
    +        ac_service = ActionCacheService(server)
    
    94
    +        ac_service.add_instance("", disabled_failed_actions)
    
    95
    +
    
    96
    +    failure_action_digest = remote_execution_pb2.Digest(hash='failure', size_bytes=4)
    
    97
    +
    
    98
    +    # Add a non-zero exit code ActionResult to the cache
    
    99
    +    action_result = remote_execution_pb2.ActionResult(stdout_raw=b'Failed', exit_code=1)
    
    100
    +    request = remote_execution_pb2.UpdateActionResultRequest(action_digest=failure_action_digest,
    
    101
    +                                                             action_result=action_result)
    
    102
    +    ac_service.UpdateActionResult(request, context)
    
    103
    +
    
    104
    +    # Check that before adding the ActionResult, attempting to fetch it fails
    
    105
    +    request = remote_execution_pb2.GetActionResultRequest(instance_name="",
    
    106
    +                                                          action_digest=failure_action_digest)
    
    107
    +    ac_service.GetActionResult(request, context)
    
    108
    +    context.set_code.assert_called_once_with(grpc.StatusCode.NOT_FOUND)
    
    109
    +
    
    110
    +    success_action_digest = remote_execution_pb2.Digest(hash='success', size_bytes=4)
    
    111
    +
    
    112
    +    # Now add a zero exit code Action result to the cache, and check that fetching
    
    113
    +    # it is successful
    
    114
    +    success_action_result = remote_execution_pb2.ActionResult(stdout_raw=b'Successful')
    
    115
    +    request = remote_execution_pb2.UpdateActionResultRequest(action_digest=success_action_digest,
    
    116
    +                                                             action_result=success_action_result)
    
    117
    +    ac_service.UpdateActionResult(request, context)
    
    118
    +    request = remote_execution_pb2.GetActionResultRequest(instance_name="",
    
    119
    +                                                          action_digest=success_action_digest)
    
    120
    +    fetched_result = ac_service.GetActionResult(request, context)
    
    121
    +    assert fetched_result.stdout_raw == success_action_result.stdout_raw



  • [Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]