Index: lucene/contrib/facet/src/test/org/apache/lucene/facet/taxonomy/TestTaxonomyCombined.java =================================================================== --- lucene/contrib/facet/src/test/org/apache/lucene/facet/taxonomy/TestTaxonomyCombined.java (revision 1178702) +++ lucene/contrib/facet/src/test/org/apache/lucene/facet/taxonomy/TestTaxonomyCombined.java (working copy) @@ -491,6 +491,43 @@ indexDir.close(); } + @Test + public void testWriterParentThreadSafety() throws Exception { //nocommit + Directory indexDir = newDirectory(); + TaxonomyWriter tw1 = new LuceneTaxonomyWriter(indexDir); + fillTaxonomy(tw1); + tw1.commit(); + tw1.close(); + + final TaxonomyWriter tw = new LuceneTaxonomyWriter(indexDir); // reopen tw + Thread[] t = new Thread[2]; + final Exception[] error = new Exception[] {null}; + for (int i = 0; i < t.length; i++) { + t[i] = new Thread("taxo-writer-"+i) { + @Override + public void run() { + try { + tw.getParent(0); + } catch (IOException e) { + error[0] = e; + } + } + }; + } + for (int i = 0; i < t.length; i++) { + t[i].start(); + } + for (int i = 0; i < t.length; i++) { + t[i].join(); + } + TaxonomyReader tr = new LuceneTaxonomyReader(indexDir); + checkWriterParent(tr, tw); + + tw.close(); + tr.close(); + indexDir.close(); + } + private void checkWriterParent(TaxonomyReader tr, TaxonomyWriter tw) throws Exception { // check that the parent of the root ordinal is the invalid ordinal: assertEquals(TaxonomyReader.INVALID_ORDINAL, tw.getParent(0)); Index: lucene/contrib/facet/src/java/org/apache/lucene/facet/taxonomy/lucene/LuceneTaxonomyWriter.java =================================================================== --- lucene/contrib/facet/src/java/org/apache/lucene/facet/taxonomy/lucene/LuceneTaxonomyWriter.java (revision 1178702) +++ lucene/contrib/facet/src/java/org/apache/lucene/facet/taxonomy/lucene/LuceneTaxonomyWriter.java (working copy) @@ -705,11 +705,13 @@ // TODO (Facet): synchronization of some sort? private ParentArray parentArray; private ParentArray getParentArray() throws IOException { + if ("taxo-writer-0".equals(Thread.currentThread().getName())) try { Thread.sleep(100); } catch (InterruptedException e) { /* nocommit */ } if (parentArray==null) { if (reader == null) { reader = openReader(); } parentArray = new ParentArray(); + if ("taxo-writer-1".equals(Thread.currentThread().getName())) try { Thread.sleep(100); } catch (InterruptedException e) { /* nocommit */ } parentArray.refresh(reader); } return parentArray;