Fixes for the uncompressed size backfill script.

This commit is contained in:
Jake Moshenko 2014-09-23 16:06:38 -04:00
parent ec484e3efc
commit 98d8e0fe37
2 changed files with 55 additions and 15 deletions

View file

@ -83,6 +83,10 @@ class InvalidBuildTriggerException(DataModelException):
pass pass
class InvalidImageException(DataModelException):
pass
class TooManyUsersException(DataModelException): class TooManyUsersException(DataModelException):
pass pass
@ -1180,6 +1184,23 @@ def find_create_or_link_image(docker_image_id, repository, username, translation
return new_image return new_image
def get_storage_by_uuid(storage_uuid):
placements = list(ImageStoragePlacement
.select(ImageStoragePlacement, ImageStorage, ImageStorageLocation)
.join(ImageStorageLocation)
.switch(ImageStoragePlacement)
.join(ImageStorage)
.where(ImageStorage.uuid == storage_uuid))
if not placements:
raise InvalidImageException('No storage found with uuid: %s', storage_uuid)
found = placements[0].storage
found.locations = {placement.location.name for placement in placements}
return found
def set_image_size(docker_image_id, namespace_name, repository_name, def set_image_size(docker_image_id, namespace_name, repository_name,
image_size): image_size):
try: try:

View file

@ -1,27 +1,46 @@
from data import model from data import model
from data.database import ImageStorage from data.database import ImageStorage
from app import app, storage as store from app import app, storage as store
from data.database import db
import logging import logging
logger = logging.getLogger(__name__)
def backfill_sizes(): def backfill_sizes():
count = ImageStorage.select().where(ImageStorage.uncompressed_size == None).count() query = (ImageStorage
counter = 0 .select()
for image_storage in ImageStorage.select().where(ImageStorage.uncompressed_size == None): .where(ImageStorage.uncompressed_size == None, ImageStorage.uploading == False)
logging.debug("Backfilling uncompressed size: %s of %s" % (counter, count)) .limit(100))
total = 0
missing = 0
batch_processed = 1
while batch_processed > 0:
batch_processed = 0
with app.config['DB_TRANSACTION_FACTORY'](db):
for image_storage in query.clone():
total += 1
batch_processed += 1
if (total - 1) % 100 == 0:
logger.debug('Storing entry: %s', total)
# Lookup the JSON for the image. # Lookup the JSON for the image.
uuid = image_storage.uuid uuid = image_storage.uuid
with_locations = model.get_storage_by_uuid(uuid) with_locations = model.get_storage_by_uuid(uuid)
json_data = store.get_content(with_locations.locations, store.image_json_path(uuid)) json_data = store.get_content(with_locations.locations, store.image_json_path(uuid))
size = json_data.get('Size', None) size = json_data.get('Size', json_data.get('size', -1))
if size is None:
continue if size == -1:
missing += 1
logger.debug('Missing entry %s (%s/%s)', uuid, missing, total)
image_storage.uncompressed_size = size image_storage.uncompressed_size = size
image_storage.save() image_storage.save()
counter += 1
if __name__ == "__main__": if __name__ == "__main__":