NodeStats(Node node, int sortOrder, SubConfig statsConfig, int obwLimit, int ibwLimit, int lastVersion) throws NodeInitException {
this.node = node;
this.peers = node.peers;
this.hardRandom = node.random;
this.routingMissDistanceLocal = new TimeDecayingRunningAverage(0.0, 180000, 0.0, 1.0, node);
this.routingMissDistanceRemote = new TimeDecayingRunningAverage(0.0, 180000, 0.0, 1.0, node);
this.routingMissDistanceOverall = new TimeDecayingRunningAverage(0.0, 180000, 0.0, 1.0, node);
this.routingMissDistanceBulk = new TimeDecayingRunningAverage(0.0, 180000, 0.0, 1.0, node);
this.routingMissDistanceRT = new TimeDecayingRunningAverage(0.0, 180000, 0.0, 1.0, node);
this.backedOffPercent = new TimeDecayingRunningAverage(0.0, 180000, 0.0, 1.0, node);
preemptiveRejectReasons = new StringCounter();
localPreemptiveRejectReasons = new StringCounter();
pInstantRejectIncomingOverall = new BootstrappingDecayingRunningAverage(0.0, 0.0, 1.0, 1000, null);
pInstantRejectIncomingCHKRequestRT = new BootstrappingDecayingRunningAverage(0.0, 0.0, 1.0, 1000, null);
pInstantRejectIncomingSSKRequestRT = new BootstrappingDecayingRunningAverage(0.0, 0.0, 1.0, 1000, null);
pInstantRejectIncomingCHKInsertRT = new BootstrappingDecayingRunningAverage(0.0, 0.0, 1.0, 1000, null);
pInstantRejectIncomingSSKInsertRT = new BootstrappingDecayingRunningAverage(0.0, 0.0, 1.0, 1000, null);
pInstantRejectIncomingCHKRequestBulk = new BootstrappingDecayingRunningAverage(0.0, 0.0, 1.0, 1000, null);
pInstantRejectIncomingSSKRequestBulk = new BootstrappingDecayingRunningAverage(0.0, 0.0, 1.0, 1000, null);
pInstantRejectIncomingCHKInsertBulk = new BootstrappingDecayingRunningAverage(0.0, 0.0, 1.0, 1000, null);
pInstantRejectIncomingSSKInsertBulk = new BootstrappingDecayingRunningAverage(0.0, 0.0, 1.0, 1000, null);
REJECT_STATS_AVERAGERS = new RunningAverage[] {
pInstantRejectIncomingCHKRequestBulk,
pInstantRejectIncomingSSKRequestBulk,
pInstantRejectIncomingCHKInsertBulk,
pInstantRejectIncomingSSKInsertBulk
};
noisyRejectStats = new byte[4];
ThreadGroup tg = Thread.currentThread().getThreadGroup();
while(tg.getParent() != null) tg = tg.getParent();
this.rootThreadGroup = tg;
throttledPacketSendAverage =
new BootstrappingDecayingRunningAverage(0, 0, Long.MAX_VALUE, 100, null);
throttledPacketSendAverageRT =
new BootstrappingDecayingRunningAverage(0, 0, Long.MAX_VALUE, 100, null);
throttledPacketSendAverageBulk =
new BootstrappingDecayingRunningAverage(0, 0, Long.MAX_VALUE, 100, null);
nodePinger = new NodePinger(node);
previous_input_stat = 0;
previous_output_stat = 0;
previous_io_stat_time = 1;
last_input_stat = 0;
last_output_stat = 0;
last_io_stat_time = 3;
int defaultThreadLimit;
long memoryLimit = NodeStarter.getMemoryLimitMB();
System.out.println("Memory is "+memoryLimit+"MB");
if(memoryLimit > 0 && memoryLimit < 100) {
defaultThreadLimit = 200;
System.out.println("Severe memory pressure, setting 200 thread limit. Freenet may not work well!");
} else if(memoryLimit > 0 && memoryLimit < 128) {
defaultThreadLimit = 300;
System.out.println("Moderate memory pressure, setting 300 thread limit. Increase your memory limit in wrapper.conf if possible.");
} else if(memoryLimit > 0 && memoryLimit < 192) {
defaultThreadLimit = 400;
System.out.println("Setting 400 thread limit due to <=192MB memory limit. This should be enough but more memory is better.");
} else {
System.out.println("Setting standard 500 thread limit. This should be enough for most nodes but more memory is usually a good thing.");
defaultThreadLimit = 500;
}
statsConfig.register("threadLimit", defaultThreadLimit, sortOrder++, true, true, "NodeStat.threadLimit", "NodeStat.threadLimitLong",
new IntCallback() {
@Override
public Integer get() {
return threadLimit;
}
@Override
public void set(Integer val) throws InvalidConfigValueException {
if (get().equals(val))
return;
if(val < 100)
throw new InvalidConfigValueException(l10n("valueTooLow"));
threadLimit = val;
}
},false);
threadLimit = statsConfig.getInt("threadLimit");
// Yes it could be in seconds insteed of multiples of 0.12, but we don't want people to play with it :)
statsConfig.register("aggressiveGC", aggressiveGCModificator, sortOrder++, true, false, "NodeStat.aggressiveGC", "NodeStat.aggressiveGCLong",
new IntCallback() {
@Override
public Integer get() {
return aggressiveGCModificator;
}
@Override
public void set(Integer val) throws InvalidConfigValueException {
if (get().equals(val))
return;
Logger.normal(this, "Changing aggressiveGCModificator to "+val);
aggressiveGCModificator = val;
}
},false);
aggressiveGCModificator = statsConfig.getInt("aggressiveGC");
myMemoryChecker = new MemoryChecker(node.getTicker(), aggressiveGCModificator);
statsConfig.register("memoryChecker", true, sortOrder++, true, false, "NodeStat.memCheck", "NodeStat.memCheckLong",
new BooleanCallback(){
@Override
public Boolean get() {
return myMemoryChecker.isRunning();
}
@Override
public void set(Boolean val) throws InvalidConfigValueException {
if (get().equals(val))
return;
if(val)
myMemoryChecker.start();
else
myMemoryChecker.terminate();
}
});
if(statsConfig.getBoolean("memoryChecker"))
myMemoryChecker.start();
statsConfig.register("ignoreLocalVsRemoteBandwidthLiability", false, sortOrder++, true, false, "NodeStat.ignoreLocalVsRemoteBandwidthLiability", "NodeStat.ignoreLocalVsRemoteBandwidthLiabilityLong", new BooleanCallback() {
@Override
public Boolean get() {
synchronized(NodeStats.this) {
return ignoreLocalVsRemoteBandwidthLiability;
}
}
@Override
public void set(Boolean val) throws InvalidConfigValueException {
synchronized(NodeStats.this) {
ignoreLocalVsRemoteBandwidthLiability = val;
}
}
});
ignoreLocalVsRemoteBandwidthLiability = statsConfig.getBoolean("ignoreLocalVsRemoteBandwidthLiability");
statsConfig.register("maxPingTime", DEFAULT_MAX_PING_TIME, sortOrder++, true, true, "NodeStat.maxPingTime", "NodeStat.maxPingTimeLong", new LongCallback() {
@Override
public Long get() {
return maxPingTime;
}
@Override
public void set(Long val) throws InvalidConfigValueException, NodeNeedRestartException {
maxPingTime = val;
}
}, false);
maxPingTime = statsConfig.getLong("maxPingTime");
statsConfig.register("subMaxPingTime", DEFAULT_SUB_MAX_PING_TIME, sortOrder++, true, true, "NodeStat.subMaxPingTime", "NodeStat.subMaxPingTimeLong", new LongCallback() {
@Override
public Long get() {
return subMaxPingTime;
}
@Override
public void set(Long val) throws InvalidConfigValueException, NodeNeedRestartException {
subMaxPingTime = val;
}
}, false);
subMaxPingTime = statsConfig.getLong("subMaxPingTime");
// This is a *network* level setting, because it affects the rate at which we initiate local
// requests, which could be seen by distant nodes.
node.securityLevels.addNetworkThreatLevelListener(new SecurityLevelListener<NETWORK_THREAT_LEVEL>() {
@Override
public void onChange(NETWORK_THREAT_LEVEL oldLevel, NETWORK_THREAT_LEVEL newLevel) {
if(newLevel == NETWORK_THREAT_LEVEL.MAXIMUM)
ignoreLocalVsRemoteBandwidthLiability = true;
if(oldLevel == NETWORK_THREAT_LEVEL.MAXIMUM)
ignoreLocalVsRemoteBandwidthLiability = false;
// Otherwise leave it as it was. It defaults to false.
}
});
statsConfig.register("enableNewLoadManagementRT", false, sortOrder++, true, false, "Node.enableNewLoadManagementRT", "Node.enableNewLoadManagementRTLong", new BooleanCallback() {
@Override
public Boolean get() {
return enableNewLoadManagementRT;
}
@Override
public void set(Boolean val) throws InvalidConfigValueException,
NodeNeedRestartException {
enableNewLoadManagementRT = val;
}
});
enableNewLoadManagementRT = statsConfig.getBoolean("enableNewLoadManagementRT");
statsConfig.register("enableNewLoadManagementBulk", false, sortOrder++, true, false, "Node.enableNewLoadManagementBulk", "Node.enableNewLoadManagementBulkLong", new BooleanCallback() {
@Override
public Boolean get() {
return enableNewLoadManagementBulk;
}
@Override
public void set(Boolean val) throws InvalidConfigValueException,
NodeNeedRestartException {
enableNewLoadManagementBulk = val;
}
});
enableNewLoadManagementBulk = statsConfig.getBoolean("enableNewLoadManagementBulk");
if(node.lastVersion <= 1455 && (enableNewLoadManagementRT || enableNewLoadManagementBulk)) {
// FIXME remove
enableNewLoadManagementRT = false;
enableNewLoadManagementBulk = false;
System.err.println("Turning off NLM when upgrading from pre-1455. The load stats messages aren't being sent at the moment so it won't work anyway.");
statsConfig.config.store();
}
persister = new ConfigurablePersister(this, statsConfig, "nodeThrottleFile", "node-throttle.dat", sortOrder++, true, false,
"NodeStat.statsPersister", "NodeStat.statsPersisterLong", node.ticker, node.getRunDir());
SimpleFieldSet throttleFS = persister.read();
if(logMINOR) Logger.minor(this, "Read throttleFS:\n"+throttleFS);
// Guesstimates. Hopefully well over the reality.
localChkFetchBytesSentAverage = new TimeDecayingRunningAverage(500, 180000, 0.0, 200*1024, throttleFS == null ? null : throttleFS.subset("LocalChkFetchBytesSentAverage"), node);
localSskFetchBytesSentAverage = new TimeDecayingRunningAverage(500, 180000, 0.0, 200*1024, throttleFS == null ? null : throttleFS.subset("LocalSskFetchBytesSentAverage"), node);
localChkInsertBytesSentAverage = new TimeDecayingRunningAverage(32768, 180000, 0.0, 200*1024, throttleFS == null ? null : throttleFS.subset("LocalChkInsertBytesSentAverage"), node);
localSskInsertBytesSentAverage = new TimeDecayingRunningAverage(2048, 180000, 0.0, 200*1024, throttleFS == null ? null : throttleFS.subset("LocalSskInsertBytesSentAverage"), node);
localChkFetchBytesReceivedAverage = new TimeDecayingRunningAverage(32768+2048/*path folding*/, 180000, 0.0, 200*1024, throttleFS == null ? null : throttleFS.subset("LocalChkFetchBytesReceivedAverage"), node);
localSskFetchBytesReceivedAverage = new TimeDecayingRunningAverage(2048, 180000, 0.0, 200*1024, throttleFS == null ? null : throttleFS.subset("LocalSskFetchBytesReceivedAverage"), node);
localChkInsertBytesReceivedAverage = new TimeDecayingRunningAverage(1024, 180000, 0.0, 200*1024, throttleFS == null ? null : throttleFS.subset("LocalChkInsertBytesReceivedAverage"), node);
localSskInsertBytesReceivedAverage = new TimeDecayingRunningAverage(500, 180000, 0.0, 200*1024, throttleFS == null ? null : throttleFS.subset("LocalChkInsertBytesReceivedAverage"), node);
remoteChkFetchBytesSentAverage = new TimeDecayingRunningAverage(32768+1024+500+2048/*path folding*/, 180000, 0.0, 200*1024, throttleFS == null ? null : throttleFS.subset("RemoteChkFetchBytesSentAverage"), node);
remoteSskFetchBytesSentAverage = new TimeDecayingRunningAverage(1024+1024+500, 180000, 0.0, 200*1024, throttleFS == null ? null : throttleFS.subset("RemoteSskFetchBytesSentAverage"), node);
remoteChkInsertBytesSentAverage = new TimeDecayingRunningAverage(32768+32768+1024, 180000, 0.0, 200*1024, throttleFS == null ? null : throttleFS.subset("RemoteChkInsertBytesSentAverage"), node);
remoteSskInsertBytesSentAverage = new TimeDecayingRunningAverage(1024+1024+500, 180000, 0.0, 200*1024, throttleFS == null ? null : throttleFS.subset("RemoteSskInsertBytesSentAverage"), node);
remoteChkFetchBytesReceivedAverage = new TimeDecayingRunningAverage(32768+1024+500+2048/*path folding*/, 180000, 0.0, 200*1024, throttleFS == null ? null : throttleFS.subset("RemoteChkFetchBytesReceivedAverage"), node);
remoteSskFetchBytesReceivedAverage = new TimeDecayingRunningAverage(2048+500, 180000, 0.0, 200*1024, throttleFS == null ? null : throttleFS.subset("RemoteSskFetchBytesReceivedAverage"), node);
remoteChkInsertBytesReceivedAverage = new TimeDecayingRunningAverage(32768+1024+500, 180000, 0.0, 200*1024, throttleFS == null ? null : throttleFS.subset("RemoteChkInsertBytesReceivedAverage"), node);
remoteSskInsertBytesReceivedAverage = new TimeDecayingRunningAverage(1024+1024+500, 180000, 0.0, 200*1024, throttleFS == null ? null : throttleFS.subset("RemoteSskInsertBytesReceivedAverage"), node);
successfulChkFetchBytesSentAverage = new TimeDecayingRunningAverage(32768+1024+500+2048/*path folding*/, 180000, 0.0, 200*1024, throttleFS == null ? null : throttleFS.subset("SuccessfulChkFetchBytesSentAverage"), node);
successfulSskFetchBytesSentAverage = new TimeDecayingRunningAverage(1024+1024+500, 180000, 0.0, 200*1024, throttleFS == null ? null : throttleFS.subset("SuccessfulSskFetchBytesSentAverage"), node);
successfulChkInsertBytesSentAverage = new TimeDecayingRunningAverage(32768+32768+1024, 180000, 0.0, 200*1024, throttleFS == null ? null : throttleFS.subset("SuccessfulChkInsertBytesSentAverage"), node);
successfulSskInsertBytesSentAverage = new TimeDecayingRunningAverage(1024+1024+500, 180000, 0.0, 200*1024, throttleFS == null ? null : throttleFS.subset("SuccessfulSskInsertBytesSentAverage"), node);
successfulChkOfferReplyBytesSentAverage = new TimeDecayingRunningAverage(32768+500, 180000, 0.0, 200*1024, throttleFS == null ? null : throttleFS.subset("successfulChkOfferReplyBytesSentAverage"), node);
successfulSskOfferReplyBytesSentAverage = new TimeDecayingRunningAverage(3072, 180000, 0.0, 200*1024, throttleFS == null ? null : throttleFS.subset("successfulSskOfferReplyBytesSentAverage"), node);
successfulChkFetchBytesReceivedAverage = new TimeDecayingRunningAverage(32768+1024+500+2048/*path folding*/, 180000, 0.0, 200*1024, throttleFS == null ? null : throttleFS.subset("SuccessfulChkFetchBytesReceivedAverage"), node);
successfulSskFetchBytesReceivedAverage = new TimeDecayingRunningAverage(2048+500, 180000, 0.0, 200*1024, throttleFS == null ? null : throttleFS.subset("SuccessfulSskFetchBytesReceivedAverage"), node);
successfulChkInsertBytesReceivedAverage = new TimeDecayingRunningAverage(32768+1024+500, 180000, 0.0, 200*1024, throttleFS == null ? null : throttleFS.subset("SuccessfulChkInsertBytesReceivedAverage"), node);
successfulSskInsertBytesReceivedAverage = new TimeDecayingRunningAverage(1024+1024+500, 180000, 0.0, 200*1024, throttleFS == null ? null : throttleFS.subset("SuccessfulSskInsertBytesReceivedAverage"), node);
successfulChkOfferReplyBytesReceivedAverage = new TimeDecayingRunningAverage(32768+500, 180000, 0.0, 200*1024, throttleFS == null ? null : throttleFS.subset("successfulChkOfferReplyBytesReceivedAverage"), node);
successfulSskOfferReplyBytesReceivedAverage = new TimeDecayingRunningAverage(3072, 180000, 0.0, 200*1024, throttleFS == null ? null : throttleFS.subset("successfulSskOfferReplyBytesReceivedAverage"), node);
globalFetchPSuccess = new TrivialRunningAverage();
chkLocalFetchPSuccess = new TrivialRunningAverage();
chkRemoteFetchPSuccess = new TrivialRunningAverage();
sskLocalFetchPSuccess = new TrivialRunningAverage();