[openstack-dev] Glance WSGI File Read Bug (Grizzly)
Miller, Mark M (EB SW Cloud - R&D - Corvallis)
mark.m.miller at hp.com
Tue Dec 17 21:23:34 UTC 2013
I was able to pin down the image upload problem today:
The Store.add file input read loop using chunkreadable throws an error on the very last read. Apparently the mod_wsgi.Input behaves differently than its eventlet counterpart in that it throws an error if the requested data length is greater than what is avalible. When I replaced the chunkreadable for loop with a while loop that modified the size of the last data read request, it works. Does anyone know if this is a code bug or rather a WSGI configuration setting that I missed?
Regards,
Mark
-------
I made the following chages to file /usr/lib/python2.7/dist-packages/glance/store/filesystem.py:
def add(self, image_id, image_file, image_size):
"""
Stores an image file with supplied identifier to the backend
storage system and returns a tuple containing information
about the stored image.
:param image_id: The opaque image identifier
:param image_file: The image data to write, as a file-like object
:param image_size: The size of the image data to write, in bytes
:retval tuple of URL in backing store, bytes written, and checksum
:raises `glance.common.exception.Duplicate` if the image already
existed
:note By default, the backend writes the image data to a file
`/<DATADIR>/<ID>`, where <DATADIR> is the value of
the filesystem_store_datadir configuration option and <ID>
is the supplied image ID.
"""
filepath = os.path.join(self.datadir, str(image_id))
if os.path.exists(filepath):
raise exception.Duplicate(_("Image file %s already exists!")
% filepath)
checksum = hashlib.md5()
bytes_written = 0
bytes_to_read = ChunkedFile.CHUNKSIZE
try:
with open(filepath, 'wb') as f:
while bytes_written < image_size:
if (image_size - bytes_written) < ChunkedFile.CHUNKSIZE:
bytes_to_read = image_size - bytes_written
buf = image_file.read(bytes_to_read)
bytes_written += len(buf)
checksum.update(buf)
f.write(buf)
"""
for buf in utils.chunkreadable(image_file,
ChunkedFile.CHUNKSIZE):
bytes_written += len(buf)
checksum.update(buf)
f.write(buf)
"""
except IOError as e:
if e.errno != errno.EACCES:
self._delete_partial(filepath, image_id)
exceptions = {errno.EFBIG: exception.StorageFull(),
errno.ENOSPC: exception.StorageFull(),
errno.EACCES: exception.StorageWriteDenied()}
raise exceptions.get(e.errno, e)
From: Miller, Mark M (EB SW Cloud - R&D - Corvallis)
Sent: Tuesday, December 17, 2013 12:32 AM
To: OpenStack Development Mailing List (not for usage questions)
Subject: [openstack-dev] Glance mod_wsgi.input Question
Hello,
I am trying to get the Grizzly Glance service working with Apache2 through the WSGI interface. I am having problems with the "_upload" method of file "glance/api/v1/images.py" It appears that the req.body_file pointer is invalid as I get the following error: (9, 'Bad file descriptor').
I have tried adding inline test code attempting to read the image_data object but have been unsuccessful. The req.content_length = None. Has anyone come across this issue? Below are a few variable values as well as the req.environ:
scheme = file
image size = 8
image data = <mod_wsgi.Input object at 0x7f5fb08931f0>
-------------
key=HTTP_X_TENANT_NAME, value=u'AdminProject'
key=routes.route, value=<routes.route.Route object at 0x7f5fb181fc90>
key=webob.is_body_readable, value=True
key=mod_wsgi.listener_port, value='9292'
key=HTTP_X_PROJECT_NAME, value=u'AdminProject'
key=SERVER_SOFTWARE, value='Apache'
key=content-length, value=8
key=SCRIPT_NAME, value='/v1/v1'
key=HTTP_TRANSFER_ENCODING, value='chunked'
key=mod_wsgi.handler_script, value=''
key=SERVER_SIGNATURE, value='<address>Apache Server at 10.1.184.1 Port 9292</address>\n'
key=REQUEST_METHOD, value='POST'
key=PATH_INFO, value='/images'
key=SERVER_PROTOCOL, value='HTTP/1.1'
key=QUERY_STRING, value=''
key=Content_Length, value=8
key=HTTP_X_USER_ID, value=u'0dd0361fe85a43deb456dd47ed55c2e2'
key=HTTP_X_IMAGE_META_MIN_RAM, value='0'
key=HTTP_X_AUTH_TOKEN, value='de169f1045f8d306a750d28e8e33172e'
key=HTTP_USER_AGENT, value='python-glanceclient'
key=HTTP_X_DOMAIN_NAME, value=None
key=SERVER_NAME, value='10.1.184.1'
key=REMOTE_ADDR, value='10.1.184.1'
key=HTTP_X_ROLE, value=u'admin'
key=mod_wsgi.request_handler, value='wsgi-script'
key=HTTP_X_IDENTITY_STATUS, value='Confirmed'
key=wsgi.url_scheme, value='https'
key=SERVER_ADMIN, value='[no address given]'
key=CONTENT_LENGTH, value=8
key=HTTP_X_DOMAIN_ID, value=None
key=PATH_TRANSLATED, value='/etc/apache2/wsgi/glance/glance-api.py/v1/images'
key=SERVER_PORT, value='9292'
key=HTTP_X_PROJECT_DOMAIN_ID, value=None
key=wsgiorg.routing_args, value=(<routes.util.URLGenerator object at 0x7f5fb1765a90>, {'action': u'create', 'controller': <glance.common.wsgi.Resource object at 0x7f5fb181fc10>})
key=HTTP_X_USER_DOMAIN_ID, value=None
key=wsgi.multiprocess, value=True
key=mod_wsgi.input_chunked, value='1'
key=SERVER_ADDR, value='10.1.184.1'
key=DOCUMENT_ROOT, value='/etc/apache2/htdocs'
key=HTTP_X_IMAGE_META_SIZE, value='8'
key=mod_wsgi.process_group, value='glance-api'
key=HTTP_X_PROJECT_DOMAIN_NAME, value=None
key=HTTP_X_SERVICE_CATALOG, value='[{"endpoints_links": [], "endpoints": [{"adminURL": "https://192.168.124.81:8774/v2/eba7179c427f4c8bb177e4b37e6b4fcf", "region": "Region1", "publicURL": "https://10.1.184.2:8774/v2/eba7179c427f4c8bb177e4b37e6b4fcf", "internalURL": "https://192.168.124.81:8774/v2/eba7179c427f4c8bb177e4b37e6b4fcf", "id": "7d60c1b83ee9434cac1a799ff912bd71"}], "type": "compute", "name": "nova"}, {"endpoints_links": [], "endpoints": [{"adminURL": "https://192.168.124.82:9696/", "region": "Region1", "publicURL": "https://10.1.184.1:9696/", "internalURL": "https://192.168.124.82:9696/", "id": "23e53efd167c49c683a4d97900f781e6"}, {"adminURL": "https://192.168.124.82:9696/", "region": "domain", "publicURL": "https://10.1.184.1:9696/", "internalURL": "https://192.168.124.82:9696/", "id": "82bbe0e5b6954ea1a599582188c0197d"}], "type": "network", "name": "quantum"}, {"endpoints_links": [], "endpoints": [{"adminURL": "http://192.168.124.82:21062/", "region": "domain", "publicURL": "http://10.1.184.1:21061/1", "internalURL": "http://192.168.124.82:21061/1", "id": "c302d392551649c187a0f58d2cc6b3f4"}], "type": "repository", "name": "focus"}, {"endpoints_links": [], "endpoints": [{"adminURL": "https://192.168.124.82:9292", "region": "Region1", "publicURL": "https://10.1.184.1:9292", "internalURL": "https://192.168.124.82:9292", "id": "33a17baeb73644af8f45ebe631ab9788"}, {"adminURL": "https://192.168.124.82:9292", "region": "domain", "publicURL": "https://10.1.184.1:9292", "internalURL": "https://192.168.124.82:9292", "id": "4b0827ac48824f60b508fdb1edb3a401"}], "type": "image", "name": "glance"}, {"endpoints_links": [], "endpoints": [{"adminURL": "https://192.168.124.82:8776/v1/eba7179c427f4c8bb177e4b37e6b4fcf", "region": "Region1", "publicURL": "https://10.1.184.1:8776/v1/eba7179c427f4c8bb177e4b37e6b4fcf", "internalURL": "https://192.168.124.82:8776/v1/eba7179c427f4c8bb177e4b37e6b4fcf", "id": "f4ab866d10ef4bc297dbe1c7c747557c"}, {"adminURL": "https://192.168.124.82:8776/v1/eba7179c427f4c8bb177e4b37e6b4fcf", "region": "domain", "publicURL": "https://10.1.184.1:8776/v1/eba7179c427f4c8bb177e4b37e6b4fcf", "internalURL": "https://192.168.124.82:8776/v1/eba7179c427f4c8bb177e4b37e6b4fcf", "id": "e813d4f2ab8d49119146ba313645a37e"}], "type": "volume", "name": "cinder"}, {"endpoints_links": [], "endpoints": [{"adminURL": "https://192.168.124.81:8773/services/Admin", "region": "Region1", "publicURL": "https://10.1.184.2:8773/services/Cloud", "internalURL": "https://192.168.124.81:8773/services/Clouds", "id": "c77f6aacaaa64c68af48cc9b073ea81f"}], "type": "ec2", "name": "ec2"}, {"endpoints_links": [], "endpoints": [{"adminURL": "http://192.168.124.82:21051/1", "region": "domain", "publicURL": "http://10.1.184.1:21051/1", "internalURL": "http://192.168.124.82:21051/1", "id": "d01820a022e44b0c9f8011a608d852dc"}], "type": "provisioner", "name": "eve"}, {"endpoints_links": [], "endpoints": [{"adminURL": "https://192.168.124.82:35357/v2.0", "region": "Region1", "publicURL": "https://10.1.184.1:5000/v2.0", "internalURL": "https://192.168.124.82:5000/v2.0", "id": "b9adc8ffaf224fc6b078273caa11376c"}, {"adminURL": "https://192.168.124.82:35357/v2.0", "region": "domain", "publicURL": "https://10.1.184.1:5000/v2.0", "internalURL": "https://192.168.124.82:5000/v2.0", "id": "41a4936c4d974f15b039fc53d8d5d0ae"}], "type": "identity", "name": "keystone"}, {"endpoints_links": [], "endpoints": [{"adminURL": "http://192.168.124.82:21072/", "region": "domain", "publicURL": "http://10.1.184.1:21071/1", "internalURL": "http://192.168.124.82:21071/1", "id": "1e18cbf52b0845ecb914877e30637ee6"}], "type": "registry", "name": "graffiti"}]'
key=HTTP_X_TENANT, value=u'AdminProject'
key=HTTP_X_USER, value=u'Admin'
key=SCRIPT_FILENAME, value='/etc/apache2/wsgi/glance/glance-api.py'
key=HTTP_X_IMAGE_META_PROTECTED, value='False'
key=HTTP_X_IMAGE_META_DISK_FORMAT, value='qcow2'
key=HTTP_X_IMAGE_META_IS_PUBLIC, value='True'
key=wsgi.input, value=<mod_wsgi.Input object at 0x7f5fb08931f0>
key=keystone.token_info, value={u'access': {u'token': {u'issued_at': u'2013-12-17T12:14:36.329480', u'expires': u'2013-12-18T12:11:28Z', u'id': u'de169f1045f8d306a750d28e8e33172e', u'tenant': {u'enabled': True, u'id': u'eba7179c427f4c8bb177e4b37e6b4fcf', u'name': u'AdminProject', u'description': u''}}, u'serviceCatalog': [{u'endpoints_links': [], u'endpoints': [{u'adminURL': u'https://192.168.124.81:8774/v2/eba7179c427f4c8bb177e4b37e6b4fcf', u'region': u'Region1', u'publicURL': u'https://10.1.184.2:8774/v2/eba7179c427f4c8bb177e4b37e6b4fcf', u'internalURL': u'https://192.168.124.81:8774/v2/eba7179c427f4c8bb177e4b37e6b4fcf', u'id': u'7d60c1b83ee9434cac1a799ff912bd71'}], u'type': u'compute', u'name': u'nova'}, {u'endpoints_links': [], u'endpoints': [{u'adminURL': u'https://192.168.124.82:9696/', u'region': u'Region1', u'publicURL': u'https://10.1.184.1:9696/', u'internalURL': u'https://192.168.124.82:9696/', u'id': u'23e53efd167c49c683a4d97900f781e6'}, {u'adminURL': u'https://192.168.124.82:9696/', u'region': u'domain', u'publicURL': u'https://10.1.184.1:9696/', u'internalURL': u'https://192.168.124.82:9696/', u'id': u'82bbe0e5b6954ea1a599582188c0197d'}], u'type': u'network', u'name': u'quantum'}, {u'endpoints_links': [], u'endpoints': [{u'adminURL': u'http://192.168.124.82:21062/', u'region': u'domain', u'publicURL': u'http://10.1.184.1:21061/1', u'internalURL': u'http://192.168.124.82:21061/1', u'id': u'c302d392551649c187a0f58d2cc6b3f4'}], u'type': u'repository', u'name': u'focus'}, {u'endpoints_links': [], u'endpoints': [{u'adminURL': u'https://192.168.124.82:9292', u'region': u'Region1', u'publicURL': u'https://10.1.184.1:9292', u'internalURL': u'https://192.168.124.82:9292', u'id': u'33a17baeb73644af8f45ebe631ab9788'}, {u'adminURL': u'https://192.168.124.82:9292', u'region': u'domain', u'publicURL': u'https://10.1.184.1:9292', u'internalURL': u'https://192.168.124.82:9292', u'id': u'4b0827ac48824f60b508fdb1edb3a401'}], u'type': u'image', u'name': u'glance'}, {u'endpoints_links': [], u'endpoints': [{u'adminURL': u'https://192.168.124.82:8776/v1/eba7179c427f4c8bb177e4b37e6b4fcf', u'region': u'Region1', u'publicURL': u'https://10.1.184.1:8776/v1/eba7179c427f4c8bb177e4b37e6b4fcf', u'internalURL': u'https://192.168.124.82:8776/v1/eba7179c427f4c8bb177e4b37e6b4fcf', u'id': u'f4ab866d10ef4bc297dbe1c7c747557c'}, {u'adminURL': u'https://192.168.124.82:8776/v1/eba7179c427f4c8bb177e4b37e6b4fcf', u'region': u'domain', u'publicURL': u'https://10.1.184.1:8776/v1/eba7179c427f4c8bb177e4b37e6b4fcf', u'internalURL': u'https://192.168.124.82:8776/v1/eba7179c427f4c8bb177e4b37e6b4fcf', u'id': u'e813d4f2ab8d49119146ba313645a37e'}], u'type': u'volume', u'name': u'cinder'}, {u'endpoints_links': [], u'endpoints': [{u'adminURL': u'https://192.168.124.81:8773/services/Admin', u'region': u'Region1', u'publicURL': u'https://10.1.184.2:8773/services/Cloud', u'internalURL': u'https://192.168.124.81:8773/services/Clouds', u'id': u'c77f6aacaaa64c68af48cc9b073ea81f'}], u'type': u'ec2', u'name': u'ec2'}, {u'endpoints_links': [], u'endpoints': [{u'adminURL': u'http://192.168.124.82:21051/1', u'region': u'domain', u'publicURL': u'http://10.1.184.1:21051/1', u'internalURL': u'http://192.168.124.82:21051/1', u'id': u'd01820a022e44b0c9f8011a608d852dc'}], u'type': u'provisioner', u'name': u'eve'}, {u'endpoints_links': [], u'endpoints': [{u'adminURL': u'https://192.168.124.82:35357/v2.0', u'region': u'Region1', u'publicURL': u'https://10.1.184.1:5000/v2.0', u'internalURL': u'https://192.168.124.82:5000/v2.0', u'id': u'b9adc8ffaf224fc6b078273caa11376c'}, {u'adminURL': u'https://192.168.124.82:35357/v2.0', u'region': u'domain', u'publicURL': u'https://10.1.184.1:5000/v2.0', u'internalURL': u'https://192.168.124.82:5000/v2.0', u'id': u'41a4936c4d974f15b039fc53d8d5d0ae'}], u'type': u'identity', u'name': u'keystone'}, {u'endpoints_links': [], u'endpoints': [{u'adminURL': u'http://192.168.124.82:21072/', u'region': u'domain', u'publicURL': u'http://10.1.184.1:21071/1', u'internalURL': u'http://192.168.124.82:21071/1', u'id': u'1e18cbf52b0845ecb914877e30637ee6'}], u'type': u'registry', u'name': u'graffiti'}], u'user': {u'username': u'Admin', u'roles_links': [], u'id': u'0dd0361fe85a43deb456dd47ed55c2e2', u'roles': [{u'id': u'fbd220a4f1f842cfa7ef5cd48bb78e2d', u'name': u'admin'}], u'name': u'Admin'}, u'metadata': {u'is_admin': 0, u'roles': [u'fbd220a4f1f842cfa7ef5cd48bb78e2d']}}}
key=HTTP_HOST, value='10.1.184.1:9292'
key=HTTP_X_ROLES, value=u'admin'
key=HTTPS, value='1'
key=wsgi.multithread, value=True
key=mod_wsgi.callable_object, value='application'
key=routes.url, value=<routes.util.URLGenerator object at 0x7f5fb1765a90>
key=HTTP_X_IMAGE_META_MIN_DISK, value='0'
key=REQUEST_URI, value='/v1/images'
key=HTTP_X_TENANT_ID, value=u'eba7179c427f4c8bb177e4b37e6b4fcf'
key=webob.adhoc_attrs, value={'response': <Response at 0x7f5fb1765cd0 200 OK>, 'context': <glance.context.RequestContext object at 0x7f5fb17658d0>}
key=wsgi.file_wrapper, value=<built-in method file_wrapper of mod_wsgi.Adapter object at 0x7f5fb1607378>
key=wsgi.version, value=(1, 1)
key=api.version, value=1
key=GATEWAY_INTERFACE, value='CGI/1.1'
key=wsgi.run_once, value=False
key=HTTPCONTENT_LENGTH, value=8
key=wsgi.errors, value=<mod_wsgi.Log object at 0x7f5fb087f6b0>
key=REMOTE_PORT, value='14055'
key=mod_wsgi.listener_host, value=''
key=mod_wsgi.version, value=(3, 3)
key=HTTP_X_IMAGE_META_CONTAINER_FORMAT, value='bare'
key=HTTP_X_PROJECT_ID, value=u'eba7179c427f4c8bb177e4b37e6b4fcf'
key=HTTP_X_USER_DOMAIN_NAME, value=None
key=HTTP_X_USER_NAME, value=u'Admin'
key=CONTENT_TYPE, value='application/octet-stream'
key=mod_wsgi.application_group, value='d00-50-56-8e-75-82.cloudos.org:9292|'
key=mod_wsgi.script_reloading, value='1'
key=HTTP_X_IMAGE_META_NAME, value='CirrosTiny'
key=HTTP_ACCEPT_ENCODING, value='identity'
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.openstack.org/pipermail/openstack-dev/attachments/20131217/64bb14ef/attachment.html>
More information about the OpenStack-dev
mailing list