fix Crawler HostQueue release of stackfile

- close stackfile inputstream at end of ChunkIterator
This should solve startup delay while unfinished crawl jobs exist (maybe also too many open file situation)
pull/1/head
reger 11 years ago
parent 40133ba2d0
commit 2ba394333f

@ -7,7 +7,7 @@
// $LastChangedBy$ // $LastChangedBy$
// //
// LICENSE // LICENSE
// //
// This program is free software; you can redistribute it and/or modify // This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by // it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or // the Free Software Foundation; either version 2 of the License, or
@ -39,22 +39,23 @@ import net.yacy.cora.util.LookAheadIterator;
public class ChunkIterator extends LookAheadIterator<byte[]> implements Iterator<byte[]> { public class ChunkIterator extends LookAheadIterator<byte[]> implements Iterator<byte[]> {
private final int chunksize; private final int chunksize;
/** /**
* create a ChunkIterator * create a ChunkIterator
* a ChunkIterator uses a BufferedInputStream to iterate through the file * a ChunkIterator uses a BufferedInputStream to iterate through the file
* and is therefore a fast option to get all elements in the file as a sequence * and is therefore a fast option to get all elements in the file as a sequence
* ATTENTION: before calling this class ensure that all file buffers are flushed * ATTENTION: before calling this class ensure that all file buffers are flushed
* ATTENTION: if the iterator is not read to the end or interrupted, close() must be called to release the InputStream
* @param file: the file * @param file: the file
* @param recordsize: the size of the elements in the file * @param recordsize: the size of the elements in the file
* @param chunksize: the size of the chunks that are returned by next(). remaining bytes until the lenght of recordsize are skipped * @param chunksize: the size of the chunks that are returned by next(). remaining bytes until the lenght of recordsize are skipped
* @throws FileNotFoundException * @throws FileNotFoundException
*/ */
private final DataInputStream stream; private final DataInputStream stream;
private final int recordsize; private final int recordsize;
public ChunkIterator(final File file, final int recordsize, final int chunksize) throws FileNotFoundException { public ChunkIterator(final File file, final int recordsize, final int chunksize) throws FileNotFoundException {
if (!file.exists()) throw new FileNotFoundException(file.getAbsolutePath()); if (!file.exists()) throw new FileNotFoundException(file.getAbsolutePath());
assert (file.exists()); assert (file.exists());
@ -63,7 +64,16 @@ public class ChunkIterator extends LookAheadIterator<byte[]> implements Iterator
this.chunksize = chunksize; this.chunksize = chunksize;
this.stream = new DataInputStream(new BufferedInputStream(new FileInputStream(file), 64 * 1024)); this.stream = new DataInputStream(new BufferedInputStream(new FileInputStream(file), 64 * 1024));
} }
/**
* Special close methode to release the used InputStream
* stream is automatically closed on last next(),
* close() needs only be called if iterator not read to the end ( hasNext() or next() has not returned null)
*/
public void close() throws IOException {
this.stream.close();
}
@Override @Override
public byte[] next0() { public byte[] next0() {
final byte[] chunk = new byte[chunksize]; final byte[] chunk = new byte[chunksize];
@ -82,6 +92,11 @@ public class ChunkIterator extends LookAheadIterator<byte[]> implements Iterator
return chunk; return chunk;
} catch (final EOFException e) { } catch (final EOFException e) {
// no real exception, this is the normal termination // no real exception, this is the normal termination
try {
this.stream.close(); // close the underlaying inputstream
} catch (IOException ex) {
ConcurrentLog.logException(ex);
}
return null; return null;
} catch (final IOException e) { } catch (final IOException e) {
ConcurrentLog.logException(e); ConcurrentLog.logException(e);

@ -173,7 +173,7 @@ public class Table implements Index, Iterable<Row.Entry> {
} else { } else {
byte[] record; byte[] record;
key = new byte[rowdef.primaryKeyLength]; key = new byte[rowdef.primaryKeyLength];
final Iterator<byte[]> ri = new ChunkIterator(tablefile, rowdef.objectsize, rowdef.objectsize); final ChunkIterator ri = new ChunkIterator(tablefile, rowdef.objectsize, rowdef.objectsize);
while (ri.hasNext()) { while (ri.hasNext()) {
record = ri.next(); record = ri.next();
assert record != null; assert record != null;
@ -188,6 +188,7 @@ public class Table implements Index, Iterable<Row.Entry> {
this.table.addUnique(this.taildef.newEntry(record, rowdef.primaryKeyLength, true)); this.table.addUnique(this.taildef.newEntry(record, rowdef.primaryKeyLength, true));
} catch (final SpaceExceededException e) { } catch (final SpaceExceededException e) {
this.table = null; this.table = null;
ri.close(); // close inputstream of chunkiterator
break; break;
} }
} else { } else {

Loading…
Cancel
Save