public Task <GetContentLocationsResponse> GetContentLocationsAsync(GetContentLocationsRequest request)
 {
     return(ExecuteAsync(request, async context =>
     {
         Result <IReadOnlyList <ContentLocationEntry> > result = await _store.GetBulkAsync(context, request.Hashes);
         return result.Select(entries => new GetContentLocationsResponse()
         {
             Entries = entries
         });
     }));
 }
 /// <inheritdoc />
 public Task <GetContentLocationsResponse> GetContentLocationsAsync(GetContentLocationsRequest request, CallContext callContext = default)
 {
     return(ExecuteAsync(request, callContext, context =>
     {
         return _store.GetBulkAsync(context, request.Hashes)
         .AsAsync(entries => new GetContentLocationsResponse()
         {
             Entries = entries
         });
     },
                         extraEndMessage: r => {
         if (!r.Succeeded)
         {
             var csv = string.Join(",", request.Hashes);
             return $"Hashes=[{csv}]";
         }
         else
         {
             var entries = r.Value.Entries;
             var csv = string.Join(",", request.Hashes.Zip(entries, (hash, entry) => $"{hash}:{entry.Locations.Count}"));
             return $"Hashes=[{csv}]";
         }
     }));
 }