Author: toad
Date: 2008-04-12 16:08:38 +0000 (Sat, 12 Apr 2008)
New Revision: 19247
Modified:
trunk/freenet/src/freenet/keys/NodeCHK.java
trunk/freenet/src/freenet/keys/NodeSSK.java
trunk/freenet/src/freenet/store/BerkeleyDBFreenetStore.java
trunk/freenet/src/freenet/store/CHKStore.java
trunk/freenet/src/freenet/store/PubkeyStore.java
trunk/freenet/src/freenet/store/SSKStore.java
trunk/freenet/src/freenet/store/StoreCallback.java
Log:
Use the keys in the .keys file to reconstruct lazily (fetch will check that
they are correct).
Once we have full .keys files, this should greatly accelerate reconstruction.
Modified: trunk/freenet/src/freenet/keys/NodeCHK.java
===================================================================
--- trunk/freenet/src/freenet/keys/NodeCHK.java 2008-04-12 15:52:36 UTC (rev
19246)
+++ trunk/freenet/src/freenet/keys/NodeCHK.java 2008-04-12 16:08:38 UTC (rev
19247)
@@ -8,6 +8,7 @@
import java.io.DataOutputStream;
import java.io.IOException;
import freenet.support.Base64;
+import freenet.support.Logger;
/**
* @author amphibian
@@ -83,4 +84,14 @@
System.arraycopy(routingKey, 0, buf, 2, routingKey.length);
return buf;
}
+
+ public static byte[] routingKeyFromFullKey(byte[] keyBuf) {
+ if(keyBuf.length == KEY_LENGTH) return keyBuf;
+ if(keyBuf.length != FULL_KEY_LENGTH) {
+ Logger.error(NodeCHK.class, "routingKeyFromFullKey() on
"+keyBuf.length+" bytes");
+ }
+ byte[] out = new byte[KEY_LENGTH];
+ System.arraycopy(keyBuf, 2, out, 0, KEY_LENGTH);
+ return out;
+ }
}
Modified: trunk/freenet/src/freenet/keys/NodeSSK.java
===================================================================
--- trunk/freenet/src/freenet/keys/NodeSSK.java 2008-04-12 15:52:36 UTC (rev
19246)
+++ trunk/freenet/src/freenet/keys/NodeSSK.java 2008-04-12 16:08:38 UTC (rev
19247)
@@ -193,5 +193,16 @@
pubKey = pubkeyCache.getKey(pubKeyHash);
return pubKey != null;
}
+
+ public static byte[] routingKeyFromFullKey(byte[] keyBuf) {
+ if(keyBuf.length != FULL_KEY_LENGTH) {
+ Logger.error(NodeSSK.class, "routingKeyFromFullKey() on
buffer length "+keyBuf.length);
+ }
+ byte[] encryptedHashedDocname = new byte[E_H_DOCNAME_SIZE];
+ byte[] pubKeyHash = new byte[PUBKEY_HASH_SIZE];
+ System.arraycopy(keyBuf, 2, encryptedHashedDocname, 0,
E_H_DOCNAME_SIZE);
+ System.arraycopy(keyBuf, 2+E_H_DOCNAME_SIZE, pubKeyHash, 0,
PUBKEY_HASH_SIZE);
+ return makeRoutingKey(pubKeyHash, encryptedHashedDocname);
+ }
}
Modified: trunk/freenet/src/freenet/store/BerkeleyDBFreenetStore.java
===================================================================
--- trunk/freenet/src/freenet/store/BerkeleyDBFreenetStore.java 2008-04-12
15:52:36 UTC (rev 19246)
+++ trunk/freenet/src/freenet/store/BerkeleyDBFreenetStore.java 2008-04-12
16:08:38 UTC (rev 19247)
@@ -943,18 +943,29 @@
}
try {
byte[] routingkey = null;
- try {
- StorableBlock block =
callback.construct(data, header, null, readKey ? keyBuf : null);
- routingkey =
block.getRoutingKey();
- } catch (KeyVerifyException e) {
- String err = "Bogus or
unreconstructible key at slot "+l+" : "+e+" - lost block "+l;
- Logger.error(this, err, e);
- System.err.println(err);
- addFreeBlock(l, true, "can't
reconsturct key ("+callback+ ')');
- routingkey = null;
- failures++;
- continue;
+ if(keyBuf != null &&
!isAllNull(keyBuf)) {
+ routingkey =
callback.routingKeyFromFullKey(keyBuf);
+ if(routingkey == keyBuf) {
+ // Copy it.
+ byte[] newkey = new
byte[routingkey.length];
+
System.arraycopy(routingkey, 0, newkey, 0, routingkey.length);
+ routingkey = newkey;
+ }
}
+ if(routingkey == null) {
+ try {
+ StorableBlock block =
callback.construct(data, header, null, readKey ? keyBuf : null);
+ routingkey =
block.getRoutingKey();
+ } catch (KeyVerifyException e) {
+ String err = "Bogus or
unreconstructible key at slot "+l+" : "+e+" - lost block "+l;
+ Logger.error(this, err,
e);
+ System.err.println(err);
+ addFreeBlock(l, true,
"can't reconsturct key ("+callback+ ')');
+ routingkey = null;
+ failures++;
+ continue;
+ }
+ }
t =
environment.beginTransaction(null,null);
StoreBlock storeBlock = new
StoreBlock(l, lruVal);
DatabaseEntry routingkeyDBE = new
DatabaseEntry(routingkey);
@@ -1000,6 +1011,12 @@
}
}
+ private boolean isAllNull(byte[] buf) {
+ for(int i=0;i<buf.length;i++)
+ if(buf[i] != 0) return false;
+ return true;
+ }
+
private int runningFetches;
/**
Modified: trunk/freenet/src/freenet/store/CHKStore.java
===================================================================
--- trunk/freenet/src/freenet/store/CHKStore.java 2008-04-12 15:52:36 UTC
(rev 19246)
+++ trunk/freenet/src/freenet/store/CHKStore.java 2008-04-12 16:08:38 UTC
(rev 19247)
@@ -60,4 +60,8 @@
return false;
}
+ public byte[] routingKeyFromFullKey(byte[] keyBuf) {
+ return NodeCHK.routingKeyFromFullKey(keyBuf);
+ }
+
}
Modified: trunk/freenet/src/freenet/store/PubkeyStore.java
===================================================================
--- trunk/freenet/src/freenet/store/PubkeyStore.java 2008-04-12 15:52:36 UTC
(rev 19246)
+++ trunk/freenet/src/freenet/store/PubkeyStore.java 2008-04-12 16:08:38 UTC
(rev 19247)
@@ -62,4 +62,8 @@
return false;
}
+ public byte[] routingKeyFromFullKey(byte[] keyBuf) {
+ return keyBuf;
+ }
+
}
Modified: trunk/freenet/src/freenet/store/SSKStore.java
===================================================================
--- trunk/freenet/src/freenet/store/SSKStore.java 2008-04-12 15:52:36 UTC
(rev 19246)
+++ trunk/freenet/src/freenet/store/SSKStore.java 2008-04-12 16:08:38 UTC
(rev 19247)
@@ -64,4 +64,8 @@
return true;
}
+ public byte[] routingKeyFromFullKey(byte[] keyBuf) {
+ return NodeSSK.routingKeyFromFullKey(keyBuf);
+ }
+
}
Modified: trunk/freenet/src/freenet/store/StoreCallback.java
===================================================================
--- trunk/freenet/src/freenet/store/StoreCallback.java 2008-04-12 15:52:36 UTC
(rev 19246)
+++ trunk/freenet/src/freenet/store/StoreCallback.java 2008-04-12 16:08:38 UTC
(rev 19247)
@@ -73,4 +73,7 @@
public long keyCount() {
return store.keyCount();
}
+
+ /** Generate a routing key from a full key */
+ public abstract byte[] routingKeyFromFullKey(byte[] keyBuf);
}