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);
 }


Reply via email to