Author: nextgens
Date: 2008-08-13 15:19:23 +0000 (Wed, 13 Aug 2008)
New Revision: 21815
Modified:
trunk/freenet/src/freenet/client/FECCodec.java
trunk/freenet/src/freenet/support/io/ArrayBucket.java
trunk/freenet/src/freenet/support/io/BucketTools.java
Log:
ArrayBucket.size() is unreliable until the OutputStream has been closed... So
close it first and ensure it's not closed more than once
Modified: trunk/freenet/src/freenet/client/FECCodec.java
===================================================================
--- trunk/freenet/src/freenet/client/FECCodec.java 2008-08-13 15:15:36 UTC
(rev 21814)
+++ trunk/freenet/src/freenet/client/FECCodec.java 2008-08-13 15:19:23 UTC
(rev 21815)
@@ -199,7 +199,7 @@
for(int i = 0; i < dataBlockStatus.length; i++) {
Bucket data = buckets[i];
if(data.size() != blockLength)
- throw new IllegalStateException("Block " + i +
": " + data + " : " + dataBlockStatus[i] + " length " + data.size());
+ throw new IllegalStateException("Block " + i +
": " + data + " : " + dataBlockStatus[i] + " length " + data.size() + " whereas
blockLength="+blockLength);
dataBlockStatus[i].setData(data);
}
}
Modified: trunk/freenet/src/freenet/support/io/ArrayBucket.java
===================================================================
--- trunk/freenet/src/freenet/support/io/ArrayBucket.java 2008-08-13
15:15:36 UTC (rev 21814)
+++ trunk/freenet/src/freenet/support/io/ArrayBucket.java 2008-08-13
15:19:23 UTC (rev 21815)
@@ -17,7 +17,7 @@
*/
public class ArrayBucket implements Bucket {
- private final ArrayList data;
+ private final ArrayList<byte[]> data;
private final String name;
private volatile boolean readOnly;
@@ -31,7 +31,7 @@
}
ArrayBucket(String name) {
- data = new ArrayList();
+ data = new ArrayList<byte[]>();
this.name = name;
}
@@ -65,12 +65,12 @@
}
public synchronized long size() {
- long size = 0;
- for (Iterator i = data.iterator(); i.hasNext();) {
- byte[] b = (byte[]) i.next();
- size += b.length;
- }
- return size;
+ long currentSize = 0;
+
+ for(byte[] buf : data)
+ currentSize += buf.length;
+
+ return currentSize;
}
public String getName() {
@@ -78,6 +78,7 @@
}
private class ArrayBucketOutputStream extends ByteArrayOutputStream {
+ boolean hasBeenClosed = false;
public ArrayBucketOutputStream() {
super();
@@ -97,6 +98,8 @@
@Override
public synchronized void close() throws IOException {
+ if(hasBeenClosed) return;
+ hasBeenClosed = true;
data.add(super.toByteArray());
if(readOnly) throw new IOException("Read only");
}
Modified: trunk/freenet/src/freenet/support/io/BucketTools.java
===================================================================
--- trunk/freenet/src/freenet/support/io/BucketTools.java 2008-08-13
15:15:36 UTC (rev 21814)
+++ trunk/freenet/src/freenet/support/io/BucketTools.java 2008-08-13
15:19:23 UTC (rev 21815)
@@ -288,6 +288,7 @@
if(bytes <= 0) {
if(truncateLength == Long.MAX_VALUE)
break;
+ new IOException().printStackTrace();
throw new IOException("Could not move
required quantity of data in copyTo: "+bytes+" (moved "+moved+" of
"+truncateLength+"): unable to read from "+is);
}
os.write(buf, 0, bytes);
@@ -419,9 +420,11 @@
os.write(buf, 0, thisCycle);
x += thisCycle;
}
+ os.close();
+ os = null;
if(b.size() != blockLength)
throw new IllegalStateException("The bucket's
size is "+b.size()+" whereas it should be "+blockLength+'!');
return b;
- } finally { os.close(); }
+ } finally { Closer.close(os); }
}
}