def yield_local_backend(bi): backend_dir = tempfile.mkdtemp(prefix='s3ql-backend-') backend = LocalBackend('local://' + backend_dir, None, None) backend.unittest_info = Namespace() backend.unittest_info.retry_time = 0 try: yield backend finally: backend.close() shutil.rmtree(backend_dir)
def test(self): self.mkfs() # Get backend instance plain_backend = LocalBackend(self.storage_url, None, None) # Save metadata meta = plain_backend['s3ql_metadata'] # Mount file system self.mount() # Increase sequence number seq_no = get_seq_no(plain_backend) plain_backend['s3ql_seq_no_%d' % (seq_no + 1)] = b'Empty' # Create a file, so that there's metadata to flush fname = os.path.join(self.mnt_dir, 'file1') with open(fname, 'w') as fh: fh.write('hello, world') # Try to upload metadata s3ql.ctrl.main(['upload-meta', self.mnt_dir]) # Try to write. We repeat a few times, since the metadata upload # happens asynchronously. with pytest.raises(PermissionError): for _ in range(10): with open(fname + 'barz', 'w') as fh: fh.write('foobar') time.sleep(1) self.reg_output( r'^ERROR: Remote metadata is newer than local ' '\(\d+ vs \d+\), refusing to overwrite(?: and switching ' 'to failsafe mode)?!$', count=2) self.reg_output( r'^WARNING: File system errors encountered, marking for ' 'fsck\.$', count=1) self.reg_output( r'^ERROR: The locally cached metadata will be ' '\*lost\* the next .+$', count=1) self.umount() # Assert that remote metadata has not been overwritten assert meta == plain_backend['s3ql_metadata'] plain_backend.close()
def test(self): self.mkfs() # Get backend instance plain_backend = LocalBackend(self.storage_url, None, None) # Save metadata meta = plain_backend['s3ql_metadata'] # Mount file system self.mount(fatal_warnings=False) # Increase sequence number seq_no = get_seq_no(plain_backend) plain_backend['s3ql_seq_no_%d' % (seq_no+1)] = b'Empty' # Create a file, so that there's metadata to flush fname = os.path.join(self.mnt_dir, 'file1') with open(fname, 'w') as fh: fh.write('hello, world') # Try to upload metadata s3ql.ctrl.main(['upload-meta', self.mnt_dir]) # Try to write. We repeat a few times, since the metadata upload # happens asynchronously. with pytest.raises(PermissionError): for _ in range(10): with open(fname + 'barz', 'w') as fh: fh.write('foobar') time.sleep(1) self.umount() # Assert that remote metadata has not been overwritten assert meta == plain_backend['s3ql_metadata'] plain_backend.close()