def make_local_copy(datafile_id): datafile = Dataset_File.objects.get(id=datafile_id) # Check that we still need to verify - it might have been done already if datafile.is_local(): return # Use a transaction for safety with transaction.commit_on_success(): # Get datafile locked for write (to prevent concurrent actions) datafile = Dataset_File.objects.select_for_update().get(id=datafile_id) # Second check after lock (concurrency paranoia) if not datafile.is_local(): stage_file(datafile)
def restore_datafile(datafile, noRemove=False): """ Restore a file that has been migrated """ # (Deferred imports to avoid prematurely triggering DB init) from tardis.tardis_portal.models import Dataset_File from django.db import transaction with transaction.commit_on_success(): df = Dataset_File.objects.select_for_update().get(id=datafile.id) if df.is_local(): return False destination = Destination.identify_destination(df.url) if not destination: raise MigrationError('Cannot identify the migration destination' \ ' holding %s' % df.url) if not df.verified or destination.trust_length: raise MigrationError('Only verified datafiles can be restored' \ ' from destination %s' % destination.name) df.verified = False url = df.url if not stage_file(df): raise MigrationError('Restoration failed') logger.info('Restored file %s for datafile %s' % (df.get_absolute_filepath(), df.id)) if not noRemove: destination.provider.remove_file(url) logger.info('Removed remote file %s for datafile %s' % (url, df.id)) return True
def test_stage_file(self): from tardis.tardis_portal import staging staging.stage_file(self.df)