Return-Path: Delivered-To: apmail-lucene-java-commits-archive@www.apache.org Received: (qmail 37922 invoked from network); 18 Jan 2011 14:45:36 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.3) by minotaur.apache.org with SMTP; 18 Jan 2011 14:45:36 -0000 Received: (qmail 58069 invoked by uid 500); 18 Jan 2011 14:45:36 -0000 Delivered-To: apmail-lucene-java-commits-archive@lucene.apache.org Received: (qmail 57937 invoked by uid 500); 18 Jan 2011 14:45:34 -0000 Mailing-List: contact java-commits-help@lucene.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: java-dev@lucene.apache.org Delivered-To: mailing list java-commits@lucene.apache.org Received: (qmail 57930 invoked by uid 99); 18 Jan 2011 14:45:33 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 18 Jan 2011 14:45:33 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 18 Jan 2011 14:45:31 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id 0EDF9238896F; Tue, 18 Jan 2011 14:45:04 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1060398 - in /lucene/java/branches/lucene_2_9: CHANGES.txt src/java/org/apache/lucene/index/SegmentInfo.java Date: Tue, 18 Jan 2011 14:45:03 -0000 To: java-commits@lucene.apache.org From: shaie@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20110118144504.0EDF9238896F@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: shaie Date: Tue Jan 18 14:45:03 2011 New Revision: 1060398 URL: http://svn.apache.org/viewvc?rev=1060398&view=rev Log: LUCENE-2584: port fix to 2.9 Modified: lucene/java/branches/lucene_2_9/CHANGES.txt lucene/java/branches/lucene_2_9/src/java/org/apache/lucene/index/SegmentInfo.java Modified: lucene/java/branches/lucene_2_9/CHANGES.txt URL: http://svn.apache.org/viewvc/lucene/java/branches/lucene_2_9/CHANGES.txt?rev=1060398&r1=1060397&r2=1060398&view=diff ============================================================================== --- lucene/java/branches/lucene_2_9/CHANGES.txt (original) +++ lucene/java/branches/lucene_2_9/CHANGES.txt Tue Jan 18 14:45:03 2011 @@ -3,7 +3,10 @@ $Id$ ======================= 2.9 branch (not yet released) ================== -No changes. +Bug fixes + +* LUCENE-2584: SegmentInfo.files() could hit ConcurrentModificationException if + called by multiple threads. (Alexander Kanarsky via Shai Erera) ======================= Release 2.9.4 2010-12-03 ======================= Modified: lucene/java/branches/lucene_2_9/src/java/org/apache/lucene/index/SegmentInfo.java URL: http://svn.apache.org/viewvc/lucene/java/branches/lucene_2_9/src/java/org/apache/lucene/index/SegmentInfo.java?rev=1060398&r1=1060397&r2=1060398&view=diff ============================================================================== --- lucene/java/branches/lucene_2_9/src/java/org/apache/lucene/index/SegmentInfo.java (original) +++ lucene/java/branches/lucene_2_9/src/java/org/apache/lucene/index/SegmentInfo.java Tue Jan 18 14:45:03 2011 @@ -22,11 +22,13 @@ import org.apache.lucene.store.IndexOutp import org.apache.lucene.store.IndexInput; import org.apache.lucene.util.BitVector; import java.io.IOException; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.HashMap; import java.util.ArrayList; import java.util.Collections; +import java.util.Set; /** * Information about a segment such as it's name, directory, and files related @@ -570,7 +572,7 @@ public final class SegmentInfo { return hasProx; } - private void addIfExists(List files, String fileName) throws IOException { + private void addIfExists(Set files, String fileName) throws IOException { if (dir.fileExists(fileName)) files.add(fileName); } @@ -588,16 +590,16 @@ public final class SegmentInfo { return files; } - files = new ArrayList(); + Set filesSet = new HashSet(); boolean useCompoundFile = getUseCompoundFile(); if (useCompoundFile) { - files.add(name + "." + IndexFileNames.COMPOUND_FILE_EXTENSION); + filesSet.add(name + "." + IndexFileNames.COMPOUND_FILE_EXTENSION); } else { final String[] exts = IndexFileNames.NON_STORE_INDEX_EXTENSIONS; for(int i=0;i= YES || dir.fileExists(delFileName))) { - files.add(delFileName); + filesSet.add(delFileName); } // Careful logic for norms files @@ -630,14 +632,14 @@ public final class SegmentInfo { long gen = normGen[i]; if (gen >= YES) { // Definitely a separate norm file, with generation: - files.add(IndexFileNames.fileNameFromGeneration(name, "." + IndexFileNames.SEPARATE_NORMS_EXTENSION + i, gen)); + filesSet.add(IndexFileNames.fileNameFromGeneration(name, "." + IndexFileNames.SEPARATE_NORMS_EXTENSION + i, gen)); } else if (NO == gen) { // No separate norms but maybe plain norms // in the non compound file case: if (!hasSingleNormFile && !useCompoundFile) { String fileName = name + "." + IndexFileNames.PLAIN_NORMS_EXTENSION + i; if (dir.fileExists(fileName)) { - files.add(fileName); + filesSet.add(fileName); } } } else if (CHECK_DIR == gen) { @@ -649,7 +651,7 @@ public final class SegmentInfo { fileName = name + "." + IndexFileNames.PLAIN_NORMS_EXTENSION + i; } if (fileName != null && dir.fileExists(fileName)) { - files.add(fileName); + filesSet.add(fileName); } } } @@ -667,11 +669,11 @@ public final class SegmentInfo { for(int i=0;i prefixLength && Character.isDigit(fileName.charAt(prefixLength)) && fileName.startsWith(prefix)) { - files.add(fileName); + filesSet.add(fileName); } } } - return files; + return files = new ArrayList(filesSet); } /* Called whenever any change is made that affects which