class Journal: # journal statuses JS_SYNC = 0 JS_NOT_SYNC = 1 JS_NOT_INIT = 2 JS_SYNC_FAILED = 3 # types of operations for journaling OT_APPEND = 1 OT_UPDATE = 2 OT_REMOVE = 3 RECORD_STRUCT = "<IBQ" RECORD_STRUCT_SIZE = struct.calcsize(RECORD_STRUCT) def __init__(self, journal_key, journal_path, fabnet_gateway): self.__journal_key = journal_key self.__journal_path = journal_path self.__journal = DataBlock(self.__journal_path, force_create=True) self.__fabnet_gateway = fabnet_gateway self.__last_record_id = 0 self.__no_foreign = True self.__is_sync = False self.__sync_failed = False self.__j_sync_thrd = JournalSyncThread(self) self.__j_sync_thrd.start() def get_journal_key(self): return self.__journal_key def __recv_journal(self): self.__journal.remove() self.__journal = DataBlock(self.__journal_path, force_create=True) is_recv = self.__fabnet_gateway.get(self.__journal_key, 2, self.__journal) if is_recv: self.__no_foreign = False self.__is_sync = True self.__journal.close() # next __journal.write reopen data block events_provider.info("journal", "Journal is received from NimbusFS backend") else: events_provider.warning("journal", "Can't receive journal from NimbusFS backend") self.__no_foreign = True def close(self): self.__journal.close() self.__j_sync_thrd.stop() @JLock def synchronized(self): return self.__is_sync @JLock def status(self): if self.__sync_failed: return self.JS_SYNC_FAILED if self.__no_foreign: return self.JS_NOT_INIT if not self.__is_sync: return self.JS_NOT_SYNC return self.JS_SYNC @JLock def _synchronize(self): try: logger.debug("synchronizing journal...") self.__journal.flush() j_data = DataBlock(self.__journal_path, actsize=True) is_send = self.__fabnet_gateway.put(j_data, key=self.__journal_key) if is_send: self.__is_sync = True self.__sync_failed = False except Exception, err: self.__sync_failed = True raise err
class Journal: #journal statuses JS_SYNC = 0 JS_NOT_SYNC = 1 JS_NOT_INIT = 2 JS_SYNC_FAILED = 3 #types of operations for journaling OT_APPEND = 1 OT_UPDATE = 2 OT_REMOVE = 3 RECORD_STRUCT = '<IBQ' RECORD_STRUCT_SIZE = struct.calcsize(RECORD_STRUCT) def __init__(self, journal_key, journal_path, fabnet_gateway): self.__journal_key = journal_key self.__journal_path = journal_path self.__journal = DataBlock(self.__journal_path, force_create=True) self.__fabnet_gateway = fabnet_gateway self.__last_record_id = 0 self.__no_foreign = True self.__is_sync = False self.__sync_failed = False self.__j_sync_thrd = JournalSyncThread(self) self.__j_sync_thrd.start() def get_journal_key(self): return self.__journal_key def __recv_journal(self): self.__journal.remove() self.__journal = DataBlock(self.__journal_path, force_create=True) is_recv = self.__fabnet_gateway.get(self.__journal_key, 2, self.__journal) if is_recv: self.__no_foreign = False self.__is_sync = True self.__journal.close() #next __journal.write reopen data block events_provider.info("journal", "Journal is received from NimbusFS backend") else: events_provider.warning( "journal", "Can't receive journal from NimbusFS backend") self.__no_foreign = True def close(self): self.__journal.close() self.__j_sync_thrd.stop() @JLock def synchronized(self): return self.__is_sync @JLock def status(self): if self.__sync_failed: return self.JS_SYNC_FAILED if self.__no_foreign: return self.JS_NOT_INIT if not self.__is_sync: return self.JS_NOT_SYNC return self.JS_SYNC @JLock def _synchronize(self): try: logger.debug('synchronizing journal...') self.__journal.flush() j_data = DataBlock(self.__journal_path, actsize=True) is_send = self.__fabnet_gateway.put(j_data, key=self.__journal_key) if is_send: self.__is_sync = True self.__sync_failed = False except Exception, err: self.__sync_failed = True raise err