xenapi: send chunk terminator on subprocess exc

During chunk upload if a subprocess exception is thrown, a malformed
chunk upload occurs.

This patch adds logging for subprocess exceptions and sends the
terminator even in the event of a subprocess exception. The incomplete
file upload will then be cleaned up by the client.

Change-Id: I559f201430bcd4c36d669c7772a10bfe3cd54d41
Closes-Bug: 1365637
This commit is contained in:
Jesse J. Cook 2014-09-04 13:17:37 -05:00
parent deacd9d1cc
commit e039b036b5
2 changed files with 9 additions and 7 deletions

View File

@ -200,14 +200,12 @@ def _upload_tarball(staging_path, image_id, glance_host, glance_port,
compression_level = properties.get('xenapi_image_compression_level') compression_level = properties.get('xenapi_image_compression_level')
try:
utils.create_tarball( utils.create_tarball(
None, staging_path, callback=send_chunked_transfer_encoded, None, staging_path, callback=send_chunked_transfer_encoded,
compression_level=compression_level) compression_level=compression_level)
finally:
try: send_chunked_transfer_encoded('') # Chunked-Transfer terminator
conn.send("0\r\n\r\n") # Chunked-Transfer terminator
except Exception, error:
raise RetryableError(error)
bytes_written = callback_data['bytes_written'] bytes_written = callback_data['bytes_written']
logging.info("Wrote %d bytes to %s" % (bytes_written, url)) logging.info("Wrote %d bytes to %s" % (bytes_written, url))

View File

@ -101,6 +101,10 @@ def finish_subprocess(proc, cmdline, cmd_input=None, ok_exit_codes=None):
ret = proc.returncode ret = proc.returncode
if ret not in ok_exit_codes: if ret not in ok_exit_codes:
LOG.error("Command '%(cmdline)s' with process id '%(pid)s' expected "
"return code in '%(ok)s' but got '%(rc)s': %(err)s" %
{'cmdline': cmdline, 'pid': proc.pid, 'ok': ok_exit_codes,
'rc': ret, 'err': err})
raise SubprocessException(' '.join(cmdline), ret, out, err) raise SubprocessException(' '.join(cmdline), ret, out, err)
return out return out