xref: /aosp_15_r20/external/federated-compute/fcp/client/cache/resource_cache.h (revision 14675a029014e728ec732f129a32e299b2da0601)
1*14675a02SAndroid Build Coastguard Worker /*
2*14675a02SAndroid Build Coastguard Worker  * Copyright 2022 Google LLC
3*14675a02SAndroid Build Coastguard Worker  *
4*14675a02SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*14675a02SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*14675a02SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*14675a02SAndroid Build Coastguard Worker  *
8*14675a02SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*14675a02SAndroid Build Coastguard Worker  *
10*14675a02SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*14675a02SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*14675a02SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*14675a02SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*14675a02SAndroid Build Coastguard Worker  * limitations under the License.
15*14675a02SAndroid Build Coastguard Worker  */
16*14675a02SAndroid Build Coastguard Worker 
17*14675a02SAndroid Build Coastguard Worker #ifndef FCP_CLIENT_CACHE_RESOURCE_CACHE_H_
18*14675a02SAndroid Build Coastguard Worker #define FCP_CLIENT_CACHE_RESOURCE_CACHE_H_
19*14675a02SAndroid Build Coastguard Worker 
20*14675a02SAndroid Build Coastguard Worker #include <optional>
21*14675a02SAndroid Build Coastguard Worker 
22*14675a02SAndroid Build Coastguard Worker #include "google/protobuf/any.pb.h"
23*14675a02SAndroid Build Coastguard Worker #include "absl/status/status.h"
24*14675a02SAndroid Build Coastguard Worker #include "absl/status/statusor.h"
25*14675a02SAndroid Build Coastguard Worker #include "absl/strings/cord.h"
26*14675a02SAndroid Build Coastguard Worker 
27*14675a02SAndroid Build Coastguard Worker namespace fcp {
28*14675a02SAndroid Build Coastguard Worker namespace client {
29*14675a02SAndroid Build Coastguard Worker namespace cache {
30*14675a02SAndroid Build Coastguard Worker 
31*14675a02SAndroid Build Coastguard Worker /**
32*14675a02SAndroid Build Coastguard Worker  * A ResourceCache is an interface for a cache that stores resources (entries)
33*14675a02SAndroid Build Coastguard Worker  * for a certain duration. A resource consists of an absl::Cord payload and
34*14675a02SAndroid Build Coastguard Worker  * accompanying metadata, keyed by a string ID.
35*14675a02SAndroid Build Coastguard Worker  */
36*14675a02SAndroid Build Coastguard Worker class ResourceCache {
37*14675a02SAndroid Build Coastguard Worker  public:
38*14675a02SAndroid Build Coastguard Worker   struct ResourceAndMetadata {
39*14675a02SAndroid Build Coastguard Worker     absl::Cord resource;
40*14675a02SAndroid Build Coastguard Worker     google::protobuf::Any metadata;
41*14675a02SAndroid Build Coastguard Worker   };
42*14675a02SAndroid Build Coastguard Worker 
43*14675a02SAndroid Build Coastguard Worker   virtual ~ResourceCache() = default;
44*14675a02SAndroid Build Coastguard Worker 
45*14675a02SAndroid Build Coastguard Worker   // Stores resource`under key cache_id. Will be deleted after now + max_age. If
46*14675a02SAndroid Build Coastguard Worker   // cache_id already exists, the corresponding resource and metadata will be
47*14675a02SAndroid Build Coastguard Worker   // overwritten. Metadata will be returned along with the resource when Get()
48*14675a02SAndroid Build Coastguard Worker   // is called. A Resource is *not* guaranteed to be cached until now + max_age,
49*14675a02SAndroid Build Coastguard Worker   // implementations may choose to delete resources earlier if needed. Returns
50*14675a02SAndroid Build Coastguard Worker   // Ok on success On error, returns
51*14675a02SAndroid Build Coastguard Worker   // - INTERNAL - unexpected error.
52*14675a02SAndroid Build Coastguard Worker   // - INVALID_ARGUMENT - if max_age is in the past.
53*14675a02SAndroid Build Coastguard Worker   // - RESOURCE_EXHAUSTED - if the resource is too big too be cached.
54*14675a02SAndroid Build Coastguard Worker   virtual absl::Status Put(absl::string_view cache_id,
55*14675a02SAndroid Build Coastguard Worker                            const absl::Cord& resource,
56*14675a02SAndroid Build Coastguard Worker                            const google::protobuf::Any& metadata,
57*14675a02SAndroid Build Coastguard Worker                            absl::Duration max_age) = 0;
58*14675a02SAndroid Build Coastguard Worker 
59*14675a02SAndroid Build Coastguard Worker   // Returns resource along with caller-provided stored metadata.
60*14675a02SAndroid Build Coastguard Worker   // If max_age is set, the stored max_age for this cache_id will be updated.
61*14675a02SAndroid Build Coastguard Worker   // Returns Ok on success
62*14675a02SAndroid Build Coastguard Worker   // On error, returns
63*14675a02SAndroid Build Coastguard Worker   // - INTERNAL - unexpected error.
64*14675a02SAndroid Build Coastguard Worker   // - NOT_FOUND - if cache_id not in ResourceCache
65*14675a02SAndroid Build Coastguard Worker   virtual absl::StatusOr<ResourceAndMetadata> Get(
66*14675a02SAndroid Build Coastguard Worker       absl::string_view cache_id, std::optional<absl::Duration> max_age) = 0;
67*14675a02SAndroid Build Coastguard Worker };
68*14675a02SAndroid Build Coastguard Worker 
69*14675a02SAndroid Build Coastguard Worker }  // namespace cache
70*14675a02SAndroid Build Coastguard Worker }  // namespace client
71*14675a02SAndroid Build Coastguard Worker }  // namespace fcp
72*14675a02SAndroid Build Coastguard Worker 
73*14675a02SAndroid Build Coastguard Worker #endif  // FCP_CLIENT_CACHE_RESOURCE_CACHE_H_
74