You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@buildstream.apache.org by tv...@apache.org on 2021/02/04 07:58:38 UTC

[buildstream] 02/26: local_cas: Update proto

This is an automated email from the ASF dual-hosted git repository.

tvb pushed a commit to branch traveltissues/mr4
in repository https://gitbox.apache.org/repos/asf/buildstream.git

commit f3fe105dc3a4d1f7908d13a0f1d5038282f281cd
Author: Darius Makovsky <tr...@protonmail.com>
AuthorDate: Wed Dec 11 14:28:08 2019 +0000

    local_cas: Update proto
---
 .../_protos/build/buildgrid/local_cas.proto        |  20 +-
 .../_protos/build/buildgrid/local_cas_pb2.py       | 249 ++++++++++++---------
 .../_protos/build/buildgrid/local_cas_pb2_grpc.py  |   6 +-
 3 files changed, 158 insertions(+), 117 deletions(-)

diff --git a/src/buildstream/_protos/build/buildgrid/local_cas.proto b/src/buildstream/_protos/build/buildgrid/local_cas.proto
index f2955f97..722ac70 100644
--- a/src/buildstream/_protos/build/buildgrid/local_cas.proto
+++ b/src/buildstream/_protos/build/buildgrid/local_cas.proto
@@ -60,10 +60,10 @@ service LocalContentAddressableStorage {
   // in the local cache. Optionally, this will also fetch all blobs referenced
   // by the `Directory` objects, equivalent to `FetchMissingBlobs`.
   //
-  // If part of the tree is missing from the CAS, the server will return the
-  // portion present and omit the rest.
+  // If no remote CAS is available, this will check presence of the entire
+  // directory tree (and optionally also file blobs) in the local cache.
   //
-  // * `NOT_FOUND`: The requested tree root is not present in the CAS.
+  // * `NOT_FOUND`: The requested tree is not present in the CAS or incomplete.
   rpc FetchTree(FetchTreeRequest) returns (FetchTreeResponse) {}
 
   // Upload the entire directory tree from the local cache to a remote CAS.
@@ -139,7 +139,7 @@ message FetchMissingBlobsRequest {
 // A response message for
 // [LocalContentAddressableStorage.FetchMissingBlobs][build.buildgrid.v2.LocalContentAddressableStorage.FetchMissingBlobs].
 message FetchMissingBlobsResponse {
-  // A response corresponding to a single blob that the client tried to upload.
+  // A response corresponding to a single blob that the client tried to download.
   message Response {
     // The digest to which this response corresponds.
     build.bazel.remote.execution.v2.Digest digest = 1;
@@ -281,6 +281,9 @@ message CaptureTreeRequest {
   // This is a hint whether the blobs shall be uploaded to the remote CAS
   // without first storing them in the local cache.
   bool bypass_local_cache = 3;
+
+  // The properties of path(s) in the local filesystem to capture.
+  repeated string node_properties = 4;
 }
 
 // A response message for
@@ -320,6 +323,9 @@ message CaptureFilesRequest {
   // This is a hint whether the blobs shall be uploaded to the remote CAS
   // without first storing them in the local cache.
   bool bypass_local_cache = 3;
+
+  // The properties of path(s) in the local filesystem to capture.
+  repeated string node_properties = 4;
 }
 
 // A response message for
@@ -335,6 +341,12 @@ message CaptureFilesResponse {
 
     // The result of attempting to capture and upload the file.
     google.rpc.Status status = 3;
+
+    // True if the captured file was executable, false otherwise.
+    bool is_executable = 4;
+
+    // The node properties of the captured file.
+    repeated build.bazel.remote.execution.v2.NodeProperty node_properties = 5;
   }
 
   // The responses to the requests.
diff --git a/src/buildstream/_protos/build/buildgrid/local_cas_pb2.py b/src/buildstream/_protos/build/buildgrid/local_cas_pb2.py
index 06df138..6be3662 100644
--- a/src/buildstream/_protos/build/buildgrid/local_cas_pb2.py
+++ b/src/buildstream/_protos/build/buildgrid/local_cas_pb2.py
@@ -23,7 +23,7 @@ DESCRIPTOR = _descriptor.FileDescriptor(
   package='build.buildgrid',
   syntax='proto3',
   serialized_options=None,
-  serialized_pb=_b('\n\x1f\x62uild/buildgrid/local_cas.proto\x12\x0f\x62uild.buildgrid\x1a\x36\x62uild/bazel/remote/execution/v2/remote_execution.proto\x1a\x1cgoogle/api/annotations.proto\x1a\x17google/rpc/status.proto\"p\n\x18\x46\x65tchMissingBlobsRequest\x12\x15\n\rinstance_name\x18\x01 \x01(\t\x12=\n\x0c\x62lob_digests\x18\x02 \x03(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\"\xcc\x01\n\x19\x46\x65tchMissingBlobsResponse\x12\x46\n\tresponses\x18\x01 \x03(\x0b\x32\x33.build.buil [...]
+  serialized_pb=_b('\n\x1f\x62uild/buildgrid/local_cas.proto\x12\x0f\x62uild.buildgrid\x1a\x36\x62uild/bazel/remote/execution/v2/remote_execution.proto\x1a\x1cgoogle/api/annotations.proto\x1a\x17google/rpc/status.proto\"p\n\x18\x46\x65tchMissingBlobsRequest\x12\x15\n\rinstance_name\x18\x01 \x01(\t\x12=\n\x0c\x62lob_digests\x18\x02 \x03(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\"\xcc\x01\n\x19\x46\x65tchMissingBlobsResponse\x12\x46\n\tresponses\x18\x01 \x03(\x0b\x32\x33.build.buil [...]
   ,
   dependencies=[build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2.DESCRIPTOR,google_dot_api_dot_annotations__pb2.DESCRIPTOR,google_dot_rpc_dot_status__pb2.DESCRIPTOR,])
 
@@ -477,6 +477,13 @@ _CAPTURETREEREQUEST = _descriptor.Descriptor(
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='node_properties', full_name='build.buildgrid.CaptureTreeRequest.node_properties', index=3,
+      number=4, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
   ],
   extensions=[
   ],
@@ -490,7 +497,7 @@ _CAPTURETREEREQUEST = _descriptor.Descriptor(
   oneofs=[
   ],
   serialized_start=1243,
-  serialized_end=1328,
+  serialized_end=1353,
 )
 
 
@@ -534,8 +541,8 @@ _CAPTURETREERESPONSE_RESPONSE = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1420,
-  serialized_end=1542,
+  serialized_start=1445,
+  serialized_end=1567,
 )
 
 _CAPTURETREERESPONSE = _descriptor.Descriptor(
@@ -564,8 +571,8 @@ _CAPTURETREERESPONSE = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1331,
-  serialized_end=1542,
+  serialized_start=1356,
+  serialized_end=1567,
 )
 
 
@@ -597,6 +604,13 @@ _CAPTUREFILESREQUEST = _descriptor.Descriptor(
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='node_properties', full_name='build.buildgrid.CaptureFilesRequest.node_properties', index=3,
+      number=4, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
   ],
   extensions=[
   ],
@@ -609,8 +623,8 @@ _CAPTUREFILESREQUEST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1544,
-  serialized_end=1630,
+  serialized_start=1569,
+  serialized_end=1680,
 )
 
 
@@ -642,6 +656,20 @@ _CAPTUREFILESRESPONSE_RESPONSE = _descriptor.Descriptor(
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='is_executable', full_name='build.buildgrid.CaptureFilesResponse.Response.is_executable', index=3,
+      number=4, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='node_properties', full_name='build.buildgrid.CaptureFilesResponse.Response.node_properties', index=4,
+      number=5, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
   ],
   extensions=[
   ],
@@ -654,8 +682,8 @@ _CAPTUREFILESRESPONSE_RESPONSE = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1724,
-  serialized_end=1841,
+  serialized_start=1775,
+  serialized_end=1987,
 )
 
 _CAPTUREFILESRESPONSE = _descriptor.Descriptor(
@@ -684,8 +712,8 @@ _CAPTUREFILESRESPONSE = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1633,
-  serialized_end=1841,
+  serialized_start=1683,
+  serialized_end=1987,
 )
 
 
@@ -743,8 +771,8 @@ _GETINSTANCENAMEFORREMOTEREQUEST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1844,
-  serialized_end=1975,
+  serialized_start=1990,
+  serialized_end=2121,
 )
 
 
@@ -774,8 +802,8 @@ _GETINSTANCENAMEFORREMOTERESPONSE = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1977,
-  serialized_end=2034,
+  serialized_start=2123,
+  serialized_end=2180,
 )
 
 
@@ -798,8 +826,8 @@ _GETLOCALDISKUSAGEREQUEST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=2036,
-  serialized_end=2062,
+  serialized_start=2182,
+  serialized_end=2208,
 )
 
 
