* RoutingKeyModifier: Several changes to ensure the routing key

is correctly changed just after midnight.
This commit is contained in:
zzz
2012-05-20 18:20:48 +00:00
parent 6972d9d02b
commit c2e39687e6
5 changed files with 42 additions and 24 deletions

View File

@ -16,6 +16,7 @@ import java.text.DecimalFormat; // debug
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.Comparator; import java.util.Comparator;
import java.util.Date;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
@ -187,7 +188,8 @@ public class NetDbRenderer {
FloodfillNetworkDatabaseFacade netdb = (FloodfillNetworkDatabaseFacade)_context.netDb(); FloodfillNetworkDatabaseFacade netdb = (FloodfillNetworkDatabaseFacade)_context.netDb();
buf.append("<p><b>Total Leasesets: ").append(leases.size()); buf.append("<p><b>Total Leasesets: ").append(leases.size());
buf.append("</b></p><p><b>Published (RAP) Leasesets: ").append(netdb.getKnownLeaseSets()); buf.append("</b></p><p><b>Published (RAP) Leasesets: ").append(netdb.getKnownLeaseSets());
//buf.append("</b></p><p><b>Mod Data: " + HexDump.dump(_context.routingKeyGenerator().getModData())); buf.append("</b></p><p><b>Mod Data: \"").append(DataHelper.getUTF8(_context.routingKeyGenerator().getModData()))
.append("\" Last Changed: ").append(new Date(_context.routingKeyGenerator().getLastChanged()));
int ff = _context.peerManager().getPeersByCapability(FloodfillNetworkDatabaseFacade.CAPABILITY_FLOODFILL).size(); int ff = _context.peerManager().getPeersByCapability(FloodfillNetworkDatabaseFacade.CAPABILITY_FLOODFILL).size();
buf.append("</b></p><p><b>Known Floodfills: ").append(ff); buf.append("</b></p><p><b>Known Floodfills: ").append(ff);
buf.append("</b></p><p><b>Currently Floodfill? "); buf.append("</b></p><p><b>Currently Floodfill? ");
@ -201,6 +203,8 @@ public class NetDbRenderer {
int total = (int) Math.round(Math.pow(2, 3 + 256 - 1 - log2)); int total = (int) Math.round(Math.pow(2, 3 + 256 - 1 - log2));
buf.append("</b></p><p><b>Estimated total floodfills: ").append(total); buf.append("</b></p><p><b>Estimated total floodfills: ").append(total);
buf.append("</b></p><p><b>Estimated total leasesets: ").append(total * rapCount / 8); buf.append("</b></p><p><b>Estimated total leasesets: ").append(total * rapCount / 8);
} else {
buf.append("</b></p><p><b>Not floodfill or no data");
} }
buf.append("</b></p>"); buf.append("</b></p>");
} }

View File

@ -45,14 +45,16 @@ public class RoutingKeyGenerator {
public RoutingKeyGenerator(I2PAppContext context) { public RoutingKeyGenerator(I2PAppContext context) {
_log = context.logManager().getLog(RoutingKeyGenerator.class); _log = context.logManager().getLog(RoutingKeyGenerator.class);
_context = context; _context = context;
// ensure non-null mod data
generateDateBasedModData();
} }
public static RoutingKeyGenerator getInstance() { public static RoutingKeyGenerator getInstance() {
return I2PAppContext.getGlobalContext().routingKeyGenerator(); return I2PAppContext.getGlobalContext().routingKeyGenerator();
} }
private byte _currentModData[]; private volatile byte _currentModData[];
private long _lastChanged; private volatile long _lastChanged;
private final static Calendar _cal = GregorianCalendar.getInstance(TimeZone.getTimeZone("GMT")); private final static Calendar _cal = GregorianCalendar.getInstance(TimeZone.getTimeZone("GMT"));
private final static SimpleDateFormat _fmt = new SimpleDateFormat("yyyyMMdd"); private final static SimpleDateFormat _fmt = new SimpleDateFormat("yyyyMMdd");
@ -65,17 +67,13 @@ public class RoutingKeyGenerator {
return _lastChanged; return _lastChanged;
} }
public void setModData(byte modData[]) {
_currentModData = modData;
_lastChanged = _context.clock().now();
}
/** /**
* Update the current modifier data with some bytes derived from the current * Update the current modifier data with some bytes derived from the current
* date (yyyyMMdd in GMT) * date (yyyyMMdd in GMT)
* *
* @return true if changed
*/ */
public void generateDateBasedModData() { public synchronized boolean generateDateBasedModData() {
Date today = null; Date today = null;
long now = _context.clock().now(); long now = _context.clock().now();
synchronized (_cal) { synchronized (_cal) {
@ -89,17 +87,18 @@ public class RoutingKeyGenerator {
today = _cal.getTime(); today = _cal.getTime();
} }
byte mod[] = null; String modVal = _fmt.format(today);
String modVal = null; byte[] mod = new byte[modVal.length()];
synchronized (_fmt) {
modVal = _fmt.format(today);
}
mod = new byte[modVal.length()];
for (int i = 0; i < modVal.length(); i++) for (int i = 0; i < modVal.length(); i++)
mod[i] = (byte)(modVal.charAt(i) & 0xFF); mod[i] = (byte)(modVal.charAt(i) & 0xFF);
if (_log.shouldLog(Log.INFO)) boolean changed = !DataHelper.eq(_currentModData, mod);
_log.info("Routing modifier generated: " + modVal); if (changed) {
setModData(mod); _currentModData = mod;
_lastChanged = now;
if (_log.shouldLog(Log.INFO))
_log.info("Routing modifier generated: " + modVal);
}
return changed;
} }
/** /**
@ -113,7 +112,6 @@ public class RoutingKeyGenerator {
*/ */
public Hash getRoutingKey(Hash origKey) { public Hash getRoutingKey(Hash origKey) {
if (origKey == null) throw new IllegalArgumentException("Original key is null"); if (origKey == null) throw new IllegalArgumentException("Original key is null");
if (_currentModData == null) generateDateBasedModData();
byte modVal[] = new byte[Hash.HASH_LENGTH + _currentModData.length]; byte modVal[] = new byte[Hash.HASH_LENGTH + _currentModData.length];
System.arraycopy(origKey.getData(), 0, modVal, 0, Hash.HASH_LENGTH); System.arraycopy(origKey.getData(), 0, modVal, 0, Hash.HASH_LENGTH);
System.arraycopy(_currentModData, 0, modVal, Hash.HASH_LENGTH, _currentModData.length); System.arraycopy(_currentModData, 0, modVal, Hash.HASH_LENGTH, _currentModData.length);

View File

@ -1,3 +1,14 @@
2012-05-20 zzz
* Console: Add full file path to thread dump message
* i2psnark:
- Create sparse files at torrent creation and delay
"ballooning" until first write (ticket #641)
- Redo clear messages button
- Concurrent message queue
* Profiles: reduce same-country bonus
* RoutingKeyModifier: Several changes to ensure the routing key
is correctly changed just after midnight.
2012-05-19 zzz 2012-05-19 zzz
* i2psnark: * i2psnark:
- Store received chunks in temp files - Store received chunks in temp files

View File

@ -18,7 +18,7 @@ public class RouterVersion {
/** deprecated */ /** deprecated */
public final static String ID = "Monotone"; public final static String ID = "Monotone";
public final static String VERSION = CoreVersion.VERSION; public final static String VERSION = CoreVersion.VERSION;
public final static long BUILD = 2; public final static long BUILD = 3;
/** for example "-test" */ /** for example "-test" */
public final static String EXTRA = ""; public final static String EXTRA = "";

View File

@ -25,19 +25,24 @@ import net.i2p.util.Log;
* @since 0.8.12 moved from Router.java * @since 0.8.12 moved from Router.java
*/ */
public class UpdateRoutingKeyModifierJob extends JobImpl { public class UpdateRoutingKeyModifierJob extends JobImpl {
private Log _log; private final Log _log;
private Calendar _cal = new GregorianCalendar(TimeZone.getTimeZone("GMT")); private final Calendar _cal = new GregorianCalendar(TimeZone.getTimeZone("GMT"));
// Run every 15 minutes in case of time zone change, clock skew, etc.
private static final long MAX_DELAY_FAILSAFE = 15*60*1000;
public UpdateRoutingKeyModifierJob(RouterContext ctx) { public UpdateRoutingKeyModifierJob(RouterContext ctx) {
super(ctx); super(ctx);
_log = ctx.logManager().getLog(getClass());
} }
public String getName() { return "Update Routing Key Modifier"; } public String getName() { return "Update Routing Key Modifier"; }
public void runJob() { public void runJob() {
_log = getContext().logManager().getLog(getClass()); // make sure we requeue quickly if just before midnight
long delay = Math.min(MAX_DELAY_FAILSAFE, getTimeTillMidnight());
// TODO tell netdb if mod data changed?
getContext().routingKeyGenerator().generateDateBasedModData(); getContext().routingKeyGenerator().generateDateBasedModData();
requeue(getTimeTillMidnight()); requeue(delay);
} }
private long getTimeTillMidnight() { private long getTimeTillMidnight() {