17
17
from contextlib import contextmanager
18
18
import os
19
19
import logging
20
+ import errno
20
21
21
22
from swift .common import db_replicator
23
+ from swift .common import utils
22
24
from swift .common .utils import normalize_timestamp
23
25
from swift .container import server as container_server
24
26
@@ -86,6 +88,8 @@ def getmtime(self, file):
86
88
87
89
class FakeBroker :
88
90
db_file = __file__
91
+ get_repl_missing_table = False
92
+ db_type = 'container'
89
93
def __init__ (self , * args , ** kwargs ):
90
94
return None
91
95
@contextmanager
@@ -104,6 +108,8 @@ def merge_syncs(self, *args, **kwargs):
104
108
def merge_items (self , * args ):
105
109
self .args = args
106
110
def get_replication_info (self ):
111
+ if self .get_repl_missing_table :
112
+ raise Exception ('no such table' )
107
113
return {'delete_timestamp' : 0 , 'put_timestamp' : 1 , 'count' : 0 }
108
114
def reclaim (self , item_timestamp , sync_timestamp ):
109
115
pass
@@ -202,6 +208,35 @@ def test_replicate_object(self):
202
208
replicator = TestReplicator ({})
203
209
replicator ._replicate_object ('0' , 'file' , 'node_id' )
204
210
211
+ def test_replicate_object_quarantine (self ):
212
+ replicator = TestReplicator ({})
213
+ was_db_file = replicator .brokerclass .db_file
214
+ try :
215
+
216
+ def mock_renamer (was , new , cause_colision = False ):
217
+ if cause_colision and '-' not in new :
218
+ raise OSError (errno .EEXIST , "File already exists" )
219
+ self .assertEquals ('/a/b/c/d/e' , was )
220
+ if '-' in new :
221
+ self .assert_ (
222
+ new .startswith ('/a/quarantined/containers/e-' ))
223
+ else :
224
+ self .assertEquals ('/a/quarantined/containers/e' , new )
225
+
226
+ def mock_renamer_error (was , new ):
227
+ return mock_renamer (was , new , cause_colision = True )
228
+ was_renamer = db_replicator .renamer
229
+ db_replicator .renamer = mock_renamer
230
+ db_replicator .lock_parent_directory = lock_parent_directory
231
+ replicator .brokerclass .get_repl_missing_table = True
232
+ replicator .brokerclass .db_file = '/a/b/c/d/e/hey'
233
+ replicator ._replicate_object ('0' , 'file' , 'node_id' )
234
+ # try the double quarantine
235
+ db_replicator .renamer = mock_renamer_error
236
+ replicator ._replicate_object ('0' , 'file' , 'node_id' )
237
+ finally :
238
+ replicator .brokerclass .db_file = was_db_file
239
+ db_replicator .renamer = was_renamer
205
240
206
241
# def test_dispatch(self):
207
242
# rpc = db_replicator.ReplicatorRpc('/', '/', FakeBroker, False)
0 commit comments