Merge pull request #936 from coreos-inc/fiximagesize
Fix handling of aggregate size in V2
This commit is contained in:
commit
352a2b7280
2 changed files with 34 additions and 21 deletions
|
@ -354,31 +354,40 @@ def set_image_size(docker_image_id, namespace_name, repository_name, image_size,
|
||||||
|
|
||||||
image.storage.image_size = image_size
|
image.storage.image_size = image_size
|
||||||
image.storage.uncompressed_size = uncompressed_size
|
image.storage.uncompressed_size = uncompressed_size
|
||||||
|
|
||||||
ancestors = image.ancestors.split('/')[1:-1]
|
|
||||||
if ancestors:
|
|
||||||
try:
|
|
||||||
# TODO(jschorr): Switch to this faster route once we have full ancestor aggregate_size
|
|
||||||
# parent_image = Image.get(Image.id == ancestors[-1])
|
|
||||||
ancestor_size = (ImageStorage
|
|
||||||
.select(fn.Sum(ImageStorage.image_size))
|
|
||||||
.join(Image)
|
|
||||||
.where(Image.id << ancestors)
|
|
||||||
.scalar())
|
|
||||||
|
|
||||||
if ancestor_size is not None:
|
|
||||||
image.aggregate_size = ancestor_size + image_size
|
|
||||||
except Image.DoesNotExist:
|
|
||||||
pass
|
|
||||||
else:
|
|
||||||
image.aggregate_size = image_size
|
|
||||||
|
|
||||||
image.storage.save()
|
image.storage.save()
|
||||||
|
|
||||||
|
image.aggregate_size = calculate_image_aggregate_size(image.ancestors, image.storage,
|
||||||
|
image.parent)
|
||||||
image.save()
|
image.save()
|
||||||
|
|
||||||
return image
|
return image
|
||||||
|
|
||||||
|
|
||||||
|
def calculate_image_aggregate_size(ancestors_str, image_storage, parent_image):
|
||||||
|
ancestors = ancestors_str.split('/')[1:-1]
|
||||||
|
if not ancestors:
|
||||||
|
return image_storage.image_size
|
||||||
|
|
||||||
|
if parent_image is None:
|
||||||
|
raise DataModelException('Could not load parent image')
|
||||||
|
|
||||||
|
ancestor_size = parent_image.aggregate_size
|
||||||
|
if ancestor_size is not None:
|
||||||
|
return ancestor_size + image_storage.image_size
|
||||||
|
|
||||||
|
# Fallback to a slower path if the parent doesn't have an aggregate size saved.
|
||||||
|
# TODO: remove this code if/when we do a full backfill.
|
||||||
|
ancestor_size = (ImageStorage
|
||||||
|
.select(fn.Sum(ImageStorage.image_size))
|
||||||
|
.join(Image)
|
||||||
|
.where(Image.id << ancestors)
|
||||||
|
.scalar())
|
||||||
|
if ancestor_size is None:
|
||||||
|
return None
|
||||||
|
|
||||||
|
return ancestor_size + image_storage.image_size
|
||||||
|
|
||||||
|
|
||||||
def get_image(repo, docker_image_id):
|
def get_image(repo, docker_image_id):
|
||||||
try:
|
try:
|
||||||
return Image.get(Image.docker_image_id == docker_image_id, Image.repository == repo)
|
return Image.get(Image.docker_image_id == docker_image_id, Image.repository == repo)
|
||||||
|
@ -442,9 +451,13 @@ def synthesize_v1_image(repo, image_storage, docker_image_id, created_date_str,
|
||||||
# parse raises different exceptions, so we cannot use a specific kind of handler here.
|
# parse raises different exceptions, so we cannot use a specific kind of handler here.
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
# Get the aggregate size for the image.
|
||||||
|
aggregate_size = calculate_image_aggregate_size(ancestors, image_storage, parent_image)
|
||||||
|
|
||||||
return Image.create(docker_image_id=docker_image_id, ancestors=ancestors, comment=comment,
|
return Image.create(docker_image_id=docker_image_id, ancestors=ancestors, comment=comment,
|
||||||
command=command, v1_json_metadata=v1_json_metadata, created=created,
|
command=command, v1_json_metadata=v1_json_metadata, created=created,
|
||||||
storage=image_storage, repository=repo, parent=parent_image)
|
storage=image_storage, repository=repo, parent=parent_image,
|
||||||
|
aggregate_size=aggregate_size)
|
||||||
|
|
||||||
|
|
||||||
def ensure_image_locations(*names):
|
def ensure_image_locations(*names):
|
||||||
|
|
|
@ -229,7 +229,7 @@ def lookup_repo_storages_by_content_checksum(repo, checksums):
|
||||||
for counter, checksum in enumerate(set(checksums)):
|
for counter, checksum in enumerate(set(checksums)):
|
||||||
query_alias = 'q{0}'.format(counter)
|
query_alias = 'q{0}'.format(counter)
|
||||||
candidate_subq = (ImageStorage
|
candidate_subq = (ImageStorage
|
||||||
.select(ImageStorage.id, ImageStorage.content_checksum)
|
.select(ImageStorage.id, ImageStorage.content_checksum, ImageStorage.image_size)
|
||||||
.join(Image)
|
.join(Image)
|
||||||
.where(Image.repository == repo, ImageStorage.content_checksum == checksum)
|
.where(Image.repository == repo, ImageStorage.content_checksum == checksum)
|
||||||
.limit(1)
|
.limit(1)
|
||||||
|
|
Reference in a new issue