Merge pull request #1523 from coreos-inc/verb-tag-cache-fix

Add a uniqueness hash to derived image storage to break caching over …
This commit is contained in:
josephschorr 2016-06-20 16:38:25 -04:00 committed by GitHub
commit 9e6a264f5f
7 changed files with 119 additions and 40 deletions

View file

@ -1,6 +1,7 @@
import logging
import dateutil.parser
import random
import hashlib
import json
from peewee import JOIN_LEFT_OUTER, IntegrityError
from datetime import datetime
@ -11,6 +12,7 @@ from data.database import (Image, Repository, ImageStoragePlacement, Namespace,
ImageStorageLocation, RepositoryPermission, DerivedStorageForImage,
ImageStorageTransformation, db_random_func)
from util.canonicaljson import canonicalize
logger = logging.getLogger(__name__)
@ -486,27 +488,39 @@ def set_secscan_status(image, indexed, version):
.execute()) != 0
def find_or_create_derived_storage(source_image, transformation_name, preferred_location):
existing = find_derived_storage_for_image(source_image, transformation_name)
def _get_uniqueness_hash(varying_metadata):
if not varying_metadata:
return None
return hashlib.sha256(json.dumps(canonicalize(varying_metadata))).hexdigest()
def find_or_create_derived_storage(source_image, transformation_name, preferred_location,
varying_metadata=None):
existing = find_derived_storage_for_image(source_image, transformation_name, varying_metadata)
if existing is not None:
return existing
logger.debug('Creating storage dervied from source image: %s', source_image.id)
uniqueness_hash = _get_uniqueness_hash(varying_metadata)
trans = ImageStorageTransformation.get(name=transformation_name)
new_storage = storage.create_v1_storage(preferred_location)
DerivedStorageForImage.create(source_image=source_image, derivative=new_storage,
transformation=trans)
transformation=trans, uniqueness_hash=uniqueness_hash)
return new_storage
def find_derived_storage_for_image(source_image, transformation_name):
def find_derived_storage_for_image(source_image, transformation_name, varying_metadata=None):
uniqueness_hash = _get_uniqueness_hash(varying_metadata)
try:
found = (ImageStorage
.select(ImageStorage, DerivedStorageForImage)
.join(DerivedStorageForImage)
.join(ImageStorageTransformation)
.where(DerivedStorageForImage.source_image == source_image,
ImageStorageTransformation.name == transformation_name)
ImageStorageTransformation.name == transformation_name,
DerivedStorageForImage.uniqueness_hash == uniqueness_hash)
.get())
found.locations = {placement.location.name for placement in found.imagestorageplacement_set}