@@ -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,22 @@ 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+ Self :: validate_digest_function ( digest_function, Some ( resource_name) ) ?;
291+
281292 error_if ! (
282293 matches!( self . store_type, nativelink_config:: stores:: StoreType :: Ac ) ,
283294 "CAS operation on AC store"
284295 ) ;
285296
286- let request = self . get_read_request ( grpc_request. into_request ( ) . into_inner ( ) ) ?;
287297 self . perform_request ( request, |request| async move {
288298 self . read_internal ( request) . await
289299 } )
@@ -505,6 +515,23 @@ impl GrpcStore {
505515 . await
506516 . map ( |_| ( ) )
507517 }
518+
519+ pub fn validate_digest_function (
520+ digest_function : & str ,
521+ resource_name : Option < & str > ,
522+ ) -> Result < ( ) , Error > {
523+ if !is_supported_digest_function ( digest_function) {
524+ return Err ( make_input_err ! (
525+ "Unsupported digest_function: {}{}" ,
526+ digest_function,
527+ match resource_name {
528+ Some ( name) => format!( " in resource_name '{name}'" ) ,
529+ None => String :: new( ) ,
530+ }
531+ ) ) ;
532+ }
533+ Ok ( ( ) )
534+ }
508535}
509536
510537#[ async_trait]
@@ -516,6 +543,12 @@ impl StoreDriver for GrpcStore {
516543 keys : & [ StoreKey < ' _ > ] ,
517544 results : & mut [ Option < u64 > ] ,
518545 ) -> Result < ( ) , Error > {
546+ let digest_function = Context :: current ( )
547+ . get :: < DigestHasherFunc > ( )
548+ . map_or_else ( default_digest_hasher_func, |v| * v)
549+ . to_string ( ) ;
550+ GrpcStore :: validate_digest_function ( & digest_function, None ) ?;
551+
519552 if matches ! ( self . store_type, nativelink_config:: stores:: StoreType :: Ac ) {
520553 keys. iter ( )
521554 . zip ( results. iter_mut ( ) )
0 commit comments