A storage provider that first checks a cache, then tries a slower fallback provider.

To ensure clients can reliably store blobs in CAS, only get_blob calls are cached – has_blob and missing_blobs will always query the fallback.

class, fallback)



Return True if the blob with the given instance/digest exists.


Return a file-like object containing the blob.

If the blob isn’t present in storage, return None.


Delete the blob from storage if it’s present.


Return a file-like object to which a blob’s contents could be written.

commit_write(digest, write_session)

Commit the write operation. write_session must be an object returned by begin_write.

The storage object is not responsible for verifying that the data written to the write_session actually matches the digest. The caller must do that.


Return a container containing the blobs not present in CAS.


Given a container of (digest, value) tuples, add all the blobs to CAS. Return a list of Status objects corresponding to the result of uploading each of the blobs.

Unlike in commit_write, the storage object will verify that each of the digests matches the provided data.


Given an iterable container of digests, return a {hash: file-like object} dictionary corresponding to the blobs represented by the input digests.