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


Reply via email to