@@ -836,8 +864,8 @@ _GETLOCALDISKUSAGERESPONSE = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=2064,
-  serialized_end=2132,
+  serialized_start=2210,
+  serialized_end=2278,
 )
 
 _FETCHMISSINGBLOBSREQUEST.fields_by_name['blob_digests'].message_type = build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2._DIGEST
@@ -859,6 +887,7 @@ _CAPTURETREERESPONSE_RESPONSE.containing_type = _CAPTURETREERESPONSE
 _CAPTURETREERESPONSE.fields_by_name['responses'].message_type = _CAPTURETREERESPONSE_RESPONSE
 _CAPTUREFILESRESPONSE_RESPONSE.fields_by_name['digest'].message_type = build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2._DIGEST
 _CAPTUREFILESRESPONSE_RESPONSE.fields_by_name['status'].message_type = google_dot_rpc_dot_status__pb2._STATUS
+_CAPTUREFILESRESPONSE_RESPONSE.fields_by_name['node_properties'].message_type = build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2._NODEPROPERTY
 _CAPTUREFILESRESPONSE_RESPONSE.containing_type = _CAPTUREFILESRESPONSE
 _CAPTUREFILESRESPONSE.fields_by_name['responses'].message_type = _CAPTUREFILESRESPONSE_RESPONSE
 DESCRIPTOR.message_types_by_name['FetchMissingBlobsRequest'] = _FETCHMISSINGBLOBSREQUEST
