@@ -45,7 +45,7 @@ use nativelink_util::origin_context::ActiveOriginContext;
4545use nativelink_util:: proto_stream_utils:: {
4646 FirstStream , WriteRequestStreamWrapper , WriteState , WriteStateWrapper ,
4747} ;
48- use nativelink_util:: resource_info:: ResourceInfo ;
48+ use nativelink_util:: resource_info:: { is_supported_digest_function , ResourceInfo } ;
4949use nativelink_util:: retry:: { Retrier , RetryResult } ;
5050use nativelink_util:: store_trait:: { StoreDriver , StoreKey , UploadSizeInfo } ;
5151use nativelink_util:: { default_health_status_indicator, tls_utils} ;
@@ -276,12 +276,28 @@ impl GrpcStore {
276276 & self ,
277277 grpc_request : impl IntoRequest < ReadRequest > ,
278278 ) -> Result < impl Stream < Item = Result < ReadResponse , Status > > , Error > {
279+ const IS_UPLOAD_FALSE : bool = false ;
280+
281+ let request = self . get_read_request ( grpc_request. into_request ( ) . into_inner ( ) ) ?;
282+ let resource_name = & request. resource_name ;
283+ let resource_info = ResourceInfo :: new ( resource_name, IS_UPLOAD_FALSE )
284+ . err_tip ( || "Failed to parse resource_name in GrpcStore::read" ) ?;
285+
286+ let digest_function = resource_info. digest_function . as_deref ( ) . unwrap_or ( "sha256" ) ;
287+
288+ if !is_supported_digest_function ( digest_function) {
289+ return Err ( make_input_err ! (
290+ "Unsupported digest_function: {} in resource_name '{}'" ,
291+ digest_function,
292+ resource_name
293+ ) ) ;
294+ }
295+
279296 error_if ! (
280297 matches!( self . store_type, nativelink_config:: stores:: StoreType :: ac) ,
281298 "CAS operation on AC store"
282299 ) ;
283300
284- let request = self . get_read_request ( grpc_request. into_request ( ) . into_inner ( ) ) ?;
285301 self . perform_request ( request, |request| async move {
286302 self . read_internal ( request) . await
287303 } )
@@ -514,6 +530,18 @@ impl StoreDriver for GrpcStore {
514530 keys : & [ StoreKey < ' _ > ] ,
515531 results : & mut [ Option < u64 > ] ,
516532 ) -> Result < ( ) , Error > {
533+ let digest_function = ActiveOriginContext :: get_value ( & ACTIVE_HASHER_FUNC )
534+ . err_tip ( || "In GrpcStore::has_with_results" ) ?
535+ . map_or_else ( default_digest_hasher_func, |v| * v)
536+ . to_string ( ) ;
537+
538+ if !is_supported_digest_function ( & digest_function) {
539+ return Err ( make_input_err ! (
540+ "Unsupported digest_function: {}" ,
541+ digest_function
542+ ) ) ;
543+ }
544+
517545 if matches ! ( self . store_type, nativelink_config:: stores:: StoreType :: ac) {
518546 keys. iter ( )
519547 . zip ( results. iter_mut ( ) )
0 commit comments