示例#1
0
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
示例#2
0
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