Example #1
0
    def _received_store_rpc(self, data_packet):
        '''Received store RPC'''

        _logger.debug('Store value %s←%s', self.address, data_packet.address)

        dict_obj = data_packet.dict_obj

        # FIXME: validation
        key = KeyBytes(dict_obj[JSONKeys.KEY])
        index = KeyBytes(dict_obj[JSONKeys.INDEX])
        size = int(dict_obj[JSONKeys.SIZE])
        timestamp = int(dict_obj[JSONKeys.TIMESTAMP])

        d = self._template_dict()
        kvpid = KVPID(key, index)

        if self._kvp_table.is_acceptable(kvpid, size, timestamp):
            transfer_id = self._network.new_sequence_id()

            download_task = self._download_slot.add(
                self._network.expect_incoming_transfer, transfer_id,
                max_size=DHTNetwork.MAX_VALUE_SIZE,
                download_task_class=ReadStoreFromNodeTask)

            download_task.key = kvpid.key
            download_task.index = kvpid.index
            download_task.total_size = size
            d[JSONKeys.TRANSFER_ID] = transfer_id

            self._network.send_answer_reply(data_packet, d)

            _logger.debug('Store value %s←%s begin read', self.address,
                data_packet.address)

            file = download_task.result()

            _logger.debug('Store value %s←%s received data', self.address,
                data_packet.address)

            data = file.read()

            if index.validate_value(data):
                self._kvp_table[kvpid] = data
                kvp_record = self._kvp_table.record(kvpid)
                kvp_record.timestamp = timestamp
                kvp_record.last_update = time.time()
                kvp_record.time_to_live = self._calculate_expiration_time(key)
        else:
            self._network.send_answer_reply(data_packet, d)