From 891dcd75e9ed044ea8798c9521641658f86c1ae0 Mon Sep 17 00:00:00 2001 From: Uwe Schindler Date: Tue, 10 Jul 2012 23:41:09 +0000 Subject: [PATCH] LUCENE-4209: Enforce cleanup on success and failure while sorting partitions git-svn-id: https://svn.apache.org/repos/asf/lucene/dev/trunk@1359953 13f79535-47bb-0310-9956-ffa450edef68 --- .../lucene/search/suggest/fst/Sort.java | 84 +++++++++++-------- 1 file changed, 47 insertions(+), 37 deletions(-) diff --git a/lucene/suggest/src/java/org/apache/lucene/search/suggest/fst/Sort.java b/lucene/suggest/src/java/org/apache/lucene/search/suggest/fst/Sort.java index 2f0930a0751..585ee9ca942 100644 --- a/lucene/suggest/src/java/org/apache/lucene/search/suggest/fst/Sort.java +++ b/lucene/suggest/src/java/org/apache/lucene/search/suggest/fst/Sort.java @@ -193,50 +193,60 @@ public final class Sort { output.delete(); ArrayList merges = new ArrayList(); - ByteSequencesReader is = new ByteSequencesReader(input); - boolean success = false; + boolean success2 = false; try { - int lines = 0; - while ((lines = readPartition(is)) > 0) { - merges.add(sortPartition(lines)); - sortInfo.tempMergeFiles++; - sortInfo.lines += lines; - - // Handle intermediate merges. - if (merges.size() == maxTempFiles) { - File intermediate = File.createTempFile("sort", "intermediate", tempDirectory); - mergePartitions(merges, intermediate); - for (File file : merges) { - file.delete(); - } - merges.clear(); - merges.add(intermediate); + ByteSequencesReader is = new ByteSequencesReader(input); + boolean success = false; + try { + int lines = 0; + while ((lines = readPartition(is)) > 0) { + merges.add(sortPartition(lines)); sortInfo.tempMergeFiles++; - } - } - success = true; - } finally { - if (success) - IOUtils.close(is); - else - IOUtils.closeWhileHandlingException(is); - } + sortInfo.lines += lines; - // One partition, try to rename or copy if unsuccessful. - if (merges.size() == 1) { - File single = merges.get(0); - // If simple rename doesn't work this means the output is - // on a different volume or something. Copy the input then. - if (!single.renameTo(output)) { - copy(single, output); - single.delete(); + // Handle intermediate merges. + if (merges.size() == maxTempFiles) { + File intermediate = File.createTempFile("sort", "intermediate", tempDirectory); + try { + mergePartitions(merges, intermediate); + } finally { + for (File file : merges) { + file.delete(); + } + merges.clear(); + merges.add(intermediate); + } + sortInfo.tempMergeFiles++; + } + } + success = true; + } finally { + if (success) + IOUtils.close(is); + else + IOUtils.closeWhileHandlingException(is); } - } else { - // otherwise merge the partitions with a priority queue. - mergePartitions(merges, output); + + // One partition, try to rename or copy if unsuccessful. + if (merges.size() == 1) { + File single = merges.get(0); + // If simple rename doesn't work this means the output is + // on a different volume or something. Copy the input then. + if (!single.renameTo(output)) { + copy(single, output); + } + } else { + // otherwise merge the partitions with a priority queue. + mergePartitions(merges, output); + } + success2 = true; + } finally { for (File file : merges) { file.delete(); } + if (!success2) { + output.delete(); + } } sortInfo.totalTime = (System.currentTimeMillis() - sortInfo.totalTime);