示例#1
0
    def run(self):
        logger.info('Thread started!')

        while not self.stopped.is_set():
            dt = 0
            try:
                t0 = datetime.now()
                logger.debug('Collecting %s nodes statistic...'%self.check_status)
                nodeaddrs = self.operator.get_nodes_list(self.check_status)

                for nodeaddr in nodeaddrs:
                    logger.debug('Get statistic from %s'%nodeaddr)

                    packet_obj = FabnetPacketRequest(method='NodeStatistic', sync=True)
                    ret_packet = self.client.call_sync(nodeaddr, packet_obj)
                    if self.check_status == UP and ret_packet.ret_code:
                        logger.warning('Node with address %s does not response... Details: %s'%(nodeaddr, ret_packet))
                        self.operator.change_node_status(nodeaddr, DOWN)
                    else:
                        stat = json.dumps(ret_packet.ret_parameters)
                        self.operator.update_node_stat(nodeaddr, stat)

                dt = total_seconds(datetime.now() - t0)
                logger.info('Nodes (with status=%s) stat is collected. Processed secs: %s'%(self.check_status, dt))
            except Exception, err:
                logger.error(str(err))
            finally:
示例#2
0
    def check_neighbours(self):
        ka_packet = FabnetPacketRequest(method=KEEP_ALIVE_METHOD, sender=self.self_address, sync=True)
        superiors = self.get_neighbours(NT_SUPERIOR)

        remove_nodes = []
        for superior in superiors:
            resp = self.fri_client.call_sync(superior, ka_packet)
            cnt = 0
            self._lock()
            try:
                if self.__superior_keep_alives.get(superior, None) is None:
                    self.__superior_keep_alives[superior] = 0

                if resp.ret_code == RC_OK:
                    self.__superior_keep_alives[superior] = 0
                elif resp.ret_code == RC_NOT_MY_NEIGHBOUR:
                    remove_nodes.append((NT_SUPERIOR, superior, False))
                    continue
                else:
                    self.__superior_keep_alives[superior] += 1

                cnt = self.__superior_keep_alives[superior]
            finally:
                self._unlock()

            if cnt == KEEP_ALIVE_TRY_COUNT:
                logger.info('Neighbour %s does not respond. removing it...'%superior)
                remove_nodes.append((NT_SUPERIOR, superior, True))


        #check upper nodes...
        uppers = self.get_neighbours(NT_UPPER)
        self._lock()
        try:
            cur_dt = datetime.now()
            for upper in uppers:
                ka_dt = self.__upper_keep_alives.get(upper, None)
                if ka_dt == None:
                    self.__upper_keep_alives[upper] = datetime.now()
                    continue

                if total_seconds(cur_dt - ka_dt) >= KEEP_ALIVE_MAX_WAIT_TIME:
                    logger.info('No keep alive packets from upper neighbour %s. removing it...'%upper)
                    remove_nodes.append((NT_UPPER, upper, False))
        finally:
            self._unlock()

        for n_type, nodeaddr, is_not_respond in remove_nodes:
            self.remove_neighbour(n_type, nodeaddr)
            if is_not_respond:
                self.on_neigbour_not_respond(n_type, nodeaddr)

        if remove_nodes or \
            (len(uppers) < ONE_DIRECT_NEIGHBOURS_COUNT) or \
            (len(superiors) < ONE_DIRECT_NEIGHBOURS_COUNT):

            self._rebalance_nodes()
示例#3
0
            return s_packet
        except PermissionDeniedException, err:
            return FabnetPacketResponse(from_node=self.__self_address,
                        message_id=packet.message_id, ret_code=RC_PERMISSION_DENIED,
                        ret_message='Permission denied!')
        except Exception, err:
            err_packet = FabnetPacketResponse(from_node=self.__self_address,
                            message_id=packet.message_id,
                            ret_code=1, ret_message= '[OpPROC] %s'%err)
            logger.write = logger.debug
            traceback.print_exc(file=logger)
            logger.error('[OperationsManager.process] %s'%err)
            return err_packet
        finally:
            if self.__op_stat is not None and t0:
                dt = total_seconds(datetime.now()-t0)
                self.__op_stat.update(packet.method, dt)


    def after_process(self, packet, ret_packet):
        """process some logic after response is send"""
        if packet.method == KEEP_ALIVE_METHOD:
            return

        operation_obj = self.__operations.get(packet.method, None)
        if operation_obj is None:
            return

        try:
            operation_obj.after_process(packet, ret_packet)
        except Exception, err: