PHOENIX-1396: Avoid unnecessary ResultSpooler.bin files creation/deletion every time SpoolingResultIterator is used
Project: http://git-wip-us.apache.org/repos/asf/phoenix/repo Commit: http://git-wip-us.apache.org/repos/asf/phoenix/commit/2b181d32 Tree: http://git-wip-us.apache.org/repos/asf/phoenix/tree/2b181d32 Diff: http://git-wip-us.apache.org/repos/asf/phoenix/diff/2b181d32 Branch: refs/heads/4.2 Commit: 2b181d325cccfb634c37690666977706d6e64a42 Parents: 2c3b350 Author: Jeffrey Zhong <jeffr...@apache.org> Authored: Wed Nov 5 09:56:19 2014 -0800 Committer: Jeffrey Zhong <jeffr...@apache.org> Committed: Wed Nov 5 14:42:59 2014 -0800 ---------------------------------------------------------------------- .../phoenix/iterate/SpoolingResultIterator.java | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/phoenix/blob/2b181d32/phoenix-core/src/main/java/org/apache/phoenix/iterate/SpoolingResultIterator.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/iterate/SpoolingResultIterator.java b/phoenix-core/src/main/java/org/apache/phoenix/iterate/SpoolingResultIterator.java index 0ba6554..2a5080e 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/iterate/SpoolingResultIterator.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/iterate/SpoolingResultIterator.java @@ -88,14 +88,12 @@ public class SpoolingResultIterator implements PeekingResultIterator { */ SpoolingResultIterator(ResultIterator scanner, MemoryManager mm, final int thresholdBytes, final long maxSpoolToDisk, final String spoolDirectory) throws SQLException { boolean success = false; - boolean usedOnDiskIterator = false; final MemoryChunk chunk = mm.allocate(0, thresholdBytes); - File tempFile = null; + DeferredFileOutputStream spoolTo = null; try { // Can't be bigger than int, since it's the max of the above allocation int size = (int)chunk.getSize(); - tempFile = File.createTempFile("ResultSpooler",".bin", new File(spoolDirectory)); - DeferredFileOutputStream spoolTo = new DeferredFileOutputStream(size, tempFile) { + spoolTo = new DeferredFileOutputStream(size, "ResultSpooler",".bin", new File(spoolDirectory)) { @Override protected void thresholdReached() throws IOException { super.thresholdReached(); @@ -115,14 +113,12 @@ public class SpoolingResultIterator implements PeekingResultIterator { } maxSize = Math.max(length, maxSize); } - spoolTo.close(); if (spoolTo.isInMemory()) { byte[] data = spoolTo.getData(); chunk.resize(data.length); spoolFrom = new InMemoryResultIterator(data, chunk); } else { spoolFrom = new OnDiskResultIterator(maxSize, spoolTo.getFile()); - usedOnDiskIterator = true; } success = true; } catch (IOException e) { @@ -132,9 +128,14 @@ public class SpoolingResultIterator implements PeekingResultIterator { scanner.close(); } finally { try { - if (!usedOnDiskIterator && tempFile != null) { - tempFile.delete(); + if (spoolTo != null) { + if(!success && spoolTo.getFile() != null){ + spoolTo.getFile().delete(); + } + spoolTo.close(); } + } catch (IOException ignored) { + // ignore close error } finally { if (!success) { chunk.close();