From 3b01df1d2c0be563bcde610c17734b22af9b4537 Mon Sep 17 00:00:00 2001 From: zzz Date: Sun, 3 Sep 2006 09:12:22 +0000 Subject: [PATCH] (zzz) Add rate reporting to i2psnark --- .../src/org/klomp/snark/PeerCheckerTask.java | 6 ++- .../src/org/klomp/snark/PeerCoordinator.java | 40 +++++++++++++++++++ .../org/klomp/snark/web/I2PSnarkServlet.java | 22 ++++++---- history.txt | 5 ++- .../src/net/i2p/router/RouterVersion.java | 4 +- 5 files changed, 64 insertions(+), 13 deletions(-) diff --git a/apps/i2psnark/java/src/org/klomp/snark/PeerCheckerTask.java b/apps/i2psnark/java/src/org/klomp/snark/PeerCheckerTask.java index 78efa094e..882718971 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/PeerCheckerTask.java +++ b/apps/i2psnark/java/src/org/klomp/snark/PeerCheckerTask.java @@ -89,8 +89,6 @@ class PeerCheckerTask extends TimerTask if (peer.isChoked()) choked++; - // XXX - We should calculate the up/download rate a bit - // more intelligently long upload = peer.getUploaded(); uploaded += upload; long download = peer.getDownloaded(); @@ -196,6 +194,10 @@ class PeerCheckerTask extends TimerTask // Put peers back at the end of the list that we removed earlier. coordinator.peers.addAll(removed); coordinator.peerCount = coordinator.peers.size(); + + // store the rates + coordinator.setRateHistory(uploaded, downloaded); + } if (coordinator.halted()) { cancel(); diff --git a/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java b/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java index 4ab21b14b..cafc7bf6a 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java +++ b/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java @@ -50,6 +50,9 @@ public class PeerCoordinator implements PeerListener private long uploaded; private long downloaded; + final static int RATE_DEPTH = 6; // make following arrays RATE_DEPTH long + private long uploaded_old[] = {0,0,0,0,0,0}; + private long downloaded_old[] = {0,0,0,0,0,0}; // synchronize on this when changing peers or downloaders final List peers = new ArrayList(); @@ -142,6 +145,43 @@ public class PeerCoordinator implements PeerListener return downloaded; } + /** + * Push the total uploaded/downloaded onto a RATE_DEPTH deep stack + */ + public void setRateHistory(long up, long down) + { + for (int i = RATE_DEPTH-1; i > 0; i--){ + uploaded_old[i] = uploaded_old[i-1]; + downloaded_old[i] = downloaded_old[i-1]; + } + uploaded_old[0] = up; + downloaded_old[0] = down; + } + + /** + * Returns the 2-minute-average rate in Bps + */ + public long getDownloadRate() + { + long rate = 0; + for (int i = 0; i < RATE_DEPTH; i++){ + rate += downloaded_old[i]; + } + return rate / (RATE_DEPTH * CHECK_PERIOD / 1000); + } + + /** + * Returns the 2-minute-average rate in Bps + */ + public long getUploadRate() + { + long rate = 0; + for (int i = 0; i < RATE_DEPTH; i++){ + rate += uploaded_old[i]; + } + return rate / (RATE_DEPTH * CHECK_PERIOD / 1000); + } + public MetaInfo getMetaInfo() { return metainfo; diff --git a/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java b/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java index c99494b24..66505c2a0 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java +++ b/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java @@ -292,8 +292,13 @@ public class I2PSnarkServlet extends HttpServlet { long remaining = (long) snark.storage.needed() * (long) snark.meta.getPieceLength(0); if (remaining > total) remaining = total; - int totalBps = 4096; // should probably grab this from the snark... - long remainingSeconds = remaining / totalBps; + long downBps = snark.coordinator.getDownloadRate(); + long upBps = snark.coordinator.getUploadRate(); + long remainingSeconds; + if (downBps > 0) + remainingSeconds = remaining / downBps; + else + remainingSeconds = -1; long uploaded = snark.coordinator.getUploaded(); boolean isRunning = !snark.stopped; @@ -339,17 +344,18 @@ public class I2PSnarkServlet extends HttpServlet { out.write(""); if (remaining > 0) { out.write(formatSize(total-remaining) + "/" + formatSize(total)); // 18MB/3GB - // lets hold off on the ETA until we have rates sorted... - //out.write(" (eta " + DataHelper.formatDuration(remainingSeconds*1000) + ")"); // (eta 6h) + if(isRunning && remainingSeconds > 0) + out.write(" (ETA " + DataHelper.formatDuration(remainingSeconds*1000) + ")"); // (eta 6h) } else { out.write(formatSize(total)); // 3GB } out.write("\n\t"); out.write("" + formatSize(uploaded) + "\n\t"); - //out.write(""); - //out.write("n/a"); //2KBps/12KBps/4KBps - //out.write("\n\t"); + out.write(""); + if(isRunning) + out.write(formatSize(downBps) + "ps/" + formatSize(upBps) + "ps"); + out.write("\n\t"); out.write(""); if (isRunning) { out.write("Torrent\n" + " Downloaded\n" + " Uploaded\n" + - //" Rate\n" + + " Rate Down/Up\n" + "  \n" + "\n"; diff --git a/history.txt b/history.txt index 0dc7fe00e..058d70a79 100644 --- a/history.txt +++ b/history.txt @@ -1,4 +1,7 @@ -$Id: history.txt,v 1.506 2006-08-21 00:55:34 complication Exp $ +$Id: history.txt,v 1.507 2006-09-03 01:37:46 complication Exp $ + +2006-09-03 zzz + * Add rate reporting to i2psnark 2006-09-03 Complication * Limit form size in SusiDNS to avoid exceeding a POST size limit on postback diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java index e908d4058..13cdd3ac6 100644 --- a/router/java/src/net/i2p/router/RouterVersion.java +++ b/router/java/src/net/i2p/router/RouterVersion.java @@ -15,9 +15,9 @@ import net.i2p.CoreVersion; * */ public class RouterVersion { - public final static String ID = "$Revision: 1.446 $ $Date: 2006-08-21 00:55:34 $"; + public final static String ID = "$Revision: 1.447 $ $Date: 2006-09-03 01:37:47 $"; public final static String VERSION = "0.6.1.24"; - public final static long BUILD = 5; + public final static long BUILD = 6; public static void main(String args[]) { System.out.println("I2P Router version: " + VERSION + "-" + BUILD); System.out.println("Router ID: " + RouterVersion.ID);