Index: lucene/CHANGES.txt =================================================================== --- lucene/CHANGES.txt (revision 1478278) +++ lucene/CHANGES.txt (working copy) @@ -78,6 +78,9 @@ * LUCENE-4974: CommitIndexTask was broken if no params were set. (Shai Erera) +* LUCENE-4972: DirectoryTaxonomyWriter created empty commits even if no changes + were made. (Shai Erera) + Optimizations * LUCENE-4938: Don't use an unnecessarily large priority queue in IndexSearcher Index: lucene/facet/src/java/org/apache/lucene/facet/taxonomy/directory/DirectoryTaxonomyWriter.java =================================================================== --- lucene/facet/src/java/org/apache/lucene/facet/taxonomy/directory/DirectoryTaxonomyWriter.java (revision 1478278) +++ lucene/facet/src/java/org/apache/lucene/facet/taxonomy/directory/DirectoryTaxonomyWriter.java (working copy) @@ -103,6 +103,7 @@ // Records the taxonomy index epoch, updated on replaceTaxonomy as well. private long indexEpoch; + private boolean isDirty = false; private char delimiter = Consts.DEFAULT_DELIMITER; private SinglePositionTokenStream parentStream = new SinglePositionTokenStream(Consts.PAYLOAD_PARENT); @@ -354,14 +355,14 @@ @Override public synchronized void close() throws IOException { if (!isClosed) { - indexWriter.setCommitData(combinedCommitData(indexWriter.getCommitData())); - indexWriter.commit(); + commit(); doClose(); } } private void doClose() throws IOException { indexWriter.close(); + isDirty = false; isClosed = true; closeResources(); } @@ -549,6 +550,7 @@ // before the parents array (LUCENE-4596) addToCache(categoryPath, id); + isDirty = true; return id; } @@ -616,8 +618,11 @@ @Override public synchronized void commit() throws IOException { ensureOpen(); - indexWriter.setCommitData(combinedCommitData(indexWriter.getCommitData())); - indexWriter.commit(); + if (isDirty) { // LUCENE-4972: if we always call setCommitData, we create empty commits + indexWriter.setCommitData(combinedCommitData(indexWriter.getCommitData())); + indexWriter.commit(); + isDirty = false; + } } /** Combine original user data with the taxonomy epoch. */ @@ -633,6 +638,7 @@ @Override public void setCommitData(Map commitUserData) { indexWriter.setCommitData(combinedCommitData(commitUserData)); + isDirty = true; } @Override @@ -647,8 +653,10 @@ @Override public synchronized void prepareCommit() throws IOException { ensureOpen(); - indexWriter.setCommitData(combinedCommitData(indexWriter.getCommitData())); - indexWriter.prepareCommit(); + if (isDirty) { + indexWriter.setCommitData(combinedCommitData(indexWriter.getCommitData())); + indexWriter.prepareCommit(); + } } @Override @@ -973,6 +981,7 @@ // update indexEpoch as a taxonomy replace is just like it has be recreated ++indexEpoch; + isDirty = true; } /** Returns the {@link Directory} of this taxonomy writer. */ Index: lucene/facet/src/test/org/apache/lucene/facet/taxonomy/directory/TestDirectoryTaxonomyWriter.java =================================================================== --- lucene/facet/src/test/org/apache/lucene/facet/taxonomy/directory/TestDirectoryTaxonomyWriter.java (revision 1478278) +++ lucene/facet/src/test/org/apache/lucene/facet/taxonomy/directory/TestDirectoryTaxonomyWriter.java (working copy) @@ -359,5 +359,58 @@ taxoWriter.close(); dir.close(); } + + @Test + public void testCommitNoEmptyCommits() throws Exception { + // LUCENE-4972: DTW used to create empty commits even if no changes were made + Directory dir = newDirectory(); + DirectoryTaxonomyWriter taxoWriter = new DirectoryTaxonomyWriter(dir); + taxoWriter.addCategory(new CategoryPath("a")); + taxoWriter.commit(); + + long gen1 = SegmentInfos.getLastCommitGeneration(dir); + taxoWriter.commit(); + long gen2 = SegmentInfos.getLastCommitGeneration(dir); + assertEquals("empty commit should not have changed the index", gen1, gen2); + + taxoWriter.close(); + dir.close(); + } + @Test + public void testCloseNoEmptyCommits() throws Exception { + // LUCENE-4972: DTW used to create empty commits even if no changes were made + Directory dir = newDirectory(); + DirectoryTaxonomyWriter taxoWriter = new DirectoryTaxonomyWriter(dir); + taxoWriter.addCategory(new CategoryPath("a")); + taxoWriter.commit(); + + long gen1 = SegmentInfos.getLastCommitGeneration(dir); + taxoWriter.close(); + long gen2 = SegmentInfos.getLastCommitGeneration(dir); + assertEquals("empty commit should not have changed the index", gen1, gen2); + + taxoWriter.close(); + dir.close(); + } + + @Test + public void testPrepareCommitNoEmptyCommits() throws Exception { + // LUCENE-4972: DTW used to create empty commits even if no changes were made + Directory dir = newDirectory(); + DirectoryTaxonomyWriter taxoWriter = new DirectoryTaxonomyWriter(dir); + taxoWriter.addCategory(new CategoryPath("a")); + taxoWriter.prepareCommit(); + taxoWriter.commit(); + + long gen1 = SegmentInfos.getLastCommitGeneration(dir); + taxoWriter.prepareCommit(); + taxoWriter.commit(); + long gen2 = SegmentInfos.getLastCommitGeneration(dir); + assertEquals("empty commit should not have changed the index", gen1, gen2); + + taxoWriter.close(); + dir.close(); + } + }