diff --git a/CHANGELOG.md b/CHANGELOG.md index 6af897d79..1affe57cd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ at anytime. ### Added * Add `claim_send_to_address` * Add `change_address` argument to `publish` + * Add `unique_contacts` count to `status` response ### Changed * Support resolution of multiple uris with `resolve`, all results are keyed by uri diff --git a/lbrynet/dht/protocol.py b/lbrynet/dht/protocol.py index 6cf24733f..d17a8befb 100644 --- a/lbrynet/dht/protocol.py +++ b/lbrynet/dht/protocol.py @@ -79,6 +79,7 @@ class KademliaProtocol(protocol.DatagramProtocol): self._history_tx = {} self._bytes_rx = {} self._bytes_tx = {} + self._unique_contacts = [] self._queries_rx_per_second = 0 self._queries_tx_per_second = 0 self._kbps_tx = 0 @@ -121,6 +122,10 @@ class KademliaProtocol(protocol.DatagramProtocol): self._total_bytes_tx = sum(v for (k, v) in self._bytes_tx.iteritems()) self._total_bytes_rx = sum(v for (k, v) in self._bytes_rx.iteritems()) + @property + def unique_contacts(self): + return self._unique_contacts + @property def queries_rx_per_second(self): return self._queries_rx_per_second @@ -159,6 +164,7 @@ class KademliaProtocol(protocol.DatagramProtocol): "queries_received": self.queries_rx_per_second, "queries_sent": self.queries_tx_per_second, "recent_contacts": self.recent_contact_count, + "unique_contacts": len(self.unique_contacts) } return response @@ -256,6 +262,8 @@ class KademliaProtocol(protocol.DatagramProtocol): bytes_rx = self._bytes_rx.get(address, 0) bytes_rx += len(datagram) self._bytes_rx[address] = bytes_rx + if address not in self.unique_contacts: + self._unique_contacts.append(address) # Refresh the remote node's details in the local node's k-buckets self._node.addContact(remoteContact) @@ -315,6 +323,8 @@ class KademliaProtocol(protocol.DatagramProtocol): bytes_tx = self._bytes_tx.get(address, 0) bytes_tx += len(data) self._bytes_tx[address] = bytes_tx + if address not in self.unique_contacts: + self._unique_contacts.append(address) if len(data) > self.msgSizeLimit: # We have to spread the data over multiple UDP datagrams, diff --git a/lbrynet/lbrynet_daemon/Daemon.py b/lbrynet/lbrynet_daemon/Daemon.py index b255c2f5a..972adc8a1 100644 --- a/lbrynet/lbrynet_daemon/Daemon.py +++ b/lbrynet/lbrynet_daemon/Daemon.py @@ -994,6 +994,46 @@ class Daemon(AuthJSONRPCServer): Options: -s : include session status in results -d : include dht network and peer status + + Returns: + (dict) lbrynet-daemon status + { + 'lbry_id': lbry peer id, base58 + 'installation_id': installation id, base58 + 'is_running': bool + 'is_first_run': bool + 'startup_status': { + 'code': status code + 'message': status message + }, + 'connection_status': { + 'code': connection status code + 'message': connection status message + }, + 'blockchain_status': { + 'blocks': local blockchain height, + 'blocks_behind': remote_height - local_height, + 'best_blockhash': block hash of most recent block, + }, + + If given the session status option: + 'session_status': { + 'managed_blobs': count of blobs in the blob manager, + 'managed_streams': count of streams in the file manager + } + + If given the dht status option: + 'dht_status': { + 'kbps_received': current kbps receiving, + 'kbps_sent': current kdps being sent, + 'total_bytes_sent': total bytes sent + 'total_bytes_received': total bytes received + 'queries_received': number of queries received per second + 'queries_sent': number of queries sent per second + 'recent_contacts': count of recently contacted peers + 'unique_contacts': count of unique peers + } + } """ # on startup, the wallet or network won't be available but we still need this call to work