buildgrid.server.cas.storage.replicated module

ReplicatedStorage

A storage provider which stores data in multiple storages, replicating any data missing in some but present in others.

class buildgrid.server.cas.storage.replicated.ReplicatedStorage(storages: list[StorageABC], replication_queue_size: int = 0, replication_threadpool_size: int = 1, read_replication: bool = True)

Bases: StorageABC

TYPE: str = 'Replicated'
start() None
stop() None
replication_loop(shutdown_requested: Event) None
has_blob(digest: Digest) bool

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

get_blob(digest: Digest) IO[bytes] | None

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.

The file-like object must be readable and seekable.

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

delete_blob(digest: Digest) None

Delete the blob from storage if it’s present.

commit_write(digest: Digest, write_session: IO[bytes]) None

Store the contents for a digest.

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.

bulk_delete(digests: list[Digest]) list[str]

Delete a list of blobs from storage.

missing_blobs(digests: list[Digest]) list[Digest]

Call missing_blobs on each storage and only report a blob is missing if it’s in none of the storages. The number of blobs missing from a storage but present in others is logged and published as a metric

bulk_update_blobs(blobs: list[tuple[Digest, bytes]]) list[Status]

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.

The storage object is not responsible for verifying that the data for each blob actually matches the digest. The caller must do that.

bulk_read_blobs(digests: list[Digest]) dict[str, bytes]

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

Each file-like object must be readable and seekable.