diff --git a/data/model/blob.py b/data/model/blob.py index e97539b66..5820ba3b1 100644 --- a/data/model/blob.py +++ b/data/model/blob.py @@ -27,7 +27,7 @@ def get_repo_blob_by_digest(namespace, repo_name, blob_digest): return found -def store_blob_record_and_temp_link(namespace, repo_name, blob_digest, location_obj, +def store_blob_record_and_temp_link(namespace, repo_name, blob_digest, location_obj, byte_count, link_expiration_s): """ Store a record of the blob and temporarily link it to the specified repository. """ @@ -36,9 +36,12 @@ def store_blob_record_and_temp_link(namespace, repo_name, blob_digest, location_ repo = _basequery.get_existing_repository(namespace, repo_name) try: storage = ImageStorage.get(checksum=blob_digest) + storage.image_size = byte_count + storage.save() + ImageStoragePlacement.get(storage=storage, location=location_obj) except ImageStorage.DoesNotExist: - storage = ImageStorage.create(checksum=blob_digest, uploading=False) + storage = ImageStorage.create(checksum=blob_digest, uploading=False, image_size=byte_count) ImageStoragePlacement.create(storage=storage, location=location_obj) except ImageStoragePlacement.DoesNotExist: ImageStoragePlacement.create(storage=storage, location=location_obj) diff --git a/endpoints/v2/blob.py b/endpoints/v2/blob.py index 013627d81..8e6ac3bb0 100644 --- a/endpoints/v2/blob.py +++ b/endpoints/v2/blob.py @@ -214,15 +214,19 @@ def _upload_chunk(namespace, repo_name, upload_uuid): def _finish_upload(namespace, repo_name, upload_obj, expected_digest): + # Verify that the digest's SHA matches that of the uploaded data. computed_digest = digest_tools.sha256_digest_from_hashlib(upload_obj.sha_state) if not digest_tools.digests_equal(computed_digest, expected_digest): raise BlobUploadInvalid() + # Mark the blob as uploaded. final_blob_location = digest_tools.content_path(expected_digest) storage.complete_chunked_upload({upload_obj.location.name}, upload_obj.uuid, final_blob_location) model.blob.store_blob_record_and_temp_link(namespace, repo_name, expected_digest, - upload_obj.location, + upload_obj.location, upload_obj.byte_count, app.config['PUSH_TEMP_TAG_EXPIRATION_SEC']) + + # Delete the upload tracking row. upload_obj.delete_instance() response = make_response('', 201)