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)