@@ -881,162 +910,162 @@ DESCRIPTOR.message_types_by_name['GetLocalDiskUsageRequest'] = _GETLOCALDISKUSAG
 DESCRIPTOR.message_types_by_name['GetLocalDiskUsageResponse'] = _GETLOCALDISKUSAGERESPONSE
 _sym_db.RegisterFileDescriptor(DESCRIPTOR)
 
-FetchMissingBlobsRequest = _reflection.GeneratedProtocolMessageType('FetchMissingBlobsRequest', (_message.Message,), dict(
-  DESCRIPTOR = _FETCHMISSINGBLOBSREQUEST,
-  __module__ = 'build.buildgrid.local_cas_pb2'
+FetchMissingBlobsRequest = _reflection.GeneratedProtocolMessageType('FetchMissingBlobsRequest', (_message.Message,), {
+  'DESCRIPTOR' : _FETCHMISSINGBLOBSREQUEST,
+  '__module__' : 'build.buildgrid.local_cas_pb2'
   # @@protoc_insertion_point(class_scope:build.buildgrid.FetchMissingBlobsRequest)
-  ))
+  })
 _sym_db.RegisterMessage(FetchMissingBlobsRequest)
 
-FetchMissingBlobsResponse = _reflection.GeneratedProtocolMessageType('FetchMissingBlobsResponse', (_message.Message,), dict(
+FetchMissingBlobsResponse = _reflection.GeneratedProtocolMessageType('FetchMissingBlobsResponse', (_message.Message,), {
 
-  Response = _reflection.GeneratedProtocolMessageType('Response', (_message.Message,), dict(
-    DESCRIPTOR = _FETCHMISSINGBLOBSRESPONSE_RESPONSE,
-    __module__ = 'build.buildgrid.local_cas_pb2'
+  'Response' : _reflection.GeneratedProtocolMessageType('Response', (_message.Message,), {
+    'DESCRIPTOR' : _FETCHMISSINGBLOBSRESPONSE_RESPONSE,
+    '__module__' : 'build.buildgrid.local_cas_pb2'
     # @@protoc_insertion_point(class_scope:build.buildgrid.FetchMissingBlobsResponse.Response)
-    ))
+    })
   ,
-  DESCRIPTOR = _FETCHMISSINGBLOBSRESPONSE,
-  __module__ = 'build.buildgrid.local_cas_pb2'
+  'DESCRIPTOR' : _FETCHMISSINGBLOBSRESPONSE,
+  '__module__' : 'build.buildgrid.local_cas_pb2'
   # @@protoc_insertion_point(class_scope:build.buildgrid.FetchMissingBlobsResponse)
-  ))
+  })
 _sym_db.RegisterMessage(FetchMissingBlobsResponse)
 _sym_db.RegisterMessage(FetchMissingBlobsResponse.Response)
 
