Exemplo n.º 1
0
    def process(self, packet):
        """In this method should be implemented logic of processing
        reuqest packet from sender node

        @param packet - object of FabnetPacketRequest class
        @return object of FabnetPacketResponse
                or None for disabling packet response to sender
        """
        key = packet.parameters.get('key', None)
        replica_count = packet.parameters.get('replica_count', None)
        if key is None:
            return FabnetPacketResponse(ret_code=RC_ERROR,
                    ret_message='Key is not found in request packet!')

        if replica_count is None:
            return FabnetPacketResponse(ret_code=RC_ERROR,
                    ret_message='Replica count should be passed to GetKeysInfo operation')

        self._validate_key(key)
        keys = KeyUtils.get_all_keys(key, replica_count)

        is_replica = False
        ret_keys = []
        for key in keys:
            long_key = self._validate_key(key)
            range_obj = self.operator.ranges_table.find(long_key)
            if not range_obj:
                logger.warning('[GetKeysInfoOperation] Internal error: No hash range found for key=%s!'%key)
            else:
                ret_keys.append((key, is_replica, range_obj.node_address))
            is_replica = True

        return FabnetPacketResponse(ret_parameters={'keys_info': ret_keys})
Exemplo n.º 2
0
    def process(self, packet):
        """In this method should be implemented logic of processing
        reuqest packet from sender node

        @param packet - object of FabnetPacketRequest class
        @return object of FabnetPacketResponse
                or None for disabling packet response to sender
        """
        key = packet.parameters.get('key', None)
        replica_count = packet.parameters.get('replica_count', None)
        if key is None:
            return FabnetPacketResponse(ret_code=RC_ERROR,
                    ret_message='Key is not found in request packet!')

        if replica_count is None:
            return FabnetPacketResponse(ret_code=RC_ERROR,
                    ret_message='Replica count should be passed to GetData operation')

        self._validate_key(key)
        keys = KeyUtils.get_all_keys(key, replica_count)

        data = None
        checksum = None
        is_replica = False
        for key in keys:
            long_key = self._validate_key(key)

            range_obj = self.operator.find_range(long_key)
            if not range_obj:
                logger.warning('[ClientGetOperation] Internal error: No hash range found for key=%s!'%key)
            else:
                _, _, node_address = range_obj
                resp = self._init_operation(node_address, 'GetDataBlock', {'key': key, 'is_replica': is_replica, \
                        'user_id': packet.session_id}, sync=True)
                if resp.ret_code == RC_PERMISSION_DENIED:
                    return FabnetPacketResponse(ret_code=RC_PERMISSION_DENIED, ret_message=resp.ret_message)
                elif resp.ret_code:
                    logger.warning('[ClientGetOperation] GetDataBlock error from %s: %s'%(node_address, resp.ret_message))
                else:
                    data = resp.binary_data
                    checksum = resp.ret_parameters['checksum']
                    break
            is_replica = True

        if data is None:
            return FabnetPacketResponse(ret_code=RC_NO_DATA, ret_message='No data found!')

        return FabnetPacketResponse(binary_data=data, ret_parameters={'checksum': checksum})
Exemplo n.º 3
0
    def __process_data_block(self, key, raw_data, is_replica=False):
        self.__processed_local_blocks += 1
        try:
            raw_header = raw_data.read(DataBlockHeader.HEADER_LEN)
            primary_key, replica_count, checksum, user_id, stored_dt = DataBlockHeader.unpack(raw_header)
            if not is_replica:
                if key != primary_key:
                    raise Exception("Primary key is invalid: %s != %s" % (key, primary_key))

            data_keys = KeyUtils.get_all_keys(primary_key, replica_count)
            if is_replica:
                if key not in data_keys:
                    raise Exception("Replica key is invalid: %s" % key)
        except Exception, err:
            self.__invalid_local_blocks += 1
            logger.error("[RepairDataBlocks] %s" % err)
            return