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. Most implementations will read the entire file into memory and return a BytesIO object. Eventually this should be corrected to handle files which cannot fit into memory.

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


Delete the blob from storage if it’s present.


Delete a list of blobs from storage.


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.