diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt index d2055a2e956..16306146fdc 100644 --- a/solr/CHANGES.txt +++ b/solr/CHANGES.txt @@ -239,6 +239,10 @@ Other Changes * SOLR-14169: Fix 20 Resource Leak warnings in SolrJ's apache/solr/common (Andras Salamon via Tomás Fernández Löbbe) +* SOLR-14184: Internal 'test' variable DirectUpdateHandler2.commitOnClose has been removed and replaced with + TestInjection.skipIndexWriterCommitOnClose. Users that modified DUH2.commitOnClose in test cases for custom + plugins/modicitations should now use TestInjection instead. (hossman) + ================== 8.4.1 ================== Consult the LUCENE_CHANGES.txt file for additional, low level, changes in this release. diff --git a/solr/core/src/java/org/apache/solr/update/DirectUpdateHandler2.java b/solr/core/src/java/org/apache/solr/update/DirectUpdateHandler2.java index b00dc16e574..9bbd8fc486c 100644 --- a/solr/core/src/java/org/apache/solr/update/DirectUpdateHandler2.java +++ b/solr/core/src/java/org/apache/solr/update/DirectUpdateHandler2.java @@ -814,13 +814,11 @@ public class DirectUpdateHandler2 extends UpdateHandler implements SolrCoreState } } - - public static volatile boolean commitOnClose = true; // TODO: make this a real config option or move it to TestInjection - // IndexWriterCloser interface method - called from solrCoreState.decref(this) @Override public void closeWriter(IndexWriter writer) throws IOException { - + log.trace("closeWriter({}): ulog={}", writer, ulog); + assert TestInjection.injectNonGracefullClose(core.getCoreContainer()); boolean clearRequestInfo = false; @@ -832,18 +830,21 @@ public class DirectUpdateHandler2 extends UpdateHandler implements SolrCoreState SolrRequestInfo.setRequestInfo(new SolrRequestInfo(req, rsp)); // important for debugging } try { - if (!commitOnClose) { + + if (TestInjection.injectSkipIndexWriterCommitOnClose(writer)) { + // if this TestInjection triggers, we do some simple rollback() + // (which closes the underlying IndexWriter) and then return immediately + log.warn("Skipping commit for IndexWriter.close() due to TestInjection"); if (writer != null) { writer.rollback(); } - // we shouldn't close the transaction logs either, but leaving them open // means we can't delete them on windows (needed for tests) if (ulog != null) ulog.close(false); return; } - + // do a commit before we quit? boolean tryToCommit = writer != null && ulog != null && ulog.hasUncommittedChanges() && ulog.getState() == UpdateLog.State.ACTIVE; @@ -852,8 +853,9 @@ public class DirectUpdateHandler2 extends UpdateHandler implements SolrCoreState solrCoreState.getCommitLock().lock(); try { try { + log.info("Committing on IndexWriter.close() {}.", + (tryToCommit ? "" : " ... SKIPPED (unnecessary)")); if (tryToCommit) { - log.info("Committing on IndexWriter close."); CommitUpdateCommand cmd = new CommitUpdateCommand(req, false); cmd.openSearcher = false; cmd.waitSearcher = false; diff --git a/solr/core/src/java/org/apache/solr/util/TestInjection.java b/solr/core/src/java/org/apache/solr/util/TestInjection.java index 9af4a8f625a..ec120d617fe 100644 --- a/solr/core/src/java/org/apache/solr/util/TestInjection.java +++ b/solr/core/src/java/org/apache/solr/util/TestInjection.java @@ -103,7 +103,7 @@ public class TestInjection { } public volatile static String nonGracefullClose = null; - + public volatile static String failReplicaRequests = null; public volatile static String failUpdateRequests = null; @@ -146,6 +146,15 @@ public class TestInjection { public volatile static boolean failInExecutePlanAction = false; + /** + * Defaults to false, If set to true, + * then {@link #injectSkipIndexWriterCommitOnClose} will return true + * + * @see #injectSkipIndexWriterCommitOnClose + * @see org.apache.solr.update.DirectUpdateHandler2#closeWriter + */ + public volatile static boolean skipIndexWriterCommitOnClose = false; + public volatile static boolean uifOutOfMemoryError = false; private volatile static CountDownLatch notifyPauseForeverDone = new CountDownLatch(1); @@ -176,6 +185,7 @@ public class TestInjection { delayBeforeSlaveCommitRefresh = null; delayInExecutePlanAction = null; failInExecutePlanAction = false; + skipIndexWriterCommitOnClose = false; uifOutOfMemoryError = false; notifyPauseForeverDone(); newSearcherHooks.clear(); @@ -278,6 +288,21 @@ public class TestInjection { return true; } + /** + * Returns the value of {@link #skipIndexWriterCommitOnClose}. + * + * @param indexWriter used only for logging + * @see #skipIndexWriterCommitOnClose + * @see org.apache.solr.update.DirectUpdateHandler2#closeWriter + */ + public static boolean injectSkipIndexWriterCommitOnClose(Object indexWriter) { + if (skipIndexWriterCommitOnClose) { + log.info("Inject failure: skipIndexWriterCommitOnClose={}: {}", + skipIndexWriterCommitOnClose, indexWriter); + } + return skipIndexWriterCommitOnClose; + } + public static boolean injectFailReplicaRequests() { if (failReplicaRequests != null) { Random rand = random(); diff --git a/solr/core/src/test/org/apache/solr/cloud/SharedFSAutoReplicaFailoverTest.java b/solr/core/src/test/org/apache/solr/cloud/SharedFSAutoReplicaFailoverTest.java index e371e340361..70bf0e67f18 100644 --- a/solr/core/src/test/org/apache/solr/cloud/SharedFSAutoReplicaFailoverTest.java +++ b/solr/core/src/test/org/apache/solr/cloud/SharedFSAutoReplicaFailoverTest.java @@ -57,10 +57,10 @@ import org.apache.solr.common.params.SolrParams; import org.apache.solr.common.util.ExecutorUtil; import org.apache.solr.common.util.TimeSource; import org.apache.solr.core.CoreDescriptor; -import org.apache.solr.update.DirectUpdateHandler2; import org.apache.solr.util.DefaultSolrThreadFactory; import org.apache.solr.util.BadHdfsThreadsFilter; import org.apache.solr.util.LogLevel; +import org.apache.solr.util.TestInjection; import org.apache.solr.util.TimeOut; import org.junit.AfterClass; import org.junit.Before; @@ -146,10 +146,10 @@ public class SharedFSAutoReplicaFailoverTest extends AbstractFullDistribZkTestBa public void test() throws Exception { try { // to keep uncommitted docs during failover - DirectUpdateHandler2.commitOnClose = false; + TestInjection.skipIndexWriterCommitOnClose = true; testBasics(); } finally { - DirectUpdateHandler2.commitOnClose = true; + TestInjection.reset(); if (DEBUG) { super.printLayout(); } diff --git a/solr/core/src/test/org/apache/solr/cloud/TestCloudRecovery.java b/solr/core/src/test/org/apache/solr/cloud/TestCloudRecovery.java index 6204003075e..2afeea9ade4 100644 --- a/solr/core/src/test/org/apache/solr/cloud/TestCloudRecovery.java +++ b/solr/core/src/test/org/apache/solr/cloud/TestCloudRecovery.java @@ -36,9 +36,9 @@ import org.apache.solr.common.cloud.ClusterStateUtil; import org.apache.solr.common.params.ModifiableSolrParams; import org.apache.solr.core.SolrCore; import org.apache.solr.metrics.SolrMetricManager; -import org.apache.solr.update.DirectUpdateHandler2; import org.apache.solr.update.UpdateLog; import org.apache.solr.update.UpdateShardHandler; +import org.apache.solr.util.TestInjection; import org.junit.After; import org.junit.Before; import org.junit.BeforeClass; @@ -90,6 +90,7 @@ public class TestCloudRecovery extends SolrCloudTestCase { @After public void afterTest() throws Exception { + TestInjection.reset(); // do after every test, don't wait for AfterClass shutdownCluster(); } @@ -97,7 +98,7 @@ public class TestCloudRecovery extends SolrCloudTestCase { // commented 4-Sep-2018 @BadApple(bugUrl="https://issues.apache.org/jira/browse/SOLR-12028") // added 20-Jul-2018 public void leaderRecoverFromLogOnStartupTest() throws Exception { AtomicInteger countReplayLog = new AtomicInteger(0); - DirectUpdateHandler2.commitOnClose = false; + TestInjection.skipIndexWriterCommitOnClose = true; UpdateLog.testing_logReplayFinishHook = countReplayLog::incrementAndGet; CloudSolrClient cloudClient = cluster.getSolrClient(); @@ -163,7 +164,7 @@ public class TestCloudRecovery extends SolrCloudTestCase { // commented out on: 17-Feb-2019 @BadApple(bugUrl="https://issues.apache.org/jira/browse/SOLR-12028") // 14-Oct-2018 public void corruptedLogTest() throws Exception { AtomicInteger countReplayLog = new AtomicInteger(0); - DirectUpdateHandler2.commitOnClose = false; + TestInjection.skipIndexWriterCommitOnClose = true; UpdateLog.testing_logReplayFinishHook = countReplayLog::incrementAndGet; CloudSolrClient cloudClient = cluster.getSolrClient(); diff --git a/solr/core/src/test/org/apache/solr/cloud/TestTlogReplayVsRecovery.java b/solr/core/src/test/org/apache/solr/cloud/TestTlogReplayVsRecovery.java index 9a6d08cd29f..09d38854cdf 100644 --- a/solr/core/src/test/org/apache/solr/cloud/TestTlogReplayVsRecovery.java +++ b/solr/core/src/test/org/apache/solr/cloud/TestTlogReplayVsRecovery.java @@ -40,7 +40,6 @@ import org.apache.solr.client.solrj.response.RequestStatusState; import org.apache.solr.common.SolrInputDocument; import org.apache.solr.common.cloud.Replica; import org.apache.solr.common.util.TimeSource; -import org.apache.solr.update.DirectUpdateHandler2; import org.apache.solr.util.TestInjection; import org.apache.solr.util.TimeOut; import org.junit.After; @@ -64,11 +63,11 @@ public class TestTlogReplayVsRecovery extends SolrCloudTestCase { // we also want to ensure that our leader doesn't do a "Commit on close" // // TODO: once SOLR-13486 is fixed, we should randomize this... - private static final boolean TEST_VALUE_FOR_COMMIT_ON_CLOSE = false; + private static final boolean TEST_VALUE_FOR_SKIP_COMMIT_ON_CLOSE = true; @Before public void setupCluster() throws Exception { - DirectUpdateHandler2.commitOnClose = TEST_VALUE_FOR_COMMIT_ON_CLOSE; + TestInjection.skipIndexWriterCommitOnClose = TEST_VALUE_FOR_SKIP_COMMIT_ON_CLOSE; System.setProperty("solr.directoryFactory", "solr.StandardDirectoryFactory"); System.setProperty("solr.ulog.numRecordsToKeep", "1000"); @@ -99,7 +98,6 @@ public class TestTlogReplayVsRecovery extends SolrCloudTestCase { @After public void tearDownCluster() throws Exception { TestInjection.reset(); - DirectUpdateHandler2.commitOnClose = true; if (null != proxies) { for (SocketProxy proxy : proxies.values()) { @@ -163,8 +161,8 @@ public class TestTlogReplayVsRecovery extends SolrCloudTestCase { addDocs(false, uncommittedDocs, committedDocs + 1); log.info("Stopping leader node..."); - assertEquals("Something broke our expected commitOnClose", - TEST_VALUE_FOR_COMMIT_ON_CLOSE, DirectUpdateHandler2.commitOnClose); + assertEquals("Something broke our expected skipIndexWriterCommitOnClose", + TEST_VALUE_FOR_SKIP_COMMIT_ON_CLOSE, TestInjection.skipIndexWriterCommitOnClose); NODE0.stop(); cluster.waitForJettyToStop(NODE0); diff --git a/solr/core/src/test/org/apache/solr/cloud/TestTlogReplica.java b/solr/core/src/test/org/apache/solr/cloud/TestTlogReplica.java index 58f3b7a9f17..aab27c0019c 100644 --- a/solr/core/src/test/org/apache/solr/cloud/TestTlogReplica.java +++ b/solr/core/src/test/org/apache/solr/cloud/TestTlogReplica.java @@ -62,7 +62,6 @@ import org.apache.solr.common.cloud.ZkStateReader; import org.apache.solr.common.util.NamedList; import org.apache.solr.common.util.TimeSource; import org.apache.solr.core.SolrCore; -import org.apache.solr.update.DirectUpdateHandler2; import org.apache.solr.update.SolrIndexWriter; import org.apache.solr.util.RefCounted; import org.apache.solr.util.TestInjection; @@ -568,10 +567,13 @@ public class TestTlogReplica extends SolrCloudTestCase { log.info("Min RF not achieved yet. retrying"); } checkRTG(3,7, cluster.getJettySolrRunners()); - DirectUpdateHandler2.commitOnClose = false; - solrRunner.stop(); - waitForState("Replica still up", collectionName, activeReplicaCount(0,1,0)); - DirectUpdateHandler2.commitOnClose = true; + try { + TestInjection.skipIndexWriterCommitOnClose = true; + solrRunner.stop(); + waitForState("Replica still up", collectionName, activeReplicaCount(0,1,0)); + } finally { + TestInjection.skipIndexWriterCommitOnClose = false; + } solrRunner.start(); waitForState("Replica didn't recover", collectionName, activeReplicaCount(0,2,0)); waitForNumDocsInAllReplicas(5, getNonLeaderReplias(collectionName), 10); //timeout for stale collection state diff --git a/solr/core/src/test/org/apache/solr/cloud/UnloadDistributedZkTest.java b/solr/core/src/test/org/apache/solr/cloud/UnloadDistributedZkTest.java index 003e933047c..dfd9dc768ed 100644 --- a/solr/core/src/test/org/apache/solr/cloud/UnloadDistributedZkTest.java +++ b/solr/core/src/test/org/apache/solr/cloud/UnloadDistributedZkTest.java @@ -34,8 +34,8 @@ import org.apache.solr.common.params.ModifiableSolrParams; import org.apache.solr.common.util.ExecutorUtil; import org.apache.solr.common.util.TimeSource; import org.apache.solr.core.SolrCore; -import org.apache.solr.update.DirectUpdateHandler2; import org.apache.solr.util.DefaultSolrThreadFactory; +import org.apache.solr.util.TestInjection; import org.apache.solr.util.TimeOut; import org.junit.Test; @@ -217,7 +217,7 @@ public class UnloadDistributedZkTest extends BasicDistributedZkTest { waitForRecoveriesToFinish("unloadcollection", zkStateReader, false); // so that we start with some versions when we reload... - DirectUpdateHandler2.commitOnClose = false; + TestInjection.skipIndexWriterCommitOnClose = true; try (HttpSolrClient addClient = getHttpSolrClient(jettys.get(2).getBaseUrl() + "/unloadcollection_shard1_replica3", 30000)) { @@ -290,8 +290,7 @@ public class UnloadDistributedZkTest extends BasicDistributedZkTest { zkStateReader.getLeaderRetry("unloadcollection", "shard1", 15000); - // set this back - DirectUpdateHandler2.commitOnClose = true; + TestInjection.skipIndexWriterCommitOnClose = false; // set this back assertTrue(CollectionAdminRequest .addReplicaToShard("unloadcollection", "shard1") .setCoreName(leaderProps.getCoreName()) diff --git a/solr/core/src/test/org/apache/solr/core/TestLazyCores.java b/solr/core/src/test/org/apache/solr/core/TestLazyCores.java index f9d2dad7c0a..302fdc8b742 100644 --- a/solr/core/src/test/org/apache/solr/core/TestLazyCores.java +++ b/solr/core/src/test/org/apache/solr/core/TestLazyCores.java @@ -43,7 +43,6 @@ import org.apache.solr.response.SolrQueryResponse; import org.apache.solr.servlet.SolrDispatchFilter; import org.apache.solr.update.AddUpdateCommand; import org.apache.solr.update.CommitUpdateCommand; -import org.apache.solr.update.DirectUpdateHandler2; import org.apache.solr.update.UpdateHandler; import org.apache.solr.util.ReadOnlyCoresLocator; import org.junit.BeforeClass; @@ -798,8 +797,6 @@ public class TestLazyCores extends SolrTestCaseJ4 { // Cores 2, 3, 6, 7, 8, 9 are transient @Test public void testNoCommit() throws Exception { - DirectUpdateHandler2.commitOnClose = true; - CoreContainer cc = init(); String[] coreList = new String[]{ "collection2", diff --git a/solr/core/src/test/org/apache/solr/schema/TestSchemalessBufferedUpdates.java b/solr/core/src/test/org/apache/solr/schema/TestSchemalessBufferedUpdates.java index 96ee4c6188c..a4a9b2bcec9 100644 --- a/solr/core/src/test/org/apache/solr/schema/TestSchemalessBufferedUpdates.java +++ b/solr/core/src/test/org/apache/solr/schema/TestSchemalessBufferedUpdates.java @@ -26,13 +26,13 @@ import org.apache.solr.request.SolrQueryRequest; import org.apache.solr.request.SolrRequestInfo; import org.apache.solr.response.SolrQueryResponse; import org.apache.solr.update.AddUpdateCommand; -import org.apache.solr.update.DirectUpdateHandler2; import org.apache.solr.update.UpdateLog; import org.apache.solr.update.UpdateHandler; import org.apache.solr.update.processor.DistributedUpdateProcessorFactory; import org.apache.solr.update.processor.UpdateRequestProcessor; import org.apache.solr.update.processor.UpdateRequestProcessorChain; import org.apache.solr.update.processor.UpdateRequestProcessorFactory; +import org.apache.solr.util.TestInjection; import org.junit.BeforeClass; import org.junit.Test; @@ -70,7 +70,7 @@ public class TestSchemalessBufferedUpdates extends SolrTestCaseJ4 { @Test public void test() throws Exception { - DirectUpdateHandler2.commitOnClose = false; + TestInjection.skipIndexWriterCommitOnClose = true; final Semaphore logReplay = new Semaphore(0); final Semaphore logReplayFinish = new Semaphore(0); UpdateLog.testing_logReplayHook = () -> { @@ -118,7 +118,7 @@ public class TestSchemalessBufferedUpdates extends SolrTestCaseJ4 { assertU(commit()); assertJQ(req("q", "*:*"), "/response/numFound==2"); } finally { - DirectUpdateHandler2.commitOnClose = true; + TestInjection.reset(); UpdateLog.testing_logReplayHook = null; UpdateLog.testing_logReplayFinishHook = null; req().close(); diff --git a/solr/core/src/test/org/apache/solr/search/TestRecovery.java b/solr/core/src/test/org/apache/solr/search/TestRecovery.java index 09b9b2f15e2..f4df24c9483 100644 --- a/solr/core/src/test/org/apache/solr/search/TestRecovery.java +++ b/solr/core/src/test/org/apache/solr/search/TestRecovery.java @@ -46,10 +46,10 @@ import org.apache.solr.common.util.Utils; import org.apache.solr.metrics.SolrMetricManager; import org.apache.solr.request.SolrQueryRequest; import org.apache.solr.schema.IndexSchema; -import org.apache.solr.update.DirectUpdateHandler2; import org.apache.solr.update.UpdateHandler; import org.apache.solr.update.UpdateLog; import org.apache.solr.update.processor.DistributedUpdateProcessor.DistribPhase; +import org.apache.solr.util.TestInjection; import org.apache.solr.util.TimeOut; import org.junit.After; import org.junit.Before; @@ -88,6 +88,7 @@ public class TestRecovery extends SolrTestCaseJ4 { @After public void afterTest() { + TestInjection.reset(); // do after every test, don't wait for AfterClass if (savedFactory == null) { System.clearProperty("solr.directoryFactory"); } else { @@ -107,7 +108,7 @@ public class TestRecovery extends SolrTestCaseJ4 { public void stressLogReplay() throws Exception { final int NUM_UPDATES = 150; try { - DirectUpdateHandler2.commitOnClose = false; + TestInjection.skipIndexWriterCommitOnClose = true; final Semaphore logReplay = new Semaphore(0); final Semaphore logReplayFinish = new Semaphore(0); @@ -176,7 +177,6 @@ public class TestRecovery extends SolrTestCaseJ4 { "/response/docs==[{'val_i_dvo':"+entry.getValue()+"}]"); } } finally { - DirectUpdateHandler2.commitOnClose = true; UpdateLog.testing_logReplayHook = null; UpdateLog.testing_logReplayFinishHook = null; } @@ -187,7 +187,7 @@ public class TestRecovery extends SolrTestCaseJ4 { try { - DirectUpdateHandler2.commitOnClose = false; + TestInjection.skipIndexWriterCommitOnClose = true; final Semaphore logReplay = new Semaphore(0); final Semaphore logReplayFinish = new Semaphore(0); @@ -294,7 +294,6 @@ public class TestRecovery extends SolrTestCaseJ4 { assertEquals(UpdateLog.State.ACTIVE, h.getCore().getUpdateHandler().getUpdateLog().getState()); } finally { - DirectUpdateHandler2.commitOnClose = true; UpdateLog.testing_logReplayHook = null; UpdateLog.testing_logReplayFinishHook = null; } @@ -305,7 +304,7 @@ public class TestRecovery extends SolrTestCaseJ4 { public void testNewDBQAndDocMatchingOldDBQDuringLogReplay() throws Exception { try { - DirectUpdateHandler2.commitOnClose = false; + TestInjection.skipIndexWriterCommitOnClose = true; final Semaphore logReplay = new Semaphore(0); final Semaphore logReplayFinish = new Semaphore(0); @@ -366,7 +365,6 @@ public class TestRecovery extends SolrTestCaseJ4 { , "/response/docs==[{'id':'B0'}, {'id':'B3'}, {'id':'B5'}, {'id':'B6'}]"); } finally { - DirectUpdateHandler2.commitOnClose = true; UpdateLog.testing_logReplayHook = null; UpdateLog.testing_logReplayFinishHook = null; } @@ -483,7 +481,7 @@ public class TestRecovery extends SolrTestCaseJ4 { try { - DirectUpdateHandler2.commitOnClose = false; + TestInjection.skipIndexWriterCommitOnClose = true; final Semaphore logReplay = new Semaphore(0); final Semaphore logReplayFinish = new Semaphore(0); @@ -528,7 +526,6 @@ public class TestRecovery extends SolrTestCaseJ4 { } catch (Throwable thr) { throw new Exception(thr); } finally { - DirectUpdateHandler2.commitOnClose = true; UpdateLog.testing_logReplayHook = null; UpdateLog.testing_logReplayFinishHook = null; } @@ -538,7 +535,7 @@ public class TestRecovery extends SolrTestCaseJ4 { @Test public void testBuffering() throws Exception { - DirectUpdateHandler2.commitOnClose = false; + TestInjection.skipIndexWriterCommitOnClose = true; final Semaphore logReplay = new Semaphore(0); final Semaphore logReplayFinish = new Semaphore(0); @@ -712,7 +709,6 @@ public class TestRecovery extends SolrTestCaseJ4 { assertEquals(0, bufferedOps.getValue().intValue()); } finally { - DirectUpdateHandler2.commitOnClose = true; UpdateLog.testing_logReplayHook = null; UpdateLog.testing_logReplayFinishHook = null; @@ -725,7 +721,7 @@ public class TestRecovery extends SolrTestCaseJ4 { @Test public void testDropBuffered() throws Exception { - DirectUpdateHandler2.commitOnClose = false; + TestInjection.skipIndexWriterCommitOnClose = true; final Semaphore logReplay = new Semaphore(0); final Semaphore logReplayFinish = new Semaphore(0); @@ -858,7 +854,6 @@ public class TestRecovery extends SolrTestCaseJ4 { assertEquals(UpdateLog.State.ACTIVE, ulog.getState()); // leave each test method in a good state } finally { - DirectUpdateHandler2.commitOnClose = true; UpdateLog.testing_logReplayHook = null; UpdateLog.testing_logReplayFinishHook = null; @@ -870,7 +865,7 @@ public class TestRecovery extends SolrTestCaseJ4 { @Test public void testBufferedMultipleCalls() throws Exception { - DirectUpdateHandler2.commitOnClose = false; + TestInjection.skipIndexWriterCommitOnClose = true; final Semaphore logReplay = new Semaphore(0); final Semaphore logReplayFinish = new Semaphore(0); @@ -964,7 +959,6 @@ public class TestRecovery extends SolrTestCaseJ4 { assertEquals(UpdateLog.State.ACTIVE, ulog.getState()); // leave each test method in a good state } finally { - DirectUpdateHandler2.commitOnClose = true; UpdateLog.testing_logReplayHook = null; UpdateLog.testing_logReplayFinishHook = null; @@ -1009,7 +1003,7 @@ public class TestRecovery extends SolrTestCaseJ4 { @Test public void testExistOldBufferLog() throws Exception { - DirectUpdateHandler2.commitOnClose = false; + TestInjection.skipIndexWriterCommitOnClose = true; SolrQueryRequest req = req(); UpdateHandler uhandler = req.getCore().getUpdateHandler(); @@ -1083,7 +1077,6 @@ public class TestRecovery extends SolrTestCaseJ4 { assertJQ(req("qt","/get", "id", "Q7") ,"/doc/id==Q7"); } finally { - DirectUpdateHandler2.commitOnClose = true; UpdateLog.testing_logReplayHook = null; UpdateLog.testing_logReplayFinishHook = null; @@ -1127,7 +1120,6 @@ public class TestRecovery extends SolrTestCaseJ4 { // make sure that log isn't needlessly replayed after a clean close @Test public void testCleanShutdown() throws Exception { - DirectUpdateHandler2.commitOnClose = true; final Semaphore logReplay = new Semaphore(0); final Semaphore logReplayFinish = new Semaphore(0); @@ -1168,7 +1160,6 @@ public class TestRecovery extends SolrTestCaseJ4 { assertEquals(10, logReplay.availablePermits()); } finally { - DirectUpdateHandler2.commitOnClose = true; UpdateLog.testing_logReplayHook = null; UpdateLog.testing_logReplayFinishHook = null; @@ -1186,7 +1177,7 @@ public class TestRecovery extends SolrTestCaseJ4 { @Test public void testRemoveOldLogs() throws Exception { try { - DirectUpdateHandler2.commitOnClose = false; + TestInjection.skipIndexWriterCommitOnClose = true; final Semaphore logReplay = new Semaphore(0); final Semaphore logReplayFinish = new Semaphore(0); @@ -1297,7 +1288,6 @@ public class TestRecovery extends SolrTestCaseJ4 { resetExceptionIgnores(); } finally { - DirectUpdateHandler2.commitOnClose = true; UpdateLog.testing_logReplayHook = null; UpdateLog.testing_logReplayFinishHook = null; } @@ -1310,7 +1300,7 @@ public class TestRecovery extends SolrTestCaseJ4 { @Test public void testTruncatedLog() throws Exception { try { - DirectUpdateHandler2.commitOnClose = false; + TestInjection.skipIndexWriterCommitOnClose = true; final Semaphore logReplay = new Semaphore(0); final Semaphore logReplayFinish = new Semaphore(0); @@ -1368,7 +1358,6 @@ public class TestRecovery extends SolrTestCaseJ4 { assertJQ(req("qt","/get", "getVersions","3"), "/versions==["+v106+","+v105+","+v104+"]"); } finally { - DirectUpdateHandler2.commitOnClose = true; UpdateLog.testing_logReplayHook = null; UpdateLog.testing_logReplayFinishHook = null; } @@ -1381,7 +1370,7 @@ public class TestRecovery extends SolrTestCaseJ4 { @Test public void testCorruptLog() throws Exception { try { - DirectUpdateHandler2.commitOnClose = false; + TestInjection.skipIndexWriterCommitOnClose = true; UpdateLog ulog = h.getCore().getUpdateHandler().getUpdateLog(); File logDir = new File(h.getCore().getUpdateHandler().getUpdateLog().getLogDir()); @@ -1435,7 +1424,6 @@ public class TestRecovery extends SolrTestCaseJ4 { deleteLogs(); } finally { - DirectUpdateHandler2.commitOnClose = true; UpdateLog.testing_logReplayHook = null; UpdateLog.testing_logReplayFinishHook = null; } @@ -1447,7 +1435,7 @@ public class TestRecovery extends SolrTestCaseJ4 { @Test public void testRecoveryMultipleLogs() throws Exception { try { - DirectUpdateHandler2.commitOnClose = false; + TestInjection.skipIndexWriterCommitOnClose = true; final Semaphore logReplay = new Semaphore(0); final Semaphore logReplayFinish = new Semaphore(0); @@ -1510,7 +1498,6 @@ public class TestRecovery extends SolrTestCaseJ4 { assertJQ(req("q","*:*") ,"/response/numFound==6"); } finally { - DirectUpdateHandler2.commitOnClose = true; UpdateLog.testing_logReplayHook = null; UpdateLog.testing_logReplayFinishHook = null; } @@ -1521,7 +1508,7 @@ public class TestRecovery extends SolrTestCaseJ4 { try { - DirectUpdateHandler2.commitOnClose = false; + TestInjection.skipIndexWriterCommitOnClose = true; final Semaphore logReplay = new Semaphore(0); final Semaphore logReplayFinish = new Semaphore(0); @@ -1637,7 +1624,6 @@ public class TestRecovery extends SolrTestCaseJ4 { assertEquals(UpdateLog.State.ACTIVE, h.getCore().getUpdateHandler().getUpdateLog().getState()); } finally { - DirectUpdateHandler2.commitOnClose = true; UpdateLog.testing_logReplayHook = null; UpdateLog.testing_logReplayFinishHook = null; } diff --git a/solr/core/src/test/org/apache/solr/search/TestRecoveryHdfs.java b/solr/core/src/test/org/apache/solr/search/TestRecoveryHdfs.java index a148d59599f..fa146ea80ed 100644 --- a/solr/core/src/test/org/apache/solr/search/TestRecoveryHdfs.java +++ b/solr/core/src/test/org/apache/solr/search/TestRecoveryHdfs.java @@ -45,13 +45,14 @@ import org.apache.solr.common.util.IOUtils; import org.apache.solr.common.util.TimeSource; import org.apache.solr.common.util.Utils; import org.apache.solr.request.SolrQueryRequest; -import org.apache.solr.update.DirectUpdateHandler2; import org.apache.solr.update.HdfsUpdateLog; import org.apache.solr.update.UpdateHandler; import org.apache.solr.update.UpdateLog; import org.apache.solr.update.processor.DistributedUpdateProcessor.DistribPhase; import org.apache.solr.util.BadHdfsThreadsFilter; +import org.apache.solr.util.TestInjection; import org.apache.solr.util.TimeOut; +import org.junit.After; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Ignore; @@ -74,6 +75,11 @@ public class TestRecoveryHdfs extends SolrTestCaseJ4 { private static String hdfsUri; private static FileSystem fs; + @After + public void afterTest() { + TestInjection.reset(); // do after every test, don't wait for AfterClass + } + @BeforeClass public static void beforeClass() throws Exception { dfsCluster = HdfsTestUtil.setupClass(createTempDir().toFile().getAbsolutePath()); @@ -137,7 +143,7 @@ public class TestRecoveryHdfs extends SolrTestCaseJ4 { @Test public void testLogReplay() throws Exception { try { - DirectUpdateHandler2.commitOnClose = false; + TestInjection.skipIndexWriterCommitOnClose = true; final Semaphore logReplay = new Semaphore(0); final Semaphore logReplayFinish = new Semaphore(0); @@ -222,7 +228,6 @@ public class TestRecoveryHdfs extends SolrTestCaseJ4 { assertEquals(UpdateLog.State.ACTIVE, h.getCore().getUpdateHandler().getUpdateLog().getState()); } finally { - DirectUpdateHandler2.commitOnClose = true; UpdateLog.testing_logReplayHook = null; UpdateLog.testing_logReplayFinishHook = null; } @@ -230,7 +235,7 @@ public class TestRecoveryHdfs extends SolrTestCaseJ4 { @Test public void testBuffering() throws Exception { - DirectUpdateHandler2.commitOnClose = false; + TestInjection.skipIndexWriterCommitOnClose = true; final Semaphore logReplay = new Semaphore(0); final Semaphore logReplayFinish = new Semaphore(0); @@ -370,7 +375,6 @@ public class TestRecoveryHdfs extends SolrTestCaseJ4 { assertEquals(UpdateLog.State.ACTIVE, ulog.getState()); // leave each test method in a good state } finally { - DirectUpdateHandler2.commitOnClose = true; UpdateLog.testing_logReplayHook = null; UpdateLog.testing_logReplayFinishHook = null; @@ -381,7 +385,7 @@ public class TestRecoveryHdfs extends SolrTestCaseJ4 { @Test @Ignore("HDFS-3107: no truncate support yet") public void testDropBuffered() throws Exception { - DirectUpdateHandler2.commitOnClose = false; + TestInjection.skipIndexWriterCommitOnClose = true; final Semaphore logReplay = new Semaphore(0); final Semaphore logReplayFinish = new Semaphore(0); @@ -493,7 +497,6 @@ public class TestRecoveryHdfs extends SolrTestCaseJ4 { assertEquals(UpdateLog.State.ACTIVE, ulog.getState()); // leave each test method in a good state } finally { - DirectUpdateHandler2.commitOnClose = true; UpdateLog.testing_logReplayHook = null; UpdateLog.testing_logReplayFinishHook = null; @@ -503,7 +506,7 @@ public class TestRecoveryHdfs extends SolrTestCaseJ4 { @Test public void testExistOldBufferLog() throws Exception { - DirectUpdateHandler2.commitOnClose = false; + TestInjection.skipIndexWriterCommitOnClose = true; SolrQueryRequest req = req(); UpdateHandler uhandler = req.getCore().getUpdateHandler(); @@ -564,7 +567,6 @@ public class TestRecoveryHdfs extends SolrTestCaseJ4 { () -> h.getCore().getUpdateHandler().getUpdateLog().getState() == UpdateLog.State.ACTIVE); assertJQ(req("qt","/get", "id", "Q7") ,"/doc/id==Q7"); } finally { - DirectUpdateHandler2.commitOnClose = true; UpdateLog.testing_logReplayHook = null; UpdateLog.testing_logReplayFinishHook = null; @@ -601,7 +603,6 @@ public class TestRecoveryHdfs extends SolrTestCaseJ4 { // make sure that log isn't needlessly replayed after a clean close @Test public void testCleanShutdown() throws Exception { - DirectUpdateHandler2.commitOnClose = true; final Semaphore logReplay = new Semaphore(0); final Semaphore logReplayFinish = new Semaphore(0); @@ -639,7 +640,6 @@ public class TestRecoveryHdfs extends SolrTestCaseJ4 { assertEquals(10, logReplay.availablePermits()); } finally { - DirectUpdateHandler2.commitOnClose = true; UpdateLog.testing_logReplayHook = null; UpdateLog.testing_logReplayFinishHook = null; @@ -656,7 +656,7 @@ public class TestRecoveryHdfs extends SolrTestCaseJ4 { @Test public void testRemoveOldLogs() throws Exception { try { - DirectUpdateHandler2.commitOnClose = false; + TestInjection.skipIndexWriterCommitOnClose = true; final Semaphore logReplay = new Semaphore(0); final Semaphore logReplayFinish = new Semaphore(0); @@ -750,7 +750,6 @@ public class TestRecoveryHdfs extends SolrTestCaseJ4 { resetExceptionIgnores(); } finally { - DirectUpdateHandler2.commitOnClose = true; UpdateLog.testing_logReplayHook = null; UpdateLog.testing_logReplayFinishHook = null; } @@ -763,7 +762,7 @@ public class TestRecoveryHdfs extends SolrTestCaseJ4 { @Test public void testTruncatedLog() throws Exception { try { - DirectUpdateHandler2.commitOnClose = false; + TestInjection.skipIndexWriterCommitOnClose = true; final Semaphore logReplay = new Semaphore(0); final Semaphore logReplayFinish = new Semaphore(0); @@ -820,7 +819,6 @@ public class TestRecoveryHdfs extends SolrTestCaseJ4 { assertJQ(req("qt","/get", "getVersions","3"), "/versions==[106,105,104]"); } finally { - DirectUpdateHandler2.commitOnClose = true; UpdateLog.testing_logReplayHook = null; UpdateLog.testing_logReplayFinishHook = null; } @@ -832,7 +830,7 @@ public class TestRecoveryHdfs extends SolrTestCaseJ4 { @Test public void testCorruptLog() throws Exception { try { - DirectUpdateHandler2.commitOnClose = false; + TestInjection.skipIndexWriterCommitOnClose = true; String logDir = h.getCore().getUpdateHandler().getUpdateLog().getLogDir(); @@ -881,7 +879,6 @@ public class TestRecoveryHdfs extends SolrTestCaseJ4 { deleteLogs(); } finally { - DirectUpdateHandler2.commitOnClose = true; UpdateLog.testing_logReplayHook = null; UpdateLog.testing_logReplayFinishHook = null; } @@ -891,7 +888,7 @@ public class TestRecoveryHdfs extends SolrTestCaseJ4 { @Test public void testRecoveryMultipleLogs() throws Exception { try { - DirectUpdateHandler2.commitOnClose = false; + TestInjection.skipIndexWriterCommitOnClose = true; final Semaphore logReplay = new Semaphore(0); final Semaphore logReplayFinish = new Semaphore(0); @@ -954,7 +951,6 @@ public class TestRecoveryHdfs extends SolrTestCaseJ4 { assertJQ(req("q","*:*") ,"/response/numFound==6"); } finally { - DirectUpdateHandler2.commitOnClose = true; UpdateLog.testing_logReplayHook = null; UpdateLog.testing_logReplayFinishHook = null; } diff --git a/solr/core/src/test/org/apache/solr/update/CdcrUpdateLogTest.java b/solr/core/src/test/org/apache/solr/update/CdcrUpdateLogTest.java index 9dc17332524..53d142d92f6 100644 --- a/solr/core/src/test/org/apache/solr/update/CdcrUpdateLogTest.java +++ b/solr/core/src/test/org/apache/solr/update/CdcrUpdateLogTest.java @@ -31,6 +31,7 @@ import org.apache.lucene.util.LuceneTestCase.Nightly; import org.apache.solr.SolrTestCaseJ4; import org.apache.solr.common.SolrInputDocument; import org.apache.solr.request.SolrQueryRequest; +import org.apache.solr.util.TestInjection; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; @@ -415,7 +416,7 @@ public class CdcrUpdateLogTest extends SolrTestCaseJ4 { public void testClosingOutputStreamAfterLogReplay() throws Exception { this.clearCore(); try { - DirectUpdateHandler2.commitOnClose = false; + TestInjection.skipIndexWriterCommitOnClose = true; final Semaphore logReplay = new Semaphore(0); final Semaphore logReplayFinish = new Semaphore(0); @@ -464,7 +465,7 @@ public class CdcrUpdateLogTest extends SolrTestCaseJ4 { assertTrue(ulog.logs.peekLast().endsWithCommit()); ulog.logs.peekLast().decref(); } finally { - DirectUpdateHandler2.commitOnClose = true; // reset + TestInjection.skipIndexWriterCommitOnClose = false; // reset UpdateLog.testing_logReplayHook = null; UpdateLog.testing_logReplayFinishHook = null; } @@ -641,7 +642,7 @@ public class CdcrUpdateLogTest extends SolrTestCaseJ4 { @Test public void testGetNumberOfRemainingRecords() throws Exception { try { - DirectUpdateHandler2.commitOnClose = false; + TestInjection.skipIndexWriterCommitOnClose = true; final Semaphore logReplayFinish = new Semaphore(0); UpdateLog.testing_logReplayFinishHook = () -> logReplayFinish.release(); @@ -685,7 +686,7 @@ public class CdcrUpdateLogTest extends SolrTestCaseJ4 { addDocs(10, start, versions); assertEquals(10, reader.getNumberOfRemainingRecords()); } finally { - DirectUpdateHandler2.commitOnClose = true; + TestInjection.skipIndexWriterCommitOnClose = false; // reset UpdateLog.testing_logReplayFinishHook = null; } } diff --git a/solr/test-framework/src/java/org/apache/solr/cloud/ChaosMonkey.java b/solr/test-framework/src/java/org/apache/solr/cloud/ChaosMonkey.java index a6939b225ee..7c15ef16ac9 100644 --- a/solr/test-framework/src/java/org/apache/solr/cloud/ChaosMonkey.java +++ b/solr/test-framework/src/java/org/apache/solr/cloud/ChaosMonkey.java @@ -43,9 +43,9 @@ import org.apache.solr.common.util.ExecutorUtil; import org.apache.solr.common.util.TimeSource; import org.apache.solr.core.CoreContainer; import org.apache.solr.core.SolrCore; -import org.apache.solr.update.DirectUpdateHandler2; import org.apache.solr.util.DefaultSolrThreadFactory; import org.apache.solr.util.RTimer; +import org.apache.solr.util.TestInjection; import org.apache.solr.util.TimeOut; import org.apache.zookeeper.KeeperException; import org.slf4j.Logger; @@ -482,7 +482,7 @@ public class ChaosMonkey { if (chaosRandom.nextBoolean()) { monkeyLog("Jetty will not commit on close"); - DirectUpdateHandler2.commitOnClose = false; + TestInjection.skipIndexWriterCommitOnClose = true; } this.aggressivelyKillLeaders = killLeaders; @@ -533,8 +533,7 @@ public class ChaosMonkey { Thread.currentThread().interrupt(); } runTimer.stop(); - - DirectUpdateHandler2.commitOnClose = true; + TestInjection.skipIndexWriterCommitOnClose = false; double runtime = runTimer.getTime()/1000.0f; if (runtime > NO_STOP_WARN_TIME && stops.get() == 0) {