Move the creation of images to when the JSON is uploaded.
This commit is contained in:
parent
3cae6609a7
commit
59b794dd61
3 changed files with 12 additions and 33 deletions
|
@ -1628,8 +1628,6 @@ def garbage_collect_repository(namespace_name, repository_name):
|
||||||
logger.info('Garbage collecting storage for images: %s', to_remove)
|
logger.info('Garbage collecting storage for images: %s', to_remove)
|
||||||
_garbage_collect_storage(storage_id_whitelist)
|
_garbage_collect_storage(storage_id_whitelist)
|
||||||
|
|
||||||
return len(to_remove)
|
|
||||||
|
|
||||||
|
|
||||||
def _garbage_collect_storage(storage_id_whitelist):
|
def _garbage_collect_storage(storage_id_whitelist):
|
||||||
if len(storage_id_whitelist) == 0:
|
if len(storage_id_whitelist) == 0:
|
||||||
|
|
|
@ -222,32 +222,6 @@ def create_repository(namespace, repository):
|
||||||
repo = model.create_repository(namespace, repository,
|
repo = model.create_repository(namespace, repository,
|
||||||
get_authenticated_user())
|
get_authenticated_user())
|
||||||
|
|
||||||
logger.debug('Determining already added images')
|
|
||||||
added_images = OrderedDict([(desc['id'], desc) for desc in image_descriptions])
|
|
||||||
new_repo_images = dict(added_images)
|
|
||||||
|
|
||||||
# Optimization: Lookup any existing images in the repository with matching docker IDs and
|
|
||||||
# remove them from the added dict, so we don't need to look them up one-by-one.
|
|
||||||
def chunks(l, n):
|
|
||||||
for i in xrange(0, len(l), n):
|
|
||||||
yield l[i:i+n]
|
|
||||||
|
|
||||||
# Note: We do this in chunks in an effort to not hit the SQL query size limit.
|
|
||||||
for chunk in chunks(new_repo_images.keys(), 50):
|
|
||||||
existing_images = model.lookup_repository_images(namespace, repository, chunk)
|
|
||||||
for existing in existing_images:
|
|
||||||
added_images.pop(existing.docker_image_id)
|
|
||||||
|
|
||||||
logger.debug('Creating/Linking necessary images')
|
|
||||||
username = get_authenticated_user() and get_authenticated_user().username
|
|
||||||
translations = {}
|
|
||||||
for image_description in added_images.values():
|
|
||||||
model.find_create_or_link_image(image_description['id'], repo, username,
|
|
||||||
translations, storage.preferred_locations[0])
|
|
||||||
|
|
||||||
|
|
||||||
logger.debug('Created images')
|
|
||||||
track_and_log('push_repo', repo)
|
|
||||||
return make_response('Created', 201)
|
return make_response('Created', 201)
|
||||||
|
|
||||||
|
|
||||||
|
@ -280,7 +254,7 @@ def update_images(namespace, repository):
|
||||||
event.publish_event_data('docker-cli', user_data)
|
event.publish_event_data('docker-cli', user_data)
|
||||||
|
|
||||||
logger.debug('GCing repository')
|
logger.debug('GCing repository')
|
||||||
num_removed = model.garbage_collect_repository(namespace, repository)
|
model.garbage_collect_repository(namespace, repository)
|
||||||
|
|
||||||
# Generate a job for each notification that has been added to this repo
|
# Generate a job for each notification that has been added to this repo
|
||||||
logger.debug('Adding notifications for repository')
|
logger.debug('Adding notifications for repository')
|
||||||
|
@ -288,8 +262,8 @@ def update_images(namespace, repository):
|
||||||
updated_tags = session.get('pushed_tags', {})
|
updated_tags = session.get('pushed_tags', {})
|
||||||
event_data = {
|
event_data = {
|
||||||
'updated_tags': updated_tags,
|
'updated_tags': updated_tags,
|
||||||
'pruned_image_count': num_removed
|
|
||||||
}
|
}
|
||||||
|
track_and_log('push_repo', repo)
|
||||||
spawn_notification(repo, 'repo_push', event_data)
|
spawn_notification(repo, 'repo_push', event_data)
|
||||||
return make_response('Updated', 204)
|
return make_response('Updated', 204)
|
||||||
|
|
||||||
|
|
|
@ -9,6 +9,7 @@ from time import time
|
||||||
|
|
||||||
from app import storage as store, image_diff_queue, app
|
from app import storage as store, image_diff_queue, app
|
||||||
from auth.auth import process_auth, extract_namespace_repo_from_session
|
from auth.auth import process_auth, extract_namespace_repo_from_session
|
||||||
|
from auth.auth_context import get_authenticated_user
|
||||||
from util import checksums, changes
|
from util import checksums, changes
|
||||||
from util.http import abort, exact_abort
|
from util.http import abort, exact_abort
|
||||||
from auth.permissions import (ReadRepositoryPermission,
|
from auth.permissions import (ReadRepositoryPermission,
|
||||||
|
@ -456,9 +457,15 @@ def put_image_json(namespace, repository, image_id):
|
||||||
logger.debug('Looking up repo image')
|
logger.debug('Looking up repo image')
|
||||||
repo_image = model.get_repo_image_extended(namespace, repository, image_id)
|
repo_image = model.get_repo_image_extended(namespace, repository, image_id)
|
||||||
if not repo_image:
|
if not repo_image:
|
||||||
logger.debug('Image not found')
|
logger.debug('Image not found, creating image')
|
||||||
abort(404, 'Image %(image_id)s not found', issue='unknown-image',
|
repo = model.get_repository(namespace, repository)
|
||||||
image_id=image_id)
|
if repo is None:
|
||||||
|
abort(404, 'Repository does not exist: %(namespace)s/%(repository)s', issue='no-repo',
|
||||||
|
namespace=namespace, repository=repository)
|
||||||
|
|
||||||
|
username = get_authenticated_user() and get_authenticated_user().username
|
||||||
|
repo_image = model.find_create_or_link_image(image_id, repo, username, {},
|
||||||
|
store.preferred_locations[0])
|
||||||
|
|
||||||
uuid = repo_image.storage.uuid
|
uuid = repo_image.storage.uuid
|
||||||
|
|
||||||
|
|
Reference in a new issue