Hi Florian, Thanks for the help. I did further testing and narrowed it down to objects that have been uploaded when the bucket has versioning enabled. Objects created before that are not affected: all metadata operations are still possible.
Here is a simple way to reproduce this: http://paste.openstack.org/show/736713/ And here is the snippet to easily turn on/off S3 versioning on a given bucket: https://gist.github.com/Miouge1/b8ae19b71411655154e74e609b61f24e Cheers, Maxime On Fri, 30 Nov 2018 at 22:28 Florian Haas <flor...@citynetwork.eu> wrote: > On 28/11/2018 19:06, Maxime Guyot wrote: > > Hi Florian, > > > > You assumed correctly, the "test" container (private) was created with > > the "openstack container create test", then I am using the S3 API to > > enable/disable object versioning on it. > > I use the following Python snippet to enable/disable S3 bucket > versioning: > > > > import boto, boto.s3, boto.s3.connection > > conn = conn = boto.connect_s3(aws_access_key_id='***', > > aws_secret_access_key='***', host='***', port=8080, > > calling_format=boto.s3.connection.OrdinaryCallingFormat()) > > bucket = conn.get_bucket('test') > > bucket.configure_versioning(True) # Or False to disable S3 bucket > versioning > > bucket.get_versioning_status() > > Thanks for making this so easy to reproduce! I must confess upfront that > I've found myself unable to reproduce your problem, but I've retraced > your steps and maybe you'll find this useful to develop a hypothesis as > to what's happening in your case. > > $ openstack object show -f shell foo bar > account="AUTH_5ed51981f4a8468292bf2c578806ebf7" > container="foo" > content_length="12" > content_type="text/plain" > last_modified="Thu, 22 Nov 2018 15:02:57 GMT" > object="bar" > > properties="S3cmd-Attrs='atime:1542629253/ctime:1542629253/gid:1000/gname:florian/md5:6f5902ac237024bdd0c176cb93063dc4/mode:33204/mtime:1542629253/uid:1000/uname:florian'" > > See the properties that are set there? These are obviously not > properties ever set through the Swift API, but instead they were set > when I uploaded this object into the corresponding bucket, using the S3 > API. > > I can double check that property with boto: > > >>> foo = conn.get_bucket('foo') > >>> bar = bucket.get_key('bar') > >>> bar.metadata > {'s3cmd-attrs': > > u'atime:1542629253/ctime:1542629253/gid:1000/gname:florian/md5:6f5902ac237024bdd0c176cb93063dc4/mode:33204/mtime:1542629253/uid:1000/uname:florian'} > > Now I enable versioning: > > >>> foo.configure_versioning(True) > True > >>> foo.get_versioning_status() > {'Versioning': 'Enabled'} > > Check if the metadata is still there: > > >>> bar.metadata > {'s3cmd-attrs': > > u'atime:1542629253/ctime:1542629253/gid:1000/gname:florian/md5:6f5902ac237024bdd0c176cb93063dc4/mode:33204/mtime:1542629253/uid:1000/uname:florian'} > > Refetch object to be sure: > > >>> bar = bucket.get_key('bar') > {'s3cmd-attrs': > > u'atime:1542629253/ctime:1542629253/gid:1000/gname:florian/md5:6f5902ac237024bdd0c176cb93063dc4/mode:33204/mtime:1542629253/uid:1000/uname:florian'} > > Disable versioning again: > > >>> foo.configure_versioning(False) > True > >>> foo.get_versioning_status() > {'Versioning': 'Suspended'} > > Now add a property using the Swift API: > > $ openstack object set --property spam=eggs foo bar > > And read it back: > > $ openstack object show -f shell foo bar > account="AUTH_5ed51981f4a8468292bf2c578806ebf7" > container="foo" > content_length="12" > content_type="text/plain" > last_modified="Wed, 28 Nov 2018 19:52:48 GMT" > object="bar" > properties="Spam='eggs'" > > Notice that not only has the property been set, it has *overwritten* the > S3 properties that were set before. I am not sure if this is meant to be > this way, i.e. if native Swift acts this way too, but it appears to be > how radosgw does it. > > However, now that have the "spam" property set, I go ahead and re-enable > versioning: > > >>> foo.configure_versioning(True) > True > > >>> foo.get_versioning_status() > {'Versioning': 'Enabled'} > > And then I re-query my object: > > $ openstack object show -f shell foo bar > account="AUTH_5ed51981f4a8468292bf2c578806ebf7" > container="foo" > content_length="12" > content_type="text/plain" > last_modified="Thu, 29 Nov 2018 11:47:41 GMT" > object="bar" > properties="Spam='eggs'" > > So as you can see, in my case the "spam" property, when defined with the > Swift API, did get preserved even across enabling versioning. > > I can also use s3cmd to check that the Swift meta header looks like an > x-amz-meta header when querying the same object via S3: > > $ s3cmd info s3://foo/bar > s3://foo/bar (object): > File size: 12 > Last mod: Thu, 29 Nov 2018 11:47:41 GMT > MIME type: text/plain > Storage: STANDARD > MD5 sum: 6f5902ac237024bdd0c176cb93063dc4 > SSE: none > Policy: none > CORS: none > x-amz-meta-spam: eggs > > So could it be that there is *something* you're doing that just > overwrites your metadata? > > >> Semi-related: I've seen some interesting things when mucking around with > >> a single container/bucket while switching APIs, when it comes to > >> container properties and metadata. For example, if you set a public read > >> ACL on an S3 bucket, the the corresponding Swift container is also > >> publicly readable but its read ACL looks empty (i.e. private) when you > >> ask via the Swift API. > > > > This can definitely become a problem if Swift API says "private" but > > data is actually publicly available. > > Since the doc says "S3 and Swift APIs share a common namespace, so you > > may write data with one API and retrieve it with the other", it might be > > useful to document this kind of limitations somewhere. > > I agree, but as an aside I believe that in your particular case you're > highlighting one of the inherent limitations of the dual-API capability. > S3 bucket versioning works, as far as I understand, quite differently > from versioned objects in Swift, so making radosgw behave correctly for > versioning in both APIs — as soon as it's enabled in only one — strikes > me as really, really difficult. Similar to what Yehuda mentioned about > ACL differences. > > Not sure if this helps? > > Cheers, > Florian >
_______________________________________________ ceph-users mailing list ceph-users@lists.ceph.com http://lists.ceph.com/listinfo.cgi/ceph-users-ceph.com