Reimplement cache support for blobs in the registry data model
This commit is contained in:
parent
7a68c41f1c
commit
a172de4fdc
7 changed files with 109 additions and 16 deletions
|
@ -8,8 +8,10 @@ from peewee import IntegrityError
|
|||
|
||||
from data import database
|
||||
from data import model
|
||||
from data.cache import cache_key
|
||||
from data.database import db_transaction
|
||||
from data.registry_model.interface import RegistryDataInterface
|
||||
from data.registry_model.datatype import FromDictionaryException
|
||||
from data.registry_model.datatypes import (Tag, RepositoryReference, Manifest, LegacyImage, Label,
|
||||
SecurityScanStatus, ManifestLayer, Blob, DerivedImage,
|
||||
TorrentInfo, BlobUpload)
|
||||
|
@ -685,6 +687,36 @@ class PreOCIModel(RegistryDataInterface):
|
|||
torrent_info = model.storage.save_torrent_info(image_storage, piece_length, pieces)
|
||||
return TorrentInfo.for_torrent_info(torrent_info)
|
||||
|
||||
def get_cached_repo_blob(self, model_cache, namespace_name, repo_name, blob_digest):
|
||||
"""
|
||||
Returns the blob in the repository with the given digest if any or None if none.
|
||||
Caches the result in the caching system.
|
||||
"""
|
||||
def load_blob():
|
||||
repository_ref = self.lookup_repository(namespace_name, repo_name)
|
||||
if repository_ref is None:
|
||||
return None
|
||||
|
||||
blob_found = self.get_repo_blob_by_digest(repository_ref, blob_digest,
|
||||
include_placements=True)
|
||||
if blob_found is None:
|
||||
return None
|
||||
|
||||
return blob_found.asdict()
|
||||
|
||||
blob_cache_key = cache_key.for_repository_blob(namespace_name, repo_name, blob_digest)
|
||||
blob_dict = model_cache.retrieve(blob_cache_key, load_blob)
|
||||
|
||||
try:
|
||||
return Blob.from_dict(blob_dict) if blob_dict is not None else None
|
||||
except FromDictionaryException:
|
||||
# The data was stale in some way. Simply reload.
|
||||
repository_ref = self.lookup_repository(namespace_name, repo_name)
|
||||
if repository_ref is None:
|
||||
return None
|
||||
|
||||
return self.get_repo_blob_by_digest(repository_ref, blob_digest, include_placements=True)
|
||||
|
||||
def get_repo_blob_by_digest(self, repository_ref, blob_digest, include_placements=False):
|
||||
"""
|
||||
Returns the blob in the repository with the given digest, if any or None if none. Note that
|
||||
|
|
Reference in a new issue