This is an automated email from the ASF dual-hosted git repository.
markrmiller pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/solr.git
The following commit(s) were added to refs/heads/main by this push:
new 02bb9c7 SOLR-15659: ObjectReleaseTracker is now in the wrong class,
should leave no grace time. (#316)
02bb9c7 is described below
commit 02bb9c715091af0b4b741c27340abf7ccd4f3204
Author: Mark Robert Miller <[email protected]>
AuthorDate: Thu Oct 7 15:19:25 2021 -0500
SOLR-15659: ObjectReleaseTracker is now in the wrong class, should leave no
grace time. (#316)
---
.../solr/common/util/TestObjectReleaseTracker.java | 20 ++++----
.../solr/common/util/ObjectReleaseTracker.java | 20 ++++++++
.../src/java/org/apache/solr/SolrTestCase.java | 13 ++++-
.../src/java/org/apache/solr/SolrTestCaseJ4.java | 59 ----------------------
4 files changed, 41 insertions(+), 71 deletions(-)
diff --git
a/solr/core/src/test/org/apache/solr/common/util/TestObjectReleaseTracker.java
b/solr/core/src/test/org/apache/solr/common/util/TestObjectReleaseTracker.java
index 692b933..ddb3361 100644
---
a/solr/core/src/test/org/apache/solr/common/util/TestObjectReleaseTracker.java
+++
b/solr/core/src/test/org/apache/solr/common/util/TestObjectReleaseTracker.java
@@ -36,7 +36,7 @@ public class TestObjectReleaseTracker extends SolrTestCaseJ4 {
Object obj = new Object();
ObjectReleaseTracker.track(obj);
ObjectReleaseTracker.release(obj);
- assertNull(SolrTestCaseJ4.clearObjectTrackerAndCheckEmpty(1));
+ assertNull(ObjectReleaseTracker.clearObjectTrackerAndCheckEmpty());
Object obj1 = new Object();
ObjectReleaseTracker.track(obj1);
@@ -48,7 +48,7 @@ public class TestObjectReleaseTracker extends SolrTestCaseJ4 {
ObjectReleaseTracker.release(obj1);
ObjectReleaseTracker.release(obj2);
ObjectReleaseTracker.release(obj3);
- assertNull(SolrTestCaseJ4.clearObjectTrackerAndCheckEmpty(1));
+ assertNull(ObjectReleaseTracker.clearObjectTrackerAndCheckEmpty());
}
@Test
@@ -65,22 +65,22 @@ public class TestObjectReleaseTracker extends
SolrTestCaseJ4 {
ObjectReleaseTracker.release(obj2);
// ObjectReleaseTracker.release(obj3);
- assertNotNull(SolrTestCaseJ4.clearObjectTrackerAndCheckEmpty(1));
- assertNull(SolrTestCaseJ4.clearObjectTrackerAndCheckEmpty(1));
+ assertNotNull(ObjectReleaseTracker.clearObjectTrackerAndCheckEmpty());
+ assertNull(ObjectReleaseTracker.clearObjectTrackerAndCheckEmpty());
}
@Test
public void testReleaseDifferentObject() {
ObjectReleaseTracker.track(new Object());
ObjectReleaseTracker.release(new Object());
- assertNotNull(SolrTestCaseJ4.clearObjectTrackerAndCheckEmpty(1));
- assertNull(SolrTestCaseJ4.clearObjectTrackerAndCheckEmpty(1));
+ assertNotNull(ObjectReleaseTracker.clearObjectTrackerAndCheckEmpty());
+ assertNull(ObjectReleaseTracker.clearObjectTrackerAndCheckEmpty());
}
@Test
public void testAnonymousClasses() {
ObjectReleaseTracker.track(new Object() {});
- String message = SolrTestCaseJ4.clearObjectTrackerAndCheckEmpty(1);
+ String message = ObjectReleaseTracker.clearObjectTrackerAndCheckEmpty();
MatcherAssert.assertThat(message, containsString("[Object]"));
}
@@ -94,7 +94,7 @@ public class TestObjectReleaseTracker extends SolrTestCaseJ4 {
});
result.get(); // make sure that track has been called
- String message = SolrTestCaseJ4.clearObjectTrackerAndCheckEmpty(1);
+ String message = ObjectReleaseTracker.clearObjectTrackerAndCheckEmpty();
MatcherAssert.assertThat(message, stringContainsInOrder(
ObjectReleaseTracker.ObjectTrackerException.class.getName(),
"Exception: Submitter stack trace",
@@ -110,7 +110,7 @@ public class TestObjectReleaseTracker extends
SolrTestCaseJ4 {
result.get();
indirectResult.get().get();
- message = SolrTestCaseJ4.clearObjectTrackerAndCheckEmpty(1);
+ message = ObjectReleaseTracker.clearObjectTrackerAndCheckEmpty();
MatcherAssert.assertThat(message, stringContainsInOrder(
ObjectReleaseTracker.ObjectTrackerException.class.getName(),
"Exception: Submitter stack trace",
@@ -130,7 +130,7 @@ public class TestObjectReleaseTracker extends
SolrTestCaseJ4 {
result.get();
indirectResult.get().get();
indirectIndirect.get().get();
- message = SolrTestCaseJ4.clearObjectTrackerAndCheckEmpty(1);
+ message = ObjectReleaseTracker.clearObjectTrackerAndCheckEmpty();
MatcherAssert.assertThat(message, stringContainsInOrder(
ObjectReleaseTracker.ObjectTrackerException.class.getName(),
"Exception: Submitter stack trace",
diff --git
a/solr/solrj/src/java/org/apache/solr/common/util/ObjectReleaseTracker.java
b/solr/solrj/src/java/org/apache/solr/common/util/ObjectReleaseTracker.java
index 59927b1..316136f 100644
--- a/solr/solrj/src/java/org/apache/solr/common/util/ObjectReleaseTracker.java
+++ b/solr/solrj/src/java/org/apache/solr/common/util/ObjectReleaseTracker.java
@@ -22,6 +22,8 @@ import java.io.PrintWriter;
import java.io.StringWriter;
import java.lang.invoke.MethodHandles;
import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap;
@@ -32,6 +34,15 @@ import org.slf4j.LoggerFactory;
public class ObjectReleaseTracker {
private static final Logger log =
LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
+
+ private static final List<String> DEFAULT_STACK_FILTERS = Arrays.asList(new
String [] {
+ "org.junit.",
+ "junit.framework.",
+ "sun.",
+ "java.lang.reflect.",
+ "com.carrotsearch.randomizedtesting.",
+ });
+
public static final Map<Object, Exception> OBJECTS = new
ConcurrentHashMap<>();
public static boolean track(Object object) {
@@ -97,6 +108,15 @@ public class ObjectReleaseTracker {
}
}
}
+
+ /**
+ * @return null if ok else error message
+ */
+ public static String clearObjectTrackerAndCheckEmpty() {
+ String result = ObjectReleaseTracker.checkEmpty();
+ ObjectReleaseTracker.clear();
+ return result;
+ }
static class ObjectTrackerException extends RuntimeException {
ObjectTrackerException(String msg, Throwable submitter) {
diff --git a/solr/test-framework/src/java/org/apache/solr/SolrTestCase.java
b/solr/test-framework/src/java/org/apache/solr/SolrTestCase.java
index b215c69..0cda87b 100644
--- a/solr/test-framework/src/java/org/apache/solr/SolrTestCase.java
+++ b/solr/test-framework/src/java/org/apache/solr/SolrTestCase.java
@@ -25,6 +25,7 @@ import
com.carrotsearch.randomizedtesting.annotations.ThreadLeakLingering;
import org.apache.lucene.util.LuceneTestCase;
import org.apache.lucene.util.QuickPatchThreadsFilter;
import org.apache.lucene.util.VerifyTestClassNamingConvention;
+import org.apache.solr.common.util.ObjectReleaseTracker;
import org.apache.solr.servlet.SolrDispatchFilter;
import org.apache.solr.util.ExternalPaths;
import org.apache.solr.util.RevertDefaultThreadHandlerRule;
@@ -73,7 +74,7 @@ public class SolrTestCase extends LuceneTestCase {
* on completion of the test suite
* </p>
* @see <a
href="https://issues.apache.org/jira/browse/SOLR-14247">SOLR-14247</a>
- * @see #shutdownLogger
+ * @see #afterSolrTestCase()
*/
private static final Logger log =
LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
@@ -149,7 +150,15 @@ public class SolrTestCase extends LuceneTestCase {
}
@AfterClass
- public static void shutdownLogger() throws Exception {
+ public static void afterSolrTestCase() throws Exception {
+ if (suiteFailureMarker.wasSuccessful()) {
+ // if the tests passed, make sure everything was closed / released
+ String orr = ObjectReleaseTracker.clearObjectTrackerAndCheckEmpty();
+ assertNull(orr, orr);
+ } else {
+ ObjectReleaseTracker.tryClose();
+ }
StartupLoggingUtils.shutdown();
}
+
}
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 3f4e62a..c696719 100644
--- a/solr/test-framework/src/java/org/apache/solr/SolrTestCaseJ4.java
+++ b/solr/test-framework/src/java/org/apache/solr/SolrTestCaseJ4.java
@@ -70,7 +70,6 @@ import java.util.stream.Collectors;
import com.carrotsearch.randomizedtesting.RandomizedContext;
import com.carrotsearch.randomizedtesting.RandomizedTest;
-import com.carrotsearch.randomizedtesting.TraceFormatting;
import com.carrotsearch.randomizedtesting.rules.SystemPropertiesRestoreRule;
import io.opentracing.noop.NoopTracerFactory;
@@ -184,14 +183,6 @@ import static
org.hamcrest.core.StringContains.containsString;
public abstract class SolrTestCaseJ4 extends SolrTestCase {
private static final Logger log =
LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
-
- private static final List<String> DEFAULT_STACK_FILTERS = Arrays.asList(new
String [] {
- "org.junit.",
- "junit.framework.",
- "sun.",
- "java.lang.reflect.",
- "com.carrotsearch.randomizedtesting.",
- });
public static final String DEFAULT_TEST_COLLECTION_NAME = "collection1";
public static final String DEFAULT_TEST_CORENAME =
DEFAULT_TEST_COLLECTION_NAME;
@@ -373,13 +364,6 @@ public abstract class SolrTestCaseJ4 extends SolrTestCase {
resetExceptionIgnores();
- if (suiteFailureMarker.wasSuccessful()) {
- // if the tests passed, make sure everything was closed / released
- String orr = clearObjectTrackerAndCheckEmpty(60, false);
- assertNull(orr, orr);
- } else {
- ObjectReleaseTracker.tryClose();
- }
resetFactory();
coreName = DEFAULT_TEST_CORENAME;
} finally {
@@ -442,49 +426,6 @@ public abstract class SolrTestCaseJ4 extends SolrTestCase {
fail("ByteBuddy and Mockito are not available on classpath: " +
e.toString());
}
}
-
- /**
- * @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 {
- result = ObjectReleaseTracker.checkEmpty();
- if (result == null)
- break;
- try {
- if (retries % 10 == 0) {
- log.info("Waiting for all tracked resources to be released");
- if (retries > 10) {
- TraceFormatting tf = new TraceFormatting(DEFAULT_STACK_FILTERS);
- 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);
- }
- }
- }
- TimeUnit.SECONDS.sleep(1);
- } catch (InterruptedException e) { break; }
- }
- while (retries++ < waitSeconds);
-
-
- log.info("------------------------------------------------------- Done
waiting for tracked resources to be released");
-
- ObjectReleaseTracker.clear();
-
- return result;
- }
@SuppressForbidden(reason = "Using the Level class from log4j2 directly")
private static Map<String, Level> savedClassLogLevels = new HashMap<>();