-UploadMissingBlobsRequest = _reflection.GeneratedProtocolMessageType('UploadMissingBlobsRequest', (_message.Message,), dict(
-  DESCRIPTOR = _UPLOADMISSINGBLOBSREQUEST,
-  __module__ = 'build.buildgrid.local_cas_pb2'
+UploadMissingBlobsRequest = _reflection.GeneratedProtocolMessageType('UploadMissingBlobsRequest', (_message.Message,), {
+  'DESCRIPTOR' : _UPLOADMISSINGBLOBSREQUEST,
+  '__module__' : 'build.buildgrid.local_cas_pb2'
   # @@protoc_insertion_point(class_scope:build.buildgrid.UploadMissingBlobsRequest)
-  ))
+  })
 _sym_db.RegisterMessage(UploadMissingBlobsRequest)
 
-UploadMissingBlobsResponse = _reflection.GeneratedProtocolMessageType('UploadMissingBlobsResponse', (_message.Message,), dict(
+UploadMissingBlobsResponse = _reflection.GeneratedProtocolMessageType('UploadMissingBlobsResponse', (_message.Message,), {
 
-  Response = _reflection.GeneratedProtocolMessageType('Response', (_message.Message,), dict(
-    DESCRIPTOR = _UPLOADMISSINGBLOBSRESPONSE_RESPONSE,
-    __module__ = 'build.buildgrid.local_cas_pb2'
+  'Response' : _reflection.GeneratedProtocolMessageType('Response', (_message.Message,), {
+    'DESCRIPTOR' : _UPLOADMISSINGBLOBSRESPONSE_RESPONSE,
+    '__module__' : 'build.buildgrid.local_cas_pb2'
     # @@protoc_insertion_point(class_scope:build.buildgrid.UploadMissingBlobsResponse.Response)
-    ))
+    })
   ,
-  DESCRIPTOR = _UPLOADMISSINGBLOBSRESPONSE,
-  __module__ = 'build.buildgrid.local_cas_pb2'
+  'DESCRIPTOR' : _UPLOADMISSINGBLOBSRESPONSE,
+  '__module__' : 'build.buildgrid.local_cas_pb2'
   # @@protoc_insertion_point(class_scope:build.buildgrid.UploadMissingBlobsResponse)
-  ))
+  })
 _sym_db.RegisterMessage(UploadMissingBlobsResponse)
 _sym_db.RegisterMessage(UploadMissingBlobsResponse.Response)
 
-FetchTreeRequest = _reflection.GeneratedProtocolMessageType('FetchTreeRequest', (_message.Message,), dict(
-  DESCRIPTOR = _FETCHTREEREQUEST,
-  __module__ = 'build.buildgrid.local_cas_pb2'
+FetchTreeRequest = _reflection.GeneratedProtocolMessageType('FetchTreeRequest', (_message.Message,), {
+  'DESCRIPTOR' : _FETCHTREEREQUEST,
+  '__module__' : 'build.buildgrid.local_cas_pb2'
   # @@protoc_insertion_point(class_scope:build.buildgrid.FetchTreeRequest)
-  ))
+  })
 _sym_db.RegisterMessage(FetchTreeRequest)
 
-FetchTreeResponse = _reflection.GeneratedProtocolMessageType('FetchTreeResponse', (_message.Message,), dict(
-  DESCRIPTOR = _FETCHTREERESPONSE,
-  __module__ = 'build.buildgrid.local_cas_pb2'
+FetchTreeResponse = _reflection.GeneratedProtocolMessageType('FetchTreeResponse', (_message.Message,), {
+  'DESCRIPTOR' : _FETCHTREERESPONSE,
+  '__module__' : 'build.buildgrid.local_cas_pb2'
   # @@protoc_insertion_point(class_scope:build.buildgrid.FetchTreeResponse)
-  ))
+  })
 _sym_db.RegisterMessage(FetchTreeResponse)
 
-UploadTreeRequest = _reflection.GeneratedProtocolMessageType('UploadTreeRequest', (_message.Message,), dict(
-  DESCRIPTOR = _UPLOADTREEREQUEST,
-  __module__ = 'build.buildgrid.local_cas_pb2'
+UploadTreeRequest = _reflection.GeneratedProtocolMessageType('UploadTreeRequest', (_message.Message,), {
+  'DESCRIPTOR' : _UPLOADTREEREQUEST,
+  '__module__' : 'build.buildgrid.local_cas_pb2'
   # @@protoc_insertion_point(class_scope:build.buildgrid.UploadTreeRequest)
-  ))
+  })
 _sym_db.RegisterMessage(UploadTreeRequest)
 
-UploadTreeResponse = _reflection.GeneratedProtocolMessageType('UploadTreeResponse', (_message.Message,), dict(
-  DESCRIPTOR = _UPLOADTREERESPONSE,
-  __module__ = 'build.buildgrid.local_cas_pb2'
+UploadTreeResponse = _reflection.GeneratedProtocolMessageType('UploadTreeResponse', (_message.Message,), {
+  'DESCRIPTOR' : _UPLOADTREERESPONSE,
+  '__module__' : 'build.buildgrid.local_cas_pb2'
   # @@protoc_insertion_point(class_scope:build.buildgrid.UploadTreeResponse)
-  ))
+  })
 _sym_db.RegisterMessage(UploadTreeResponse)
 
-StageTreeRequest = _reflection.GeneratedProtocolMessageType('StageTreeRequest', (_message.Message,), dict(
-  DESCRIPTOR = _STAGETREEREQUEST,
-  __module__ = 'build.buildgrid.local_cas_pb2'
+StageTreeRequest = _reflection.GeneratedProtocolMessageType('StageTreeRequest', (_message.Message,), {
+  'DESCRIPTOR' : _STAGETREEREQUEST,
+  '__module__' : 'build.buildgrid.local_cas_pb2'
   # @@protoc_insertion_point(class_scope:build.buildgrid.StageTreeRequest)
-  ))
+  })
 _sym_db.RegisterMessage(StageTreeRequest)
 
-StageTreeResponse = _reflection.GeneratedProtocolMessageType('StageTreeResponse', (_message.Message,), dict(
-  DESCRIPTOR = _STAGETREERESPONSE,
-  __module__ = 'build.buildgrid.local_cas_pb2'
+StageTreeResponse = _reflection.GeneratedProtocolMessageType('StageTreeResponse', (_message.Message,), {
+  'DESCRIPTOR' : _STAGETREERESPONSE,
+  '__module__' : 'build.buildgrid.local_cas_pb2'
   # @@protoc_insertion_point(class_scope:build.buildgrid.StageTreeResponse)
-  ))
+  })
 _sym_db.RegisterMessage(StageTreeResponse)
 
-CaptureTreeRequest = _reflection.GeneratedProtocolMessageType('CaptureTreeRequest', (_message.Message,), dict(
-  DESCRIPTOR = _CAPTURETREEREQUEST,
-  __module__ = 'build.buildgrid.local_cas_pb2'
+CaptureTreeRequest = _reflection.GeneratedProtocolMessageType('CaptureTreeRequest', (_message.Message,), {
+  'DESCRIPTOR' : _CAPTURETREEREQUEST,
+  '__module__' : 'build.buildgrid.local_cas_pb2'
   # @@protoc_insertion_point(class_scope:build.buildgrid.CaptureTreeRequest)
-  ))
+  })
 _sym_db.RegisterMessage(CaptureTreeRequest)
 
-CaptureTreeResponse = _reflection.GeneratedProtocolMessageType('CaptureTreeResponse', (_message.Message,), dict(
+CaptureTreeResponse = _reflection.GeneratedProtocolMessageType('CaptureTreeResponse', (_message.Message,), {
 
-  Response = _reflection.GeneratedProtocolMessageType('Response', (_message.Message,), dict(
-    DESCRIPTOR = _CAPTURETREERESPONSE_RESPONSE,
-    __module__ = 'build.buildgrid.local_cas_pb2'
+  'Response' : _reflection.GeneratedProtocolMessageType('Response', (_message.Message,), {
+    'DESCRIPTOR' : _CAPTURETREERESPONSE_RESPONSE,
+    '__module__' : 'build.buildgrid.local_cas_pb2'
     # @@protoc_insertion_point(class_scope:build.buildgrid.CaptureTreeResponse.Response)
-    ))
+    })
   ,
-  DESCRIPTOR = _CAPTURETREERESPONSE,
-  __module__ = 'build.buildgrid.local_cas_pb2'
+  'DESCRIPTOR' : _CAPTURETREERESPONSE,
+  '__module__' : 'build.buildgrid.local_cas_pb2'
   # @@protoc_insertion_point(class_scope:build.buildgrid.CaptureTreeResponse)
-  ))
+  })
 _sym_db.RegisterMessage(CaptureTreeResponse)
 _sym_db.RegisterMessage(CaptureTreeResponse.Response)
 
-CaptureFilesRequest = _reflection.GeneratedProtocolMessageType('CaptureFilesRequest', (_message.Message,), dict(
-  DESCRIPTOR = _CAPTUREFILESREQUEST,
-  __module__ = 'build.buildgrid.local_cas_pb2'
+CaptureFilesRequest = _reflection.GeneratedProtocolMessageType('CaptureFilesRequest', (_message.Message,), {
+  'DESCRIPTOR' : _CAPTUREFILESREQUEST,
+  '__module__' : 'build.buildgrid.local_cas_pb2'
   # @@protoc_insertion_point(class_scope:build.buildgrid.CaptureFilesRequest)
-  ))
+  })
 _sym_db.RegisterMessage(CaptureFilesRequest)
 
-CaptureFilesResponse = _reflection.GeneratedProtocolMessageType('CaptureFilesResponse', (_message.Message,), dict(
+CaptureFilesResponse = _reflection.GeneratedProtocolMessageType('CaptureFilesResponse', (_message.Message,), {
 
-  Response = _reflection.GeneratedProtocolMessageType('Response', (_message.Message,), dict(
-    DESCRIPTOR = _CAPTUREFILESRESPONSE_RESPONSE,
-    __module__ = 'build.buildgrid.local_cas_pb2'
+  'Response' : _reflection.GeneratedProtocolMessageType('Response', (_message.Message,), {
+    'DESCRIPTOR' : _CAPTUREFILESRESPONSE_RESPONSE,
+    '__module__' : 'build.buildgrid.local_cas_pb2'
     # @@protoc_insertion_point(class_scope:build.buildgrid.CaptureFilesResponse.Response)
-    ))
+    })
   ,
-  DESCRIPTOR = _CAPTUREFILESRESPONSE,
-  __module__ = 'build.buildgrid.local_cas_pb2'
+  'DESCRIPTOR' : _CAPTUREFILESRESPONSE,
+  '__module__' : 'build.buildgrid.local_cas_pb2'
   # @@protoc_insertion_point(class_scope:build.buildgrid.CaptureFilesResponse)
-  ))
+  })
 _sym_db.RegisterMessage(CaptureFilesResponse)
 _sym_db.RegisterMessage(CaptureFilesResponse.Response)
 
-GetInstanceNameForRemoteRequest = _reflection.GeneratedProtocolMessageType('GetInstanceNameForRemoteRequest', (_message.Message,), dict(
-  DESCRIPTOR = _GETINSTANCENAMEFORREMOTEREQUEST,
-  __module__ = 'build.buildgrid.local_cas_pb2'
+GetInstanceNameForRemoteRequest = _reflection.GeneratedProtocolMessageType('GetInstanceNameForRemoteRequest', (_message.Message,), {
+  'DESCRIPTOR' : _GETINSTANCENAMEFORREMOTEREQUEST,
+  '__module__' : 'build.buildgrid.local_cas_pb2'
   # @@protoc_insertion_point(class_scope:build.buildgrid.GetInstanceNameForRemoteRequest)
-  ))
+  })
 _sym_db.RegisterMessage(GetInstanceNameForRemoteRequest)
 
-GetInstanceNameForRemoteResponse = _reflection.GeneratedProtocolMessageType('GetInstanceNameForRemoteResponse', (_message.Message,), dict(
-  DESCRIPTOR = _GETINSTANCENAMEFORREMOTERESPONSE,
-  __module__ = 'build.buildgrid.local_cas_pb2'
+GetInstanceNameForRemoteResponse = _reflection.GeneratedProtocolMessageType('GetInstanceNameForRemoteResponse', (_message.Message,), {
+  'DESCRIPTOR' : _GETINSTANCENAMEFORREMOTERESPONSE,
+  '__module__' : 'build.buildgrid.local_cas_pb2'
   # @@protoc_insertion_point(class_scope:build.buildgrid.GetInstanceNameForRemoteResponse)
-  ))
+  })
 _sym_db.RegisterMessage(GetInstanceNameForRemoteResponse)
 
-GetLocalDiskUsageRequest = _reflection.GeneratedProtocolMessageType('GetLocalDiskUsageRequest', (_message.Message,), dict(
-  DESCRIPTOR = _GETLOCALDISKUSAGEREQUEST,
-  __module__ = 'build.buildgrid.local_cas_pb2'
+GetLocalDiskUsageRequest = _reflection.GeneratedProtocolMessageType('GetLocalDiskUsageRequest', (_message.Message,), {
+  'DESCRIPTOR' : _GETLOCALDISKUSAGEREQUEST,
+  '__module__' : 'build.buildgrid.local_cas_pb2'
   # @@protoc_insertion_point(class_scope:build.buildgrid.GetLocalDiskUsageRequest)
-  ))
+  })
 _sym_db.RegisterMessage(GetLocalDiskUsageRequest)
 
-GetLocalDiskUsageResponse = _reflection.GeneratedProtocolMessageType('GetLocalDiskUsageResponse', (_message.Message,), dict(
-  DESCRIPTOR = _GETLOCALDISKUSAGERESPONSE,
-  __module__ = 'build.buildgrid.local_cas_pb2'
+GetLocalDiskUsageResponse = _reflection.GeneratedProtocolMessageType('GetLocalDiskUsageResponse', (_message.Message,), {
+  'DESCRIPTOR' : _GETLOCALDISKUSAGERESPONSE,
+  '__module__' : 'build.buildgrid.local_cas_pb2'
   # @@protoc_insertion_point(class_scope:build.buildgrid.GetLocalDiskUsageResponse)
-  ))
+  })
 _sym_db.RegisterMessage(GetLocalDiskUsageResponse)
 
 
@@ -1047,8 +1076,8 @@ _LOCALCONTENTADDRESSABLESTORAGE = _descriptor.ServiceDescriptor(
   file=DESCRIPTOR,
   index=0,
   serialized_options=None,
-  serialized_start=2135,
-  serialized_end=3084,
+  serialized_start=2281,
+  serialized_end=3230,
   methods=[
   _descriptor.MethodDescriptor(
     name='FetchMissingBlobs',
diff --git a/src/buildstream/_protos/build/buildgrid/local_cas_pb2_grpc.py b/src/buildstream/_protos/build/buildgrid/local_cas_pb2_grpc.py
index 8dfaec7..68af482 100644
--- a/src/buildstream/_protos/build/buildgrid/local_cas_pb2_grpc.py
+++ b/src/buildstream/_protos/build/buildgrid/local_cas_pb2_grpc.py
@@ -113,10 +113,10 @@ class LocalContentAddressableStorageServicer(object):
     in the local cache. Optionally, this will also fetch all blobs referenced
     by the `Directory` objects, equivalent to `FetchMissingBlobs`.
 
-    If part of the tree is missing from the CAS, the server will return the
-    portion present and omit the rest.
+    If no remote CAS is available, this will check presence of the entire
+    directory tree (and optionally also file blobs) in the local cache.
 
-    * `NOT_FOUND`: The requested tree root is not present in the CAS.
+    * `NOT_FOUND`: The requested tree is not present in the CAS or incomplete.
     """
     context.set_code(grpc.StatusCode.UNIMPLEMENTED)
     context.set_details('Method not implemented!')