Author: toad
Date: 2008-08-27 16:03:09 +0000 (Wed, 27 Aug 2008)
New Revision: 22186
Modified:
branches/db4o/freenet/src/freenet/client/async/ClientRequestSchedulerBase.java
Log:
Track false positives
Modified:
branches/db4o/freenet/src/freenet/client/async/ClientRequestSchedulerBase.java
===================================================================
---
branches/db4o/freenet/src/freenet/client/async/ClientRequestSchedulerBase.java
2008-08-27 16:02:35 UTC (rev 22185)
+++
branches/db4o/freenet/src/freenet/client/async/ClientRequestSchedulerBase.java
2008-08-27 16:03:09 UTC (rev 22186)
@@ -295,7 +295,11 @@
return false;
}
- public void tripPendingKey(Key key, KeyBlock block, ObjectContainer
container, ClientContext context) {
+ private long persistentTruePositives;
+ private long persistentFalsePositives;
+ private long persistentNegatives;
+
+ public boolean tripPendingKey(Key key, KeyBlock block, ObjectContainer
container, ClientContext context) {
byte[] saltedKey = ((key instanceof NodeSSK) ?
context.getSskFetchScheduler() : context.getChkFetchScheduler()).saltKey(key);
ArrayList<KeyListener> matches = null;
synchronized(this) {
@@ -305,9 +309,11 @@
matches.add(listener);
}
}
+ boolean ret = false;
if(matches != null) {
for(KeyListener listener : matches) {
- listener.handleBlock(key, saltedKey, block,
container, context);
+ if(listener.handleBlock(key, saltedKey, block,
container, context))
+ ret = true;
if(listener.isEmpty()) {
synchronized(this) {
keyListeners.remove(listener);
@@ -315,8 +321,63 @@
listener.onRemove();
}
}
+ } else return false;
+ if(ret) {
+ // True positive
+ synchronized(this) {
+ persistentTruePositives++;
+ logFalsePositives("hit");
+ }
+ } else {
+ synchronized(this) {
+ persistentFalsePositives++;
+ logFalsePositives("false");
+ }
}
+ return ret;
}
+
+ synchronized void countNegative() {
+ persistentNegatives++;
+ if(persistentNegatives % 32 == 0)
+ logFalsePositives("neg");
+ }
+
+ private synchronized void logFalsePositives(String phase) {
+ long totalPositives = persistentFalsePositives +
persistentTruePositives;
+ double percent;
+ if(totalPositives > 0)
+ percent = ((double) persistentFalsePositives) /
totalPositives;
+ else
+ percent = 0;
+ if(!(percent > 2 || logMINOR)) return;
+ StringBuilder buf = new StringBuilder();
+ if(persistent())
+ buf.append("Persistent ");
+ else
+ buf.append("Transient ");
+ buf.append("false positives ");
+ buf.append(phase);
+ buf.append(": ");
+
+ if(totalPositives != 0) {
+ buf.append(percent);
+ buf.append("% ");
+ }
+ buf.append("(false=");
+ buf.append(persistentFalsePositives);
+ buf.append(" true=");
+ buf.append(persistentTruePositives);
+ buf.append(" negatives=");
+ buf.append(persistentNegatives);
+ buf.append(')');
+ if(percent > 10)
+ Logger.error(this, buf.toString());
+ else if(percent > 2)
+ Logger.normal(this, buf.toString());
+ else
+ Logger.minor(this, buf.toString());
+ }
public SendableGet[] requestsForKey(Key key, ObjectContainer container,
ClientContext context) {
ArrayList<SendableGet> list = null;