@@ -44,7 +44,7 @@ use nativelink_util::health_utils::HealthStatusIndicator;
4444use nativelink_util:: proto_stream_utils:: {
4545 FirstStream , WriteRequestStreamWrapper , WriteState , WriteStateWrapper ,
4646} ;
47- use nativelink_util:: resource_info:: ResourceInfo ;
47+ use nativelink_util:: resource_info:: { ResourceInfo , is_supported_digest_function } ;
4848use nativelink_util:: retry:: { Retrier , RetryResult } ;
4949use nativelink_util:: store_trait:: { StoreDriver , StoreKey , UploadSizeInfo } ;
5050use nativelink_util:: { default_health_status_indicator, tls_utils} ;
@@ -278,12 +278,28 @@ impl GrpcStore {
278278 where
279279 R : IntoRequest < ReadRequest > ,
280280 {
281+ const IS_UPLOAD_FALSE : bool = false ;
282+
283+ let request = self . get_read_request ( grpc_request. into_request ( ) . into_inner ( ) ) ?;
284+ let resource_name = & request. resource_name ;
285+ let resource_info = ResourceInfo :: new ( resource_name, IS_UPLOAD_FALSE )
286+ . err_tip ( || "Failed to parse resource_name in GrpcStore::read" ) ?;
287+
288+ let digest_function = resource_info. digest_function . as_deref ( ) . unwrap_or ( "sha256" ) ;
289+
290+ if !is_supported_digest_function ( digest_function) {
291+ return Err ( make_input_err ! (
292+ "Unsupported digest_function: {} in resource_name '{}'" ,
293+ digest_function,
294+ resource_name
295+ ) ) ;
296+ }
297+
281298 error_if ! (
282299 matches!( self . store_type, nativelink_config:: stores:: StoreType :: Ac ) ,
283300 "CAS operation on AC store"
284301 ) ;
285302
286- let request = self . get_read_request ( grpc_request. into_request ( ) . into_inner ( ) ) ?;
287303 self . perform_request ( request, |request| async move {
288304 self . read_internal ( request) . await
289305 } )
@@ -516,6 +532,18 @@ impl StoreDriver for GrpcStore {
516532 keys : & [ StoreKey < ' _ > ] ,
517533 results : & mut [ Option < u64 > ] ,
518534 ) -> Result < ( ) , Error > {
535+ let digest_function = ActiveOriginContext :: get_value ( & ACTIVE_HASHER_FUNC )
536+ . err_tip ( || "In GrpcStore::has_with_results" ) ?
537+ . map_or_else ( default_digest_hasher_func, |v| * v)
538+ . to_string ( ) ;
539+
540+ if !is_supported_digest_function ( & digest_function) {
541+ return Err ( make_input_err ! (
542+ "Unsupported digest_function: {}" ,
543+ digest_function
544+ ) ) ;
545+ }
546+
519547 if matches ! ( self . store_type, nativelink_config:: stores:: StoreType :: Ac ) {
520548 keys. iter ( )
521549 . zip ( results. iter_mut ( ) )
0 commit comments