package se.sics.gvod.ls.video.snapshot;
import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.XmlRootElement;
import se.sics.gvod.net.VodAddress;
import se.sics.gvod.net.VodAddress.NatType;
/**
* Bean for storing and sending statistics about a Video instance (a node).
*
* @author Niklas Wahlén <nwahlen@kth.se>
*/
@XmlRootElement
public class Stats implements StatsIntf {
// Experiment identification
private int experimentId;
private int experimentIteration;
private volatile int step;
// Node identification
private int overlayId;
private int nodeId;
// Node properties
private boolean source;
private VodAddress.NatType natType;
private int asn;
// Neighbour connections messages
private volatile int connectionRequestsSentClose;
private volatile int connectionRequestsSentRandom;
private volatile int connectionRequestTimeoutsClose;
private volatile int connectionRequestTimeoutsRandom;
private volatile int connectionResponsesReceivedClose;
private volatile int connectionResponsesReceivedRandom;
// Neighbour disconncetion messages
private volatile int disconnectsSentClose;
private volatile int disconnectsSentRandom;
private volatile int disconnectsReceivedClose;
private volatile int disconnectsReceivedRandom;
// Neighbour connections
private volatile int ingoingConnectionsClose;
private volatile int ingoingConnectionsRandom;
private volatile int outgoingConnectionsClose;
private volatile int outgoingConnectionsRandom;
private volatile float avgAsHopsToNeighbours;
private List<VodAddress> neighbours = new ArrayList<VodAddress>();
// Video content
private volatile int seenSubPieces;
private int subPieceRequestTimeouts;
private volatile int completePieces;
private volatile int highestCompletePiece = 0;
private volatile int downloadedSubPiecesIntraAs;
private volatile int downloadedSubPiecesNeighbourAs;
private volatile int downloadedSubPiecesOtherAs;
private volatile int sentSubPiecesIntraAs;
private volatile int sentSubPiecesNeighbourAs;
private volatile int sentSubPiecesOtherAs;
private short fanout;
private List<Integer> pieceStats = new ArrayList<Integer>();
// Playback
private int dlBwBytes;
private int ulBwBytes;
private int streamRate;
private int streamLag;
private volatile int bufferLength;
private volatile int missedPieces;
//-------------------------------------------------------------------
public Stats() {
}
public Stats(int nodeId, int overlayId, boolean source) {
this.nodeId = nodeId;
this.overlayId = overlayId;
this.source = source;
}
/*
* Experiment identification
*/
@Override
public int getExperimentId() {
return experimentId;
}
public void setExperimentId(int experimentId) {
this.experimentId = experimentId;
}
@Override
public int getExperimentIteration() {
return experimentIteration;
}
public void setExperimentIteration(int experimentIteration) {
this.experimentIteration = experimentIteration;
}
@Override
public int getStep() {
return step;
}
public void setStep(int step) {
this.step = step;
}
/*
* Node identification
*/
public void setNodeId(int nodeId) {
this.nodeId = nodeId;
}
@Override
public int getNodeId() {
return nodeId;
}
public void setOverlayId(int overlayId) {
this.overlayId = overlayId;
}
@Override
public int getOverlayId() {
return overlayId;
}
/*
* Node properties
*/
public void setSource(boolean source) {
this.source = source;
}
@Override
public boolean isSource() {
return source;
}
public void setNatType(NatType natType) {
this.natType = natType;
}
@Override
public VodAddress.NatType getNatType() {
return natType;
}
/*
* NEIGHBOUR CONNECTION MESSAGES
*/
@Override
public int getConnectionRequestTimeoutsClose() {
return connectionRequestTimeoutsClose;
}
public void incConnectionRequestTimeoutsClose() {
connectionRequestTimeoutsClose++;
}
public void setConnectionRequestTimeoutsClose(int connectionRequestTimeoutsClose) {
this.connectionRequestTimeoutsClose = connectionRequestTimeoutsClose;
}
@Override
public int getConnectionRequestTimeoutsRandom() {
return connectionRequestTimeoutsRandom;
}
public void incConnectionRequestTimeoutsRandom() {
connectionRequestTimeoutsRandom++;
}
public void setConnectionRequestTimeoutsRandom(int connectionRequestTimeoutsRandom) {
this.connectionRequestTimeoutsRandom = connectionRequestTimeoutsRandom;
}
@Override
public int getConnectionRequestsSentClose() {
return connectionRequestsSentClose;
}
public void incConnectionRequestsSentClose() {
connectionRequestsSentClose++;
}
public void setConnectionRequestsSentClose(int connectionRequestsSentClose) {
this.connectionRequestsSentClose = connectionRequestsSentClose;
}
@Override
public int getConnectionRequestsSentRandom() {
return connectionRequestsSentRandom;
}
public void incConnectionRequestsSentRandom() {
connectionRequestsSentRandom++;
}
public void setConnectionRequestsSentRandom(int connectionRequestsSentRandom) {
this.connectionRequestsSentRandom = connectionRequestsSentRandom;
}
@Override
public int getConnectionResponsesReceivedClose() {
return connectionResponsesReceivedClose;
}
public void incConnectionResponsesReceivedClose() {
connectionResponsesReceivedClose++;
}
public void setConnectionResponsesReceivedClose(int connectionResponsesReceivedClose) {
this.connectionResponsesReceivedClose = connectionResponsesReceivedClose;
}
@Override
public int getConnectionResponsesReceivedRandom() {
return connectionResponsesReceivedRandom;
}
public void incConnectionResponsesReceivedRandom() {
connectionResponsesReceivedRandom++;
}
public void setConnectionResponsesReceivedRandom(int connectionResponsesReceivedRandom) {
this.connectionResponsesReceivedRandom = connectionResponsesReceivedRandom;
}
/*
* NEIGHBOUR DISCONNECTION MESSAGES
*/
@Override
public int getDisconnectsReceivedClose() {
return disconnectsReceivedClose;
}
public void incDisconnectsReceivedClose() {
disconnectsReceivedClose++;
}
public void setDisconnectsReceivedClose(int disconnectsReceivedClose) {
this.disconnectsReceivedClose = disconnectsReceivedClose;
}
@Override
public int getDisconnectsReceivedRandom() {
return disconnectsReceivedRandom;
}
public void incDisconnectsReceivedRandom() {
disconnectsReceivedRandom++;
}
public void setDisconnectsReceivedRandom(int disconnectsReceivedRandom) {
this.disconnectsReceivedRandom = disconnectsReceivedRandom;
}
@Override
public int getDisconnectsSentClose() {
return disconnectsSentClose;
}
public void incDisconnectsSentClose() {
disconnectsSentClose++;
}
public void setDisconnectsSentClose(int disconnectsSentClose) {
this.disconnectsSentClose = disconnectsSentClose;
}
@Override
public int getDisconnectsSentRandom() {
return disconnectsSentRandom;
}
public void incDisconnectsSentRandom() {
disconnectsSentRandom++;
}
public void setDisconnectsSentRandom(int disconnectsSentRandom) {
this.disconnectsSentRandom = disconnectsSentRandom;
}
/*
* NEIGHBOUR CONNECTIONS
*/
@Override
public int getIngoingConnectionsClose() {
return ingoingConnectionsClose;
}
public void setIngoingConnectionsClose(int ingoingConnectionsClose) {
this.ingoingConnectionsClose = ingoingConnectionsClose;
}
@Override
public int getIngoingConnectionsRandom() {
return ingoingConnectionsRandom;
}
public void setIngoingConnectionsRandom(int ingoingConnectionsRandom) {
this.ingoingConnectionsRandom = ingoingConnectionsRandom;
}
@Override
public int getOutgoingConnectionsClose() {
return outgoingConnectionsClose;
}
public void setOutgoingConnectionsClose(int outgoingConnectionsClose) {
this.outgoingConnectionsClose = outgoingConnectionsClose;
}
@Override
public int getOutgoingConnectionsRandom() {
return outgoingConnectionsRandom;
}
public void setOutgoingConnectionsRandom(int outgoingConnectionsRandom) {
this.outgoingConnectionsRandom = outgoingConnectionsRandom;
}
@Override
public float getAvgAsHopsToNeighbours() {
return avgAsHopsToNeighbours;
}
public void setAvgAsHopsToNeighbours(float avgAsHopsToNeighbours) {
this.avgAsHopsToNeighbours = avgAsHopsToNeighbours;
}
@Override
public List<VodAddress> getNeighbours() {
return neighbours;
}
public void setNeighbours(List<VodAddress> neighbours) {
this.neighbours = neighbours;
}
/*
* VIDEO CONTENT
*/
@Override
public int getCompletePieces() {
return completePieces;
}
public void incCompletePieces() {
completePieces++;
}
public void setCompletePieces(int completePieces) {
this.completePieces = completePieces;
}
@Override
public int getHighestCompletePiece() {
return highestCompletePiece;
}
public void setHighestCompletePiece(int highestCompletePiece) {
this.highestCompletePiece = highestCompletePiece;
}
@Override
public int getSeenSubPieces() {
return seenSubPieces;
}
public void incSeenSubPieces() {
seenSubPieces++;
}
public void setSeenSubPieces(int seenSubPieces) {
this.seenSubPieces = seenSubPieces;
}
@Override
public int getDownloadedSubPiecesIntraAs() {
return downloadedSubPiecesIntraAs;
}
public void incDownloadedSubPiecesIntraAs() {
downloadedSubPiecesIntraAs++;
}
public void setDownloadedSubPiecesIntraAs(int downloadedSubPiecesIntraAs) {
this.downloadedSubPiecesIntraAs = downloadedSubPiecesIntraAs;
}
@Override
public int getDownloadedSubPiecesNeighbourAs() {
return downloadedSubPiecesNeighbourAs;
}
public void incDownloadedSubPiecesNeighbourAs() {
downloadedSubPiecesNeighbourAs++;
}
public void setDownloadedSubPiecesNeighbourAs(int downloadedSubPiecesNeighbourAs) {
this.downloadedSubPiecesNeighbourAs = downloadedSubPiecesNeighbourAs;
}
@Override
public int getDownloadedSubPiecesOtherAs() {
return downloadedSubPiecesOtherAs;
}
public void incDownloadedSubPiecesOtherAs() {
downloadedSubPiecesOtherAs++;
}
public void setDownloadedSubPiecesOtherAs(int downloadedSubPiecesOtherAs) {
this.downloadedSubPiecesOtherAs = downloadedSubPiecesOtherAs;
}
@Override
public int getSentSubPiecesIntraAs() {
return sentSubPiecesIntraAs;
}
public void incSentSubPiecesIntraAs() {
sentSubPiecesIntraAs++;
}
public void setSentSubPiecesIntraAs(int sentSubPiecesIntraAs) {
this.sentSubPiecesIntraAs = sentSubPiecesIntraAs;
}
@Override
public int getSentSubPiecesNeighbourAs() {
return sentSubPiecesNeighbourAs;
}
public void incSentSubPiecesNeighbourAs() {
sentSubPiecesNeighbourAs++;
}
public void setSentSubPiecesNeighbourAs(int sentSubPiecesNeighbourAs) {
this.sentSubPiecesNeighbourAs = sentSubPiecesNeighbourAs;
}
@Override
public int getSentSubPiecesOtherAs() {
return sentSubPiecesOtherAs;
}
public void incSentSubPiecesOtherAs() {
sentSubPiecesOtherAs++;
}
public void setSentSubPiecesOtherAs(int sentSubPiecesOtherAs) {
this.sentSubPiecesOtherAs = sentSubPiecesOtherAs;
}
@Override
public List<Integer> getPieceStats() {
return pieceStats;
}
public void setPieceStats(List<Integer> pieceStats) {
this.pieceStats = pieceStats;
}
public void setCompletedPiece(int pieceId) {
if (!pieceStats.contains(pieceId)) {
pieceStats.add(pieceId);
incCompletePieces();
if (highestCompletePiece < pieceId) {
highestCompletePiece = pieceId;
}
}
}
/*
* PLAYBACK
*/
@Override
public int getBufferLength() {
return bufferLength;
}
public void setBufferLength(int bufferLength) {
this.bufferLength = bufferLength;
}
@Override
public int getMissedPieces() {
return missedPieces;
}
public void incMissedPieces() {
missedPieces++;
}
public void setMissedPieces(int missedPieces) {
this.missedPieces = missedPieces;
}
@Override
public int getAsn() {
return asn;
}
public void setAsn(int asn) {
this.asn = asn;
}
@Override
public int getDlBwBytes() {
return dlBwBytes;
}
public void setDlBwBytes(int dlBwBytes) {
this.dlBwBytes = dlBwBytes;
}
@Override
public short getFanout() {
return fanout;
}
public void setFanout(short fanout) {
this.fanout = fanout;
}
@Override
public int getStreamRate() {
return streamRate;
}
public void setStreamRate(int streamRate) {
this.streamRate = streamRate;
}
public int getStreamLag() {
return streamLag;
}
public void setStreamLag(int streamLag) {
this.streamLag = streamLag;
}
@Override
public int getSubPieceRequestTimeouts() {
return subPieceRequestTimeouts;
}
public void incSubPieceRequestTimeouts() {
subPieceRequestTimeouts++;
}
public void setSubPieceRequestTimeouts(int subPieceRequestTimeouts) {
this.subPieceRequestTimeouts = subPieceRequestTimeouts;
}
@Override
public int getUlBwBytes() {
return ulBwBytes;
}
public void setUlBwBytes(int ulBwBytes) {
this.ulBwBytes = ulBwBytes;
}
public String toString() {
return "Peer : nat(" + this.natType + ")";
}
}