You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by sh...@apache.org on 2017/03/14 06:40:54 UTC
[17/43] lucene-solr:feature/autoscaling: SOLR-10248: Merge
SolrTestCaseJ4's SolrIndexSearcher tracking into the ObjectReleaseTracker.
SOLR-10248: Merge SolrTestCaseJ4's SolrIndexSearcher tracking into the ObjectReleaseTracker.
Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/e35881a6
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/e35881a6
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/e35881a6
Branch: refs/heads/feature/autoscaling
Commit: e35881a63aa9de72cf5c539396266e0d0e676956
Parents: 6a6e303
Author: Mark Miller <ma...@apache.org>
Authored: Wed Mar 8 11:30:08 2017 -0500
Committer: Mark Miller <ma...@apache.org>
Committed: Wed Mar 8 11:44:23 2017 -0500
----------------------------------------------------------------------
.../apache/solr/search/SolrIndexSearcher.java | 3 +
.../java/org/apache/solr/SolrTestCaseJ4.java | 71 +++++---------------
2 files changed, 19 insertions(+), 55 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/e35881a6/solr/core/src/java/org/apache/solr/search/SolrIndexSearcher.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/search/SolrIndexSearcher.java b/solr/core/src/java/org/apache/solr/search/SolrIndexSearcher.java
index 521324a..a7ee433 100644
--- a/solr/core/src/java/org/apache/solr/search/SolrIndexSearcher.java
+++ b/solr/core/src/java/org/apache/solr/search/SolrIndexSearcher.java
@@ -105,6 +105,7 @@ import org.apache.solr.common.SolrException;
import org.apache.solr.common.SolrException.ErrorCode;
import org.apache.solr.common.params.ModifiableSolrParams;
import org.apache.solr.common.util.NamedList;
+import org.apache.solr.common.util.ObjectReleaseTracker;
import org.apache.solr.common.util.SimpleOrderedMap;
import org.apache.solr.core.DirectoryFactory;
import org.apache.solr.core.DirectoryFactory.DirContext;
@@ -391,6 +392,7 @@ public class SolrIndexSearcher extends IndexSearcher implements Closeable, SolrI
readerStats = snapStatistics(reader);
// do this at the end since an exception in the constructor means we won't close
numOpens.incrementAndGet();
+ assert ObjectReleaseTracker.track(this);
}
/*
@@ -539,6 +541,7 @@ public class SolrIndexSearcher extends IndexSearcher implements Closeable, SolrI
// do this at the end so it only gets done if there are no exceptions
numCloses.incrementAndGet();
+ assert ObjectReleaseTracker.release(this);
}
/** Direct access to the IndexSchema for use with this searcher */
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/e35881a6/solr/test-framework/src/java/org/apache/solr/SolrTestCaseJ4.java
----------------------------------------------------------------------
diff --git a/solr/test-framework/src/java/org/apache/solr/SolrTestCaseJ4.java b/solr/test-framework/src/java/org/apache/solr/SolrTestCaseJ4.java
index a8c93d6..825e7c7 100644
--- a/solr/test-framework/src/java/org/apache/solr/SolrTestCaseJ4.java
+++ b/solr/test-framework/src/java/org/apache/solr/SolrTestCaseJ4.java
@@ -297,17 +297,10 @@ public abstract class SolrTestCaseJ4 extends LuceneTestCase {
if (suiteFailureMarker.wasSuccessful()) {
// if the tests passed, make sure everything was closed / released
if (!RandomizedContext.current().getTargetClass().isAnnotationPresent(SuppressObjectReleaseTracker.class)) {
- endTrackingSearchers(120, false);
- String orr = clearObjectTrackerAndCheckEmpty(120);
+ String orr = clearObjectTrackerAndCheckEmpty(20, false);
assertNull(orr, orr);
} else {
- endTrackingSearchers(15, false);
- String orr = ObjectReleaseTracker.checkEmpty();
- if (orr != null) {
- log.warn(
- "Some resources were not closed, shutdown, or released. This has been ignored due to the SuppressObjectReleaseTracker annotation, trying to close them now.");
- ObjectReleaseTracker.tryClose();
- }
+ clearObjectTrackerAndCheckEmpty(20, true);
}
}
resetFactory();
@@ -341,6 +334,13 @@ public abstract class SolrTestCaseJ4 extends LuceneTestCase {
* @return null if ok else error message
*/
public static String clearObjectTrackerAndCheckEmpty(int waitSeconds) {
+ return clearObjectTrackerAndCheckEmpty(waitSeconds, false);
+ }
+
+ /**
+ * @return null if ok else error message
+ */
+ public static String clearObjectTrackerAndCheckEmpty(int waitSeconds, boolean tryClose) {
int retries = 0;
String result;
do {
@@ -367,6 +367,13 @@ public abstract class SolrTestCaseJ4 extends LuceneTestCase {
log.info("------------------------------------------------------- Done waiting for tracked resources to be released");
+
+ if (tryClose && result != null && RandomizedContext.current().getTargetClass().isAnnotationPresent(SuppressObjectReleaseTracker.class)) {
+ log.warn(
+ "Some resources were not closed, shutdown, or released. This has been ignored due to the SuppressObjectReleaseTracker annotation, trying to close them now.");
+ ObjectReleaseTracker.tryClose();
+ }
+
ObjectReleaseTracker.clear();
return result;
@@ -580,52 +587,6 @@ public abstract class SolrTestCaseJ4 extends LuceneTestCase {
numOpens = numCloses = 0;
}
}
-
- public static void endTrackingSearchers(int waitSeconds, boolean failTest) {
- long endNumOpens = SolrIndexSearcher.numOpens.get();
- long endNumCloses = SolrIndexSearcher.numCloses.get();
-
- // wait a bit in case any ending threads have anything to release
- int retries = 0;
- while (endNumOpens - numOpens != endNumCloses - numCloses) {
- if (retries++ > waitSeconds) {
- break;
- }
- if (retries % 10 == 0) {
- log.info("Waiting for all SolrIndexSearchers to be released at end of test");
- if (retries > 10) {
- TraceFormatting tf = new TraceFormatting();
- Map<Thread,StackTraceElement[]> stacksMap = Thread.getAllStackTraces();
- Set<Entry<Thread,StackTraceElement[]>> entries = stacksMap.entrySet();
- for (Entry<Thread,StackTraceElement[]> entry : entries) {
- String stack = tf.formatStackTrace(entry.getValue());
- System.err.println(entry.getKey().getName() + ":\n" + stack);
- }
- }
- }
- try {
- Thread.sleep(1000);
- } catch (InterruptedException e) {}
- endNumOpens = SolrIndexSearcher.numOpens.get();
- endNumCloses = SolrIndexSearcher.numCloses.get();
- }
-
- log.info("------------------------------------------------------- Done waiting for all SolrIndexSearchers to be released");
-
- SolrIndexSearcher.numOpens.getAndSet(0);
- SolrIndexSearcher.numCloses.getAndSet(0);
-
- if (endNumOpens-numOpens != endNumCloses-numCloses) {
- String msg = "ERROR: SolrIndexSearcher opens=" + (endNumOpens-numOpens) + " closes=" + (endNumCloses-numCloses);
- log.error(msg);
- // if it's TestReplicationHandler, ignore it. the test is broken and gets no love
- if ("TestReplicationHandler".equals(RandomizedContext.current().getTargetClass().getSimpleName())) {
- log.warn("TestReplicationHandler wants to fail!: " + msg);
- } else {
- if (failTest) fail(msg);
- }
- }
- }
/** Causes an exception matching the regex pattern to not be logged. */
public static void ignoreException(String pattern) {