summaryrefslogtreecommitdiffstats
path: root/src/net/peerblk.c
diff options
context:
space:
mode:
authorMichael Brown2017-09-05 23:55:05 +0200
committerMichael Brown2017-09-06 00:23:22 +0200
commit7e673a6b67be1594e16a8cc5ab4a0d6c17799547 (patch)
tree863552df11d5bd2800203e7dd94a20e53177b096 /src/net/peerblk.c
parent[monojob] Display job status message, if present (diff)
downloadipxe-7e673a6b67be1594e16a8cc5ab4a0d6c17799547.tar.gz
ipxe-7e673a6b67be1594e16a8cc5ab4a0d6c17799547.tar.xz
ipxe-7e673a6b67be1594e16a8cc5ab4a0d6c17799547.zip
[peerdist] Gather and report peer statistics during download
Record and report the number of peers (calculated as the maximum number of peers discovered for a block's segment at the time that the block download is complete), and the percentage of blocks retrieved from peers rather than from the origin server. Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src/net/peerblk.c')
-rw-r--r--src/net/peerblk.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/src/net/peerblk.c b/src/net/peerblk.c
index 9fd52b73..78888d2d 100644
--- a/src/net/peerblk.c
+++ b/src/net/peerblk.c
@@ -270,6 +270,9 @@ static int peerblk_deliver ( struct peerdist_block *peerblk,
*/
static void peerblk_done ( struct peerdist_block *peerblk, int rc ) {
struct digest_algorithm *digest = peerblk->digest;
+ struct peerdisc_segment *segment = peerblk->discovery.segment;
+ struct peerdisc_peer *head;
+ struct peerdisc_peer *peer;
uint8_t hash[digest->digestsize];
unsigned long now = peerblk_timestamp();
@@ -296,6 +299,11 @@ static void peerblk_done ( struct peerdist_block *peerblk, int rc ) {
profile_custom ( &peerblk_attempt_success_profiler,
( now - peerblk->attempted ) );
+ /* Report peer statistics */
+ head = list_entry ( &segment->peers, struct peerdisc_peer, list );
+ peer = ( ( peerblk->peer == head ) ? NULL : peerblk->peer );
+ peerdisc_stat ( &peerblk->xfer, peer, &segment->peers );
+
/* Close download */
peerblk_close ( peerblk, 0 );
return;