[Openstack-operators] Glance on Ceph Swift API with dynamic large objects

Michael Dorman mdorman at godaddy.com
Wed Oct 29 18:06:58 UTC 2014

I've got Glance running on a Ceph Swift backend store (NOT the OpenStack implementation of Swift.)  I'm noticing a problem around large images and the checksums/ETags on the manifest object.  I'm seeing a 422 Unprocessable Entity response from Swift on those PUTs.

(* Background on large objects in Swift below.)

I figured out this is due to a manifest object ETag verification implementation difference between Ceph Swift and OS Swift.

OS Swift verifies it just like any other object, md5'ing the content of the object - https://github.com/openstack/swift/blob/master/swift/obj/server.py#L439-L459

Ceph Swift actually does the full DLO checksum across all the component objects - https://github.com/ceph/ceph/blob/master/src/rgw/rgw_op.cc#L1765-L1781

The problem comes into play in the Glance Swift store driver.  It assumes the OS Swift behavior, and sends an ETag of md5("") in the PUT request - https://github.com/openstack/glance_store/blob/master/glance_store/_drivers/swift/store.py#L552

TBH, I don't understand why the Swift store driver is even sending an ETag there.  It would function just as well without sending an ETag at all.

Wondering if anyone else had bumped up against this?  I did a basic search over the Glance bugs and I did't see anything around this, so I opened https://bugs.launchpad.net/glance/+bug/1387311.  I'm surprised this hasn't surfaced before.


* See [1]<http://docs.openstack.org/developer/swift/overview_large_objects.html> and [2]<http://docs.openstack.org/api/openstack-object-storage/1.0/content/dynamic-large-object-creation.html>.  But basically you chunk up the object, upload those separately, and then PUT a special manifest object which ties it all together.  The Etag/checksum on the manifest object is the "MD5 sum of the concatenated string of ETags for each of the segments in the manifest".

When the client provides an ETag header in the PUT request, the Swift API checks that against what it determines the checksum for the object to be.  If there is a mismatch, the response is a 422 Unprocessable Entity.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.openstack.org/pipermail/openstack-operators/attachments/20141029/5dc86ff5/attachment.html>

More information about the OpenStack-operators mailing list