Exemple #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
        """
        data = packet.binary_data
        key = packet.parameters.get('key', None)
        if key is not None:
            self._validate_key(key)

        checksum = packet.parameters.get('checksum', None)
        replica_count = int(packet.parameters.get('replica_count', MIN_REPLICA_COUNT))
        wait_writes_count = int(packet.parameters.get('wait_writes_count', 1))
        if checksum is None:
            return FabnetPacketResponse(ret_code=RC_ERROR,
                    ret_message='Checksum does not found in request packet!')

        if wait_writes_count > replica_count:
            return FabnetPacketResponse(ret_code=RC_ERROR, ret_message='Cant waiting more replicas than saving!')
        if replica_count < MIN_REPLICA_COUNT:
            return FabnetPacketResponse(ret_code=RC_ERROR, ret_message='Minimum replica count is equal to %s!'%MIN_REPLICA_COUNT)

        data_block = DataBlock(data, checksum)
        data_block.validate()
        succ_count = 0
        is_replica = False
        keys = KeyUtils.generate_new_keys(self.operator.node_name, replica_count, prime_key=key)
        data, checksum = data_block.pack(keys[0], replica_count)
        for key in keys:
            range_obj = self.operator.ranges_table.find(long(key, 16))
            if not range_obj:
                logger.debug('[ClientPutOperation] Internal error: No hash range found for key=%s!'%key)
            else:
                params = {'key': key, 'checksum': checksum, 'is_replica': is_replica}
                if succ_count >= wait_writes_count:
                    self._init_operation(range_obj.node_address, 'PutDataBlock', params, binary_data=data)
                else:
                    resp = self._init_operation(range_obj.node_address, 'PutDataBlock', params, sync=True, binary_data=data)
                    if resp.ret_code:
                        logger.debug('[ClientPutOperation] PutDataBlock error from %s: %s'%(range_obj.node_address, resp.ret_message))
                    else:
                        succ_count += 1

            is_replica = True

        if wait_writes_count < succ_count:
            return FabnetPacketResponse(ret_code=RC_ERROR, ret_message='Writing data error!')

        return FabnetPacketResponse(ret_parameters={'key': keys[0]})
Exemple #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
        """
        primary_key = packet.parameters.get('primary_key', None)
        replica_count =  packet.parameters.get('replica_count', None)
        key = packet.parameters.get('key', None)
        checksum = packet.parameters.get('checksum', None)
        is_replica = packet.parameters.get('is_replica', False)
        data = packet.binary_data

        if key is None:
            return FabnetPacketResponse(ret_code=RC_ERROR, ret_message='key does not found!')
        if checksum is None:
            return FabnetPacketResponse(ret_code=RC_ERROR, ret_message='data checksum does not found!')

        if primary_key:
            if replica_count is None:
                return FabnetPacketResponse(ret_code=RC_ERROR, ret_message='replica_count does not found!')

            data_block = DataBlock(data, checksum)
            data_block.validate()
            data, checksum = data_block.pack(primary_key, replica_count)
        else:
            #DataBlock.read_header(data) #FIXME
            pass

        dht_range = self.operator.get_dht_range()
        if not is_replica:
            dht_range.put(key, data)
        else:
            dht_range.put_replica(key, data)

        return FabnetPacketResponse()