@@ -190,31 +190,40 @@ def GETorHEAD(self, req):
190
190
191
191
return resp
192
192
193
- def versioning_management (self , req ):
193
+ def enforce_versioning (self , req ):
194
+ """
195
+ Enforce the versioning mode of a container just before executing
196
+ an object operation. This is useful when the current object is not
197
+ stored in the "main" container but in a shard, where the versioning
198
+ mode may not have been set yet.
199
+ """
194
200
if not SUPPORT_VERSIONING :
195
201
return None
196
202
197
- container_root = req .headers .get ('X-Object-Sysmeta-Oio-Bucket-Name' )
198
- if container_root is None :
203
+ root_container = req .headers .get ('X-Object-Sysmeta-Oio-Bucket-Name' )
204
+ if root_container is None :
199
205
return None
200
206
207
+ # We can't use _get_info_from_caches as it would use local worker cache
208
+ # first and an update of versioning mode may not be detected.
201
209
memcache = getattr (self .app , 'memcache' , None ) or \
202
210
req .environ .get ('swift.cache' )
203
211
if memcache is None :
204
212
return None
205
213
206
- key = "/" .join (("versioning" , self .account_name , container_root ))
214
+ key = "/" .join (("versioning" , self .account_name , root_container ))
207
215
val = memcache .get (key )
208
216
if val is not None :
209
217
if val != '' :
210
218
req .headers [FORCEVERSIONING_HEADER ] = val
211
219
return
212
220
213
- # we can't use get_info_cache or set_info as it use local worker cache
214
- # then memcache: an update of versioning may be not detected
215
221
oio_headers = {'X-oio-req-id' : self .trans_id }
216
- meta = self .app .storage .container_get_properties (
217
- self .account_name , container_root , headers = oio_headers )
222
+ try :
223
+ meta = self .app .storage .container_get_properties (
224
+ self .account_name , root_container , headers = oio_headers )
225
+ except exceptions .NoSuchContainer :
226
+ raise HTTPNotFound (request = req )
218
227
219
228
val = meta ['system' ].get ('sys.m2.policy.version' , '' )
220
229
memcache .set (key , val )
@@ -412,7 +421,7 @@ def PUT(self, req):
412
421
if aresp :
413
422
return aresp
414
423
415
- self .versioning_management (req )
424
+ self .enforce_versioning (req )
416
425
417
426
old_slo_manifest = None
418
427
old_slo_manifest_etag = None
@@ -705,7 +714,7 @@ def DELETE(self, req):
705
714
706
715
self ._update_x_timestamp (req )
707
716
708
- self .versioning_management (req )
717
+ self .enforce_versioning (req )
709
718
710
719
return self ._delete_object (req )
711
720
0 commit comments