/*
* PeerMonitorTasks - TimerTask that monitors the peers and total up/down speed
* Copyright (C) 2003 Mark J. Wielaard
*
* This file is part of Snark.
*
* This program is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License as published by the Free Software
* Foundation; either version 2, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License along with
* this program; if not, write to the Free Software Foundation, Inc., 59 Temple
* Place - Suite 330, Boston, MA 02111-1307, USA.
*/
package org.klomp.snark;
import java.util.Iterator;
import java.util.TimerTask;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* TimerTask that monitors the peers and total up/download speeds. Works
* together with the main Snark class to report periodical statistics.
*/
public class PeerMonitorTask extends TimerTask
{
public static final long MONITOR_PERIOD = 10 * 1000; // Ten seconds.
private static final long KILOPERSECOND = 1024 * (MONITOR_PERIOD / 1000);
private final PeerCoordinator coordinator;
private long lastDownloaded = 0;
private long lastUploaded = 0;
public PeerMonitorTask (PeerCoordinator coordinator)
{
this.coordinator = coordinator;
}
@Override
public void run ()
{
// Get some statistics
int peers = 0;
int uploaders = 0;
int downloaders = 0;
int interested = 0;
int interesting = 0;
int choking = 0;
int choked = 0;
synchronized (coordinator.peers) {
Iterator it = coordinator.peers.iterator();
while (it.hasNext()) {
Peer peer = (Peer)it.next();
// Don't list dying peers
if (!peer.isConnected()) {
continue;
}
peers++;
if (!peer.isChoking()) {
uploaders++;
}
if (!peer.isChoked() && peer.isInteresting()) {
downloaders++;
}
if (peer.isInterested()) {
interested++;
}
if (peer.isInteresting()) {
interesting++;
}
if (peer.isChoking()) {
choking++;
}
if (peer.isChoked()) {
choked++;
}
}
}
// Print some statistics
long downloaded = coordinator.getDownloaded();
String totalDown;
if (downloaded >= 10 * 1024 * 1024) {
totalDown = (downloaded / (1024 * 1024)) + "MB";
} else {
totalDown = (downloaded / 1024) + "KB";
}
long uploaded = coordinator.getUploaded();
String totalUp;
if (uploaded >= 10 * 1024 * 1024) {
totalUp = (uploaded / (1024 * 1024)) + "MB";
} else {
totalUp = (uploaded / 1024) + "KB";
}
int needP = coordinator.storage.needed();
long needMB = needP * coordinator.metainfo.getPieceLength(0)
/ (1024 * 1024);
int totalP = coordinator.metainfo.getPieces();
long totalMB = coordinator.metainfo.getTotalLength() / (1024 * 1024);
log.log(Level.INFO, "Down: " + (downloaded - lastDownloaded)
/ KILOPERSECOND + "KB/s" + " (" + totalDown + ")" + " Up: "
+ (uploaded - lastUploaded) / KILOPERSECOND + "KB/s" + " ("
+ totalUp + ")" + " Need " + needP + " (" + needMB + "MB)" + " of "
+ totalP + " (" + totalMB + "MB)" + " pieces");
log.log(Level.INFO, peers + ": Download #" + downloaders + " Upload #"
+ uploaders + " Interested #" + interested + " Interesting #"
+ interesting + " Choking #" + choking + " Choked #" + choked);
lastDownloaded = downloaded;
lastUploaded = uploaded;
}
/** The Java logger used to process our log events. */
protected static final Logger log = Logger.getLogger("org.klomp.snark.status");
}