Author: nzamosenchuk
Date: 2011-11-21 02:47:06 -0500 (Mon, 21 Nov 2011)
New Revision: 5207
Modified:
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/SearchManager.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/SearchIndex.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/spell/LuceneSpellChecker.java
jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/core/query/BaseQueryTest.java
jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/core/query/TestArabicSearch.java
jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/core/query/TestDateSearch.java
jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/core/query/TestExcelFileSearch.java
jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/core/query/TestIndexingConfig.java
jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/core/query/TestRewriteNode.java
Log:
EXOJCR-1542 : Fix indexReader leak in SearchIndex.checkIndex(), fix leaks in tests and
properly release or close readers using Util.closeOrReleaseReader().
Modified:
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/SearchManager.java
===================================================================
---
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/SearchManager.java 2011-11-21
07:41:27 UTC (rev 5206)
+++
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/SearchManager.java 2011-11-21
07:47:06 UTC (rev 5207)
@@ -70,6 +70,7 @@
import org.exoplatform.services.jcr.impl.core.query.lucene.QueryHits;
import org.exoplatform.services.jcr.impl.core.query.lucene.ScoreNode;
import org.exoplatform.services.jcr.impl.core.query.lucene.SearchIndex;
+import org.exoplatform.services.jcr.impl.core.query.lucene.Util;
import org.exoplatform.services.jcr.impl.core.value.NameValue;
import org.exoplatform.services.jcr.impl.core.value.PathValue;
import org.exoplatform.services.jcr.impl.core.value.ValueFactoryImpl;
@@ -397,10 +398,11 @@
/**
* Check index consistency. Iterator goes through index documents and check, does each
document have
* according jcr-node. If index is suspended then it will be temporary resumed, while
check is running and suspended afterwards.
- */
- public void checkIndex(final InspectionLog inspectionLog, final boolean isSystem)
throws RepositoryException, IOException
- {
-
+ */
+ public void checkIndex(final InspectionLog inspectionLog, final boolean isSystem)
throws RepositoryException,
+ IOException
+ {
+
if (isSuspended)
{
try
@@ -417,7 +419,7 @@
parentSearchManager.resume();
}
resume();
-
+
handler.checkIndex(itemMgr, isSystem, inspectionLog);
return null;
}
@@ -496,7 +498,7 @@
{
if (reader != null)
{
- reader.close();
+ Util.closeOrRelease(reader);
}
}
catch (IOException e)
@@ -599,7 +601,7 @@
if (itemStates.getSize() > 0)
{
//Check if SearchManager started and filter configured
- if (changesFilter != null && parentSearchManager!=null)
+ if (changesFilter != null && parentSearchManager != null)
{
changesFilter.onSaveItems(itemStates);
}
@@ -1716,7 +1718,7 @@
throw new BackupException(e);
}
}
-
+
/**
* {@inheritDoc}
*/
Modified:
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/SearchIndex.java
===================================================================
---
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/SearchIndex.java 2011-11-21
07:41:27 UTC (rev 5206)
+++
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/SearchIndex.java 2011-11-21
07:47:06 UTC (rev 5207)
@@ -961,30 +961,37 @@
// check relation Persistent Layer -> Index
// If current workspace is system, then need to invoke reader correspondent to
system index
IndexReader indexReader = getIndexReader(isSystem);
- ItemData root = itemStateManager.getItemData(Constants.ROOT_UUID);
- ItemDataIndexConsistencyVisitor visitor = new
ItemDataIndexConsistencyVisitor(itemStateManager, indexReader);
- root.accept(visitor);
+ try
+ {
+ ItemData root = itemStateManager.getItemData(Constants.ROOT_UUID);
+ ItemDataIndexConsistencyVisitor visitor = new
ItemDataIndexConsistencyVisitor(itemStateManager, indexReader);
+ root.accept(visitor);
- Set<String> documentUUIDs = visitor.getIndexedNodes();
+ Set<String> documentUUIDs = visitor.getIndexedNodes();
- // check relation Index -> Persistent Layer
- // find document that do not corresponds to real node
- // iterate on documents one-by-one
- for (int i = 0; i < indexReader.maxDoc(); i++)
- {
- if (indexReader.isDeleted(i))
+ // check relation Index -> Persistent Layer
+ // find document that do not corresponds to real node
+ // iterate on documents one-by-one
+ for (int i = 0; i < indexReader.maxDoc(); i++)
{
- continue;
+ if (indexReader.isDeleted(i))
+ {
+ continue;
+ }
+ final int currentIndex = i;
+ Document d = indexReader.document(currentIndex, FieldSelectors.UUID);
+ String uuid = d.get(FieldNames.UUID);
+ if (!documentUUIDs.contains(uuid))
+ {
+ inspectionLog.logBrokenObjectInfo("ID=" + uuid, "Document
corresponds to removed node.",
+ InspectionStatus.REINDEX);
+ }
}
- final int currentIndex = i;
- Document d = indexReader.document(currentIndex, FieldSelectors.UUID);
- String uuid = d.get(FieldNames.UUID);
- if (!documentUUIDs.contains(uuid))
- {
- inspectionLog.logBrokenObjectInfo("ID=" + uuid, "Document
corresponds to removed node.",
- InspectionStatus.REINDEX);
- }
}
+ finally
+ {
+ Util.closeOrRelease(indexReader);
+ }
}
/**
@@ -3388,7 +3395,7 @@
}
}
}
-
+
/**
* {@inheritDoc}
*/
Modified:
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/spell/LuceneSpellChecker.java
===================================================================
---
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/spell/LuceneSpellChecker.java 2011-11-21
07:41:27 UTC (rev 5206)
+++
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/spell/LuceneSpellChecker.java 2011-11-21
07:47:06 UTC (rev 5207)
@@ -33,6 +33,7 @@
import org.exoplatform.services.jcr.impl.core.query.TraversingQueryNodeVisitor;
import org.exoplatform.services.jcr.impl.core.query.lucene.FieldNames;
import org.exoplatform.services.jcr.impl.core.query.lucene.SearchIndex;
+import org.exoplatform.services.jcr.impl.core.query.lucene.Util;
import org.exoplatform.services.jcr.impl.core.query.lucene.directory.DirectoryManager;
import org.exoplatform.services.log.ExoLogger;
import org.exoplatform.services.log.Log;
@@ -466,7 +467,7 @@
{
public Object run() throws Exception
{
- reader.close();
+ Util.closeOrRelease(reader);
return null;
}
});
@@ -516,7 +517,7 @@
}
finally
{
- reader.close();
+ Util.closeOrRelease(reader);
synchronized (InternalSpellChecker.this)
{
refreshing = false;
Modified:
jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/core/query/BaseQueryTest.java
===================================================================
---
jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/core/query/BaseQueryTest.java 2011-11-21
07:41:27 UTC (rev 5206)
+++
jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/core/query/BaseQueryTest.java 2011-11-21
07:47:06 UTC (rev 5207)
@@ -25,6 +25,7 @@
import org.exoplatform.services.jcr.JcrImplBaseTest;
import org.exoplatform.services.jcr.impl.core.query.lucene.FieldNames;
import org.exoplatform.services.jcr.impl.core.query.lucene.SearchIndex;
+import org.exoplatform.services.jcr.impl.core.query.lucene.Util;
import org.exoplatform.services.log.ExoLogger;
import org.exoplatform.services.log.Log;
@@ -59,12 +60,22 @@
TermQuery query = new TermQuery(new Term(FieldNames.UUID, nodeIdentifer));
Hits result = is.search(query);
-
- if (result.length() == 1)
- return result.doc(0);
- else if (result.length() > 1)
- throw new RepositoryException("Results more then one");
-
+ try
+ {
+ if (result.length() == 1)
+ {
+ return result.doc(0);
+ }
+ else if (result.length() > 1)
+ {
+ throw new RepositoryException("Results more then one");
+ }
+ }
+ finally
+ {
+ is.close();
+ Util.closeOrRelease(reader);
+ }
return null;
}
Modified:
jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/core/query/TestArabicSearch.java
===================================================================
---
jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/core/query/TestArabicSearch.java 2011-11-21
07:41:27 UTC (rev 5206)
+++
jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/core/query/TestArabicSearch.java 2011-11-21
07:47:06 UTC (rev 5207)
@@ -25,6 +25,7 @@
import org.apache.lucene.search.TermQuery;
import org.exoplatform.services.jcr.impl.core.NodeImpl;
import org.exoplatform.services.jcr.impl.core.query.lucene.FieldNames;
+import org.exoplatform.services.jcr.impl.core.query.lucene.Util;
import java.io.File;
import java.io.FileInputStream;
@@ -80,6 +81,9 @@
Query q = qman.createQuery("SELECT * FROM nt:resource " + " WHERE
CONTAINS(., '" + word + "')", Query.SQL);
QueryResult res = q.execute();
assertEquals(1, res.getNodes().getSize());
+
+ is.close();
+ Util.closeOrRelease(reader);
}
/**
Modified:
jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/core/query/TestDateSearch.java
===================================================================
---
jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/core/query/TestDateSearch.java 2011-11-21
07:41:27 UTC (rev 5206)
+++
jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/core/query/TestDateSearch.java 2011-11-21
07:47:06 UTC (rev 5207)
@@ -25,6 +25,7 @@
import org.apache.lucene.search.TermQuery;
import org.exoplatform.services.jcr.impl.core.NodeImpl;
import org.exoplatform.services.jcr.impl.core.query.lucene.FieldNames;
+import org.exoplatform.services.jcr.impl.core.query.lucene.Util;
import java.io.File;
import java.io.FileInputStream;
@@ -78,6 +79,9 @@
Query q = qman.createQuery("SELECT * FROM nt:resource " + " WHERE
CONTAINS(., '" + word + "')", Query.SQL);
QueryResult res = q.execute();
assertEquals(1, res.getNodes().getSize());
+
+ is.close();
+ Util.closeOrRelease(reader);
}
}
Modified:
jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/core/query/TestExcelFileSearch.java
===================================================================
---
jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/core/query/TestExcelFileSearch.java 2011-11-21
07:41:27 UTC (rev 5206)
+++
jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/core/query/TestExcelFileSearch.java 2011-11-21
07:47:06 UTC (rev 5207)
@@ -29,6 +29,7 @@
import org.exoplatform.services.document.impl.tika.TikaDocumentReader;
import org.exoplatform.services.jcr.impl.core.NodeImpl;
import org.exoplatform.services.jcr.impl.core.query.lucene.FieldNames;
+import org.exoplatform.services.jcr.impl.core.query.lucene.Util;
import java.io.File;
import java.io.FileInputStream;
@@ -100,6 +101,8 @@
TermQuery query = new TermQuery(new Term(FieldNames.FULLTEXT, word));
Hits result = is.search(query);
assertEquals(1, result.length());
+ is.close();
+ Util.closeOrRelease(reader);
}
}
Modified:
jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/core/query/TestIndexingConfig.java
===================================================================
---
jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/core/query/TestIndexingConfig.java 2011-11-21
07:41:27 UTC (rev 5206)
+++
jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/core/query/TestIndexingConfig.java 2011-11-21
07:47:06 UTC (rev 5207)
@@ -32,6 +32,7 @@
import org.exoplatform.services.jcr.impl.core.query.lucene.FieldNames;
import org.exoplatform.services.jcr.impl.core.query.lucene.IndexingConfigurationImpl;
import org.exoplatform.services.jcr.impl.core.query.lucene.SearchIndex;
+import org.exoplatform.services.jcr.impl.core.query.lucene.Util;
import org.exoplatform.services.log.ExoLogger;
import org.exoplatform.services.log.Log;
@@ -178,8 +179,8 @@
hits = is.search(compl);
assertEquals(1, hits.length());
- //ir.close();
is.close();
+ Util.closeOrRelease(ir);
}
catch (Exception e)
{
@@ -249,8 +250,8 @@
hits = is.search(compl);
assertEquals(1, hits.length());
- ir.close();
is.close();
+ Util.closeOrRelease(ir);
}
catch (Exception e)
{
@@ -319,8 +320,8 @@
hits = is.search(compl);
assertEquals(1, hits.length());
- ir.close();
is.close();
+ Util.closeOrRelease(ir);
}
catch (Exception e)
{
@@ -390,8 +391,8 @@
hits = is.search(compl);
assertEquals(1, hits.length());
- ir.close();
is.close();
+ Util.closeOrRelease(ir);
}
catch (Exception e)
{
@@ -409,10 +410,22 @@
Hits result = is.search(query);
- if (result.length() == 1)
- return result.doc(0);
- else if (result.length() > 1)
- throw new RepositoryException("Results more then one");
+ try
+ {
+ if (result.length() == 1)
+ {
+ return result.doc(0);
+ }
+ else if (result.length() > 1)
+ {
+ throw new RepositoryException("Results more then one");
+ }
+ }
+ finally
+ {
+ is.close();
+ Util.closeOrRelease(reader);
+ }
return null;
}
Modified:
jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/core/query/TestRewriteNode.java
===================================================================
---
jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/core/query/TestRewriteNode.java 2011-11-21
07:41:27 UTC (rev 5206)
+++
jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/core/query/TestRewriteNode.java 2011-11-21
07:47:06 UTC (rev 5207)
@@ -24,6 +24,7 @@
import org.apache.lucene.search.TermQuery;
import org.exoplatform.services.jcr.impl.core.NodeImpl;
import org.exoplatform.services.jcr.impl.core.query.lucene.FieldNames;
+import org.exoplatform.services.jcr.impl.core.query.lucene.Util;
import java.util.Calendar;
@@ -71,6 +72,9 @@
result = is.search(query);
assertEquals(0, result.length());
+ is.close();
+ Util.closeOrRelease(reader);
+
}
}