diff --git a/apps/i2psnark/java/src/org/klomp/snark/PeerCheckerTask.java b/apps/i2psnark/java/src/org/klomp/snark/PeerCheckerTask.java index 78efa094e9..8827189710 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 4ab21b14b0..cafc7bf6a6 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 c99494b245..66505c2a0e 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("