From 0d97c0738e280c68f88b862dbcf938c279e00266 Mon Sep 17 00:00:00 2001 From: "James E. Blair" Date: Wed, 12 May 2021 20:56:53 +0000 Subject: [PATCH] Add content-length headers and debug messages According to the docs, these content-length headers should be present, so include them. We should also return a 202 on the PUT rather than a 204. None of that seems to matter, but as long as that's the case, why not match the spec? Also, adjust some log lines to match others and add a few more useful lines. Change-Id: Ib06d282891984918f369a562d075ad2b8c7349e2 --- zuul_registry/main.py | 18 ++++++++++++------ zuul_registry/storage.py | 16 ++++++++++------ 2 files changed, 22 insertions(+), 12 deletions(-) diff --git a/zuul_registry/main.py b/zuul_registry/main.py index af71043..13f6261 100644 --- a/zuul_registry/main.py +++ b/zuul_registry/main.py @@ -199,10 +199,13 @@ class RegistryAPI: @cherrypy.expose def head_blob(self, repository, digest): namespace, repository = self.get_namespace(repository) - self.log.info('Head blob %s %s %s', namespace, repository, digest) size = self.storage.blob_size(namespace, digest) if size is None: + self.log.info('Head blob %s %s %s not found', + namespace, repository, digest) return self.not_found() + self.log.info('Head blob %s %s %s size %s', + namespace, repository, digest, size) res = cherrypy.response res.headers['Docker-Content-Digest'] = digest res.headers['Content-Length'] = str(size) @@ -248,6 +251,7 @@ class RegistryAPI: orig_repository, uuid) res.headers['Docker-Upload-UUID'] = uuid res.headers['Range'] = '0-0' + res.headers['Content-Length'] = '0' res.status = '202 Accepted' @cherrypy.expose @@ -263,8 +267,9 @@ class RegistryAPI: res.headers['Location'] = '/v2/%s/blobs/uploads/%s' % ( orig_repository, uuid) res.headers['Docker-Upload-UUID'] = uuid + res.headers['Content-Length'] = '0' res.headers['Range'] = '0-%s' % (new_length,) - res.status = '204 No Content' + res.status = '202 Accepted' self.log.info( '[u: %s] Finish Upload chunk %s %s', uuid, repository, new_length) @@ -273,19 +278,20 @@ class RegistryAPI: def finish_upload(self, repository, uuid, digest): orig_repository = repository namespace, repository = self.get_namespace(repository) - self.log.info('[u: %s] Upload final chunk %s %s', - uuid, namespace, repository) + self.log.info('[u: %s] Upload final chunk %s %s digest %s', + uuid, namespace, repository, digest) old_length, new_length = self.storage.upload_chunk( namespace, uuid, cherrypy.request.body) self.log.debug('[u: %s] Store upload %s %s', uuid, namespace, repository) self.storage.store_upload(namespace, uuid, digest) - self.log.info('[u: %s] Upload complete %s %s', - uuid, namespace, repository) + self.log.info('[u: %s] Upload complete %s %s digest %s', + uuid, namespace, repository, digest) res = cherrypy.response res.headers['Location'] = '/v2/%s/blobs/%s' % (orig_repository, digest) res.headers['Docker-Content-Digest'] = digest res.headers['Content-Range'] = '%s-%s' % (old_length, new_length) + res.headers['Content-Length'] = '0' res.status = '201 Created' @cherrypy.expose diff --git a/zuul_registry/storage.py b/zuul_registry/storage.py index 44ef28d..ba21f5f 100644 --- a/zuul_registry/storage.py +++ b/zuul_registry/storage.py @@ -250,8 +250,8 @@ class Storage: # The lock is in force, another simultaneous upload # must be handling this; assume it will succeed and go # ahead and clean up this upload. - self.log.warning("Failed to obtain lock(1) on digest %s " - "for upload %s", digest, uuid) + self.log.warning("[u: %s] Failed to obtain lock(1) on " + "digest %s", uuid, digest) return False # Lock the blob @@ -266,13 +266,17 @@ class Storage: # We lost a race for the lock, another simultaneous upload # must be handling this; assume it will succeed and go # ahead and clean up this upload. - self.log.warning("Failed to obtain lock(2) on digest %s " - "for upload %s", digest, uuid) + self.log.warning("[u: %s] Failed to obtain lock(2) on digest %s", + uuid, digest) return False if waslocked: - self.log.warning("Breaking lock on digest %s " - "for upload %s", digest, uuid) + self.log.warning("[u: %s] Breaking lock on digest %s", + uuid, digest) + else: + self.log.debug("[u: %s] Locked digest %s", + uuid, digest) + return True def store_upload(self, namespace, uuid, digest):