Author: j16sdiz
Date: 2008-05-16 15:15:24 +0000 (Fri, 16 May 2008)
New Revision: 19954
Modified:
trunk/freenet/src/freenet/store/BerkeleyDBFreenetStore.java
Log:
BDBFS: reconstruct() - read data only when needed
Modified: trunk/freenet/src/freenet/store/BerkeleyDBFreenetStore.java
===================================================================
--- trunk/freenet/src/freenet/store/BerkeleyDBFreenetStore.java 2008-05-16
02:45:51 UTC (rev 19953)
+++ trunk/freenet/src/freenet/store/BerkeleyDBFreenetStore.java 2008-05-16
15:15:24 UTC (rev 19954)
@@ -987,11 +987,9 @@
System.err.println("File pointer is
"+storeRAF.getFilePointer()+" but should be "+((headerBlockSize +
dataBlockSize)));
System.exit(NodeInitException.EXIT_STORE_RECONSTRUCT);
}
- // FIXME only do the read if we need the data,
and if we do, do a seek first.
- // Post 0.7.0; only a useful optimisation if we
have a good .keys file, but should
- // save some I/O when we do.
storeRAF.readFully(header);
- storeRAF.readFully(data);
+ boolean dataRead = false;
+ try {
if(lruRAFLength > (l+1)*8) {
try {
lruVal = lruRAF.readLong();
@@ -1030,6 +1028,10 @@
routingkey = newkey;
}
}
+ if (!dataRead) {
+ storeRAF.readFully(data);
+ dataRead = true;
+ }
if (routingkey == null &&
!isAllNull(header) && !isAllNull(data)) {
keyFromData = true;
try {
@@ -1061,6 +1063,10 @@
if(!keyFromData) {
byte[] oldRoutingkey =
routingkey;
try {
+ if (!dataRead) {
+ storeRAF.readFully(data);
+ dataRead = true;
+ }
StorableBlock
block = callback.construct(data, header, null, keyBuf);
routingkey =
block.getRoutingKey();
if(Arrays.equals(oldRoutingkey, routingkey)) {
@@ -1115,6 +1121,11 @@
} finally {
if(t != null) t.abort();
}
+ } finally {
+ if (!dataRead) {
+ storeRAF.skipBytes(data.length);
+ }
+ }
}
} catch (EOFException e) {
long size = l * (dataBlockSize + headerBlockSize);