* Matthew Toseland <toad at amphibian.dyndns.org> [2008-08-30 22:44:26]:
> On Tuesday 26 August 2008 00:06, nextgens at freenetproject.org wrote:
> > Author: nextgens
> > Date: 2008-08-25 23:06:22 +0000 (Mon, 25 Aug 2008)
> > New Revision: 22164
> >
> > Modified:
> > trunk/freenet/src/freenet/support/io/TempBucketFactory.java
> > Log:
> > TempBucket: simplify the code even more... but it's still not working as
> expected!
> >
> > Modified: trunk/freenet/src/freenet/support/io/TempBucketFactory.java
> > ===================================================================
> > --- trunk/freenet/src/freenet/support/io/TempBucketFactory.java
> > 2008-08-25
> 22:45:37 UTC (rev 22163)
> > +++ trunk/freenet/src/freenet/support/io/TempBucketFactory.java
> > 2008-08-25
> 23:06:22 UTC (rev 22164)
> > @@ -65,8 +65,8 @@
> > private long currentSize;
> > private OutputStream os = null;
> > private short osIndex;
> > - private volatile boolean shouldResetOS = false;
> > - private volatile boolean shouldResetIS = false;
> > + private short shouldResetIS = 0;
> > + private short isIndex;
> > public final Object sync = new Object();
> > public final long creationTime;
> >
> > @@ -76,6 +76,7 @@
> > this.currentBucket = cur;
> > this.creationTime = now;
> > this.osIndex = 0;
> > + this.isIndex = 0;
> > }
> >
> > /** A blocking method to force-migrate from a RAMBucket to a
> > FileBucket
> */
> > @@ -88,14 +89,17 @@
> >
> > toMigrate = currentBucket;
> > Bucket tempFB = _makeFileBucket();
> > + if(os != null) {
> > + os.flush();
> > + os.close();
> > + }
> > os = tempFB.getOutputStream();
> > BucketTools.copyTo(tempFB, os, currentSize);
> > if(toMigrate.isReadOnly())
> > tempFB.setReadOnly();
> > currentBucket = tempFB;
> > // We need streams to be reset to point to the
> > new bucket
> > - shouldResetOS = true;
> > - shouldResetIS = true;
> > + shouldResetIS = isIndex;
> > }
> > if(logMINOR)
> > Logger.minor(this, "We have migrated
> > "+toMigrate.hashCode());
> > @@ -114,23 +118,21 @@
> >
> > public OutputStream getOutputStream() throws IOException {
> > synchronized(sync) {
> > - shouldResetOS = true;
> > + if(os != null)
> > + throw new IOException("Only one
> > OutputStream per bucket!");
> > return new TempBucketOutputStream(++osIndex);
> > }
> > }
> >
> > private class TempBucketOutputStream extends OutputStream {
> > - private OutputStream currentOS;
> > private final short idx;
> >
> > - TempBucketOutputStream(short idx) {
> > + TempBucketOutputStream(short idx) throws IOException {
> > this.idx = idx;
> > + os = currentBucket.getOutputStream();
> > }
> >
> > private void _maybeMigrateRamBucket(long futureSize)
> > throws IOException
> {
> > - if(idx != osIndex)
> > - throw new IOException("Should use the
> > new OutputStream!");
> > -
> > if(isRAMBucket()) {
> > boolean shouldMigrate = false;
> > boolean isOversized = false;
> > @@ -142,7 +144,6 @@
> > shouldMigrate = true;
> >
> > if(shouldMigrate) {
> > - Closer.close(currentOS);
> > if(logMINOR) {
> > if(isOversized)
> >
> > Logger.minor(this, "The bucket is
> over "+SizeUtil.formatSize(maxRAMBucketSize*RAMBUCKET_CONVERSION_FACTOR)+":
> we will force-migrate it to disk.");
> > @@ -154,22 +155,13 @@
> > }
> > }
> >
> > - private void _maybeResetOutputStream() throws
> > IOException {
> > - if(shouldResetOS) {
> > - Closer.close(currentOS);
> > - currentOS = (os == null ?
> > currentBucket.getOutputStream() : os);
> > - shouldResetOS = false;
> > - }
> > - }
> > -
> > @Override
> > public final void write(int b) throws IOException {
> > synchronized(sync) {
> > - long futurSize = currentSize + 1;
> > - _maybeMigrateRamBucket(futurSize);
> > - _maybeResetOutputStream();
> > - currentOS.write(b);
> > - currentSize = futurSize;
> > + long futureSize = currentSize + 1;
> > + _maybeMigrateRamBucket(futureSize);
> > + os.write(b);
> > + currentSize = futureSize;
> > if(isRAMBucket()) // We need to
> > re-check because it might have
> changed!
> > _hasTaken(1);
> > }
> > @@ -180,8 +172,7 @@
> > synchronized(sync) {
> > long futureSize = currentSize + len;
> > _maybeMigrateRamBucket(futureSize);
> > - _maybeResetOutputStream();
> > - currentOS.write(b, off, len);
> > + os.write(b, off, len);
> > currentSize = futureSize;
> > if(isRAMBucket()) // We need to
> > re-check because it might have
> changed!
> > _hasTaken(len);
> > @@ -192,8 +183,7 @@
> > public final void flush() throws IOException {
> > synchronized(sync) {
> > _maybeMigrateRamBucket(currentSize);
> > - _maybeResetOutputStream();
> > - currentOS.flush();
> > + os.flush();
> > }
> > }
> >
> > @@ -201,17 +191,16 @@
> > public final void close() throws IOException {
> > synchronized(sync) {
> > _maybeMigrateRamBucket(currentSize);
> > - _maybeResetOutputStream();
> > - if(currentOS != null) {
> > - currentOS.flush();
> > - Closer.close(currentOS);
> > + if(os != null) {
> > + os.flush();
> > + os.close();
> > }
> > }
> > }
> > }
> >
> > public synchronized InputStream getInputStream() throws
> > IOException {
> > - shouldResetIS = true;
> > + isIndex++;
> > return new TempBucketInputStream(osIndex);
> > }
> >
> > @@ -220,19 +209,20 @@
> > private long index = 0;
> > private final short idx;
> >
> > - TempBucketInputStream(short idx) {
> > + TempBucketInputStream(short idx) throws IOException {
> > this.idx = idx;
> > + this.currentIS = currentBucket.getInputStream();
> > }
> >
> > private void _maybeResetInputStream() throws
> > IOException {
> > if(idx != osIndex)
> > throw new IOException("Should use the
> > new InputStream!");
> >
> > - if(shouldResetIS) {
> > + if(shouldResetIS > 0) {
> > Closer.close(currentIS);
> > currentIS =
> > currentBucket.getInputStream();
> > currentIS.skip(index);
> > - shouldResetIS = false;
> > + shouldResetIS--;
> > }
>
> I don't understand this one. Looks like you're going to reset and seek on
> every call to read() until shouldResetIS reaches 0?
>
> You want every input stream currently running to be reset, not one to be
> reset
> N times. Probably the best way to implement this is to have a flag on each
> InputStream for whether it's been reset or not?? When the global flag is set,
> _maybeResetInputStream() will then reset *once* for each stream, regardless
> of whether they are called in a round-robin order or not??
>
This code is no more upstream... It was a bad idea, yeah.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 197 bytes
Desc: Digital signature
URL:
<https://emu.freenetproject.org/pipermail/devl/attachments/20080831/a1a303a2/attachment.pgp>