def backup(min_interval=MIN_INTERVAL, backup_dir=BACKUP_DIR, data_dir=DATA_DIR): if backup_dir is None: return #XXX: The timeout is arbitary but dependant on the back-up, should we start # with a sane default and then refer to how long the last back-up # took? backup_lock = join_path(DATA_DIR, '.backup.lock') with file_lock(backup_lock, pid_policy=PID_WARN, timeout=60): _backup(min_interval, backup_dir, data_dir)
def backup(min_interval=MIN_INTERVAL, backup_dir=BACKUP_DIR, data_dir=DATA_DIR): if backup_dir is None: return #XXX: The timeout is arbitrary but dependent on the back-up, should we start # with a sane default and then refer to how long the last back-up # took? backup_lock = join_path(DATA_DIR, '.backup.lock') with file_lock(backup_lock, pid_policy=PID_WARN, timeout=60): _backup(min_interval, backup_dir, data_dir)
def __exit__(self, type, value, traceback): #self._file_input.close() if not self._read_only: assert len(self._input_files) == 1, 'more than one valid outfile' # We are hitting the disk a lot more than we should here, what we # should have is a modification flag in the object but we can't # due to how we change the annotations. out_str = unicode(self) with open_textfile(self._input_files[0], 'r') as old_ann_file: old_str = old_ann_file.read() # Was it changed? if out_str == old_str: # Then just return return from config import WORK_DIR # Protect the write so we don't corrupt the file with file_lock(path_join(WORK_DIR, basename(self._input_files[0].replace('/', '_'))) ) as lock_file: #from tempfile import NamedTemporaryFile from tempfile import mkstemp # TODO: XXX: Is copyfile really atomic? from shutil import copyfile # XXX: NamedTemporaryFile only supports encoding for Python 3 # so we hack around it. #with NamedTemporaryFile('w', suffix='.ann') as tmp_file: # Grab the filename, but discard the handle _, tmp_fname = mkstemp(suffix='.ann') try: with open_textfile(tmp_fname, 'w') as tmp_file: #XXX: Temporary hack to make sure we don't write corrupted # files, but the client will already have the version # at this stage leading to potential problems upon # the next change to the file. tmp_file.write(out_str) tmp_file.flush() try: with Annotations(tmp_file.name) as ann: # Move the temporary file onto the old file copyfile(tmp_file.name, self._input_files[0]) # As a matter of convention we adjust the modified # time of the data dir when we write to it. This # helps us to make back-ups now = time() #XXX: Disabled for now! #utime(DATA_DIR, (now, now)) except Exception, e: from message import Messager Messager.error('ERROR writing changes: generated annotations cannot be read back in!\n(This is almost certainly a system error, please contact the developers.)\n%s' % e, -1) raise finally: try: from os import remove remove(tmp_fname) except Exception, e: from message import Messager Messager.error("Error removing temporary file '%s'" % tmp_fname) return