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
This commit is contained in:
James E. Blair 2021-05-12 20:56:53 +00:00
parent 326cdca31e
commit 0d97c0738e
2 changed files with 22 additions and 12 deletions

View File

@ -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

View File

@ -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):