Skip to content

Commit 4cb1000

Browse files
committed
SOLR-15122: Tentative fix for the test failure - the node in the test could go down
before the new plugin was active on the Overseer.
1 parent b48d5be commit 4cb1000

File tree

3 files changed

+56
-2
lines changed

3 files changed

+56
-2
lines changed

solr/core/src/java/org/apache/solr/cluster/events/impl/DelegatingClusterEventProducer.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
*/
1717
package org.apache.solr.cluster.events.impl;
1818

19+
import com.google.common.annotations.VisibleForTesting;
1920
import org.apache.solr.cluster.events.ClusterEvent;
2021
import org.apache.solr.cluster.events.ClusterEventListener;
2122
import org.apache.solr.cluster.events.ClusterEventProducer;
@@ -38,6 +39,8 @@ public final class DelegatingClusterEventProducer extends ClusterEventProducerBa
3839
private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
3940

4041
private ClusterEventProducer delegate;
42+
// support for tests to make sure the update is completed
43+
private volatile int version;
4144

4245
public DelegatingClusterEventProducer(CoreContainer cc) {
4346
super(cc);
@@ -87,6 +90,7 @@ public void setDelegate(ClusterEventProducer newDelegate) {
8790
log.debug("--- delegate {} already in state {}", delegate, delegate.getState());
8891
}
8992
}
93+
this.version++;
9094
}
9195

9296
@Override
@@ -138,4 +142,9 @@ public synchronized void stop() {
138142
delegate.stop();
139143
state = delegate.getState();
140144
}
145+
146+
@VisibleForTesting
147+
public int getVersion() {
148+
return version;
149+
}
141150
}

solr/core/src/java/org/apache/solr/cluster/placement/impl/DelegatingPlacementPluginFactory.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
*/
1717
package org.apache.solr.cluster.placement.impl;
1818

19+
import com.google.common.annotations.VisibleForTesting;
1920
import org.apache.solr.cluster.placement.PlacementPlugin;
2021
import org.apache.solr.cluster.placement.PlacementPluginConfig;
2122
import org.apache.solr.cluster.placement.PlacementPluginFactory;
@@ -43,10 +44,12 @@ public void setDelegate(PlacementPluginFactory<? extends PlacementPluginConfig>
4344
this.version++;
4445
}
4546

47+
@VisibleForTesting
4648
public PlacementPluginFactory<? extends PlacementPluginConfig> getDelegate() {
4749
return delegate;
4850
}
4951

52+
@VisibleForTesting
5053
public int getVersion() {
5154
return version;
5255
}

solr/core/src/test/org/apache/solr/cluster/events/ClusterEventProducerTest.java

Lines changed: 44 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,15 @@
2323
import org.apache.solr.client.solrj.request.beans.PluginMeta;
2424
import org.apache.solr.client.solrj.response.V2Response;
2525
import org.apache.solr.cloud.ClusterSingleton;
26+
import org.apache.solr.cloud.Overseer;
2627
import org.apache.solr.cloud.SolrCloudTestCase;
2728
import org.apache.solr.cluster.events.impl.DefaultClusterEventProducer;
29+
import org.apache.solr.cluster.events.impl.DelegatingClusterEventProducer;
2830
import org.apache.solr.common.cloud.ClusterProperties;
31+
import org.apache.solr.common.util.TimeSource;
2932
import org.apache.solr.common.util.Utils;
3033
import org.apache.solr.util.LogLevel;
34+
import org.apache.solr.util.TimeOut;
3135
import org.junit.After;
3236
import org.junit.Before;
3337
import org.junit.BeforeClass;
@@ -44,6 +48,7 @@
4448
import java.util.Map;
4549
import java.util.concurrent.CountDownLatch;
4650
import java.util.concurrent.TimeUnit;
51+
import java.util.concurrent.TimeoutException;
4752

4853
import static java.util.Collections.singletonMap;
4954
import static org.apache.solr.client.solrj.SolrRequest.METHOD.GET;
@@ -54,6 +59,7 @@
5459
*/
5560
@LogLevel("org.apache.solr.cluster.events=DEBUG")
5661
public class ClusterEventProducerTest extends SolrCloudTestCase {
62+
private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
5763

5864
private AllEventsListener eventsListener;
5965

@@ -96,6 +102,8 @@ public void teardown() throws Exception {
96102

97103
@Test
98104
public void testEvents() throws Exception {
105+
int version = waitForVersionChange(-1, 10);
106+
99107
PluginMeta plugin = new PluginMeta();
100108
plugin.klass = DefaultClusterEventProducer.class.getName();
101109
plugin.name = ClusterEventProducer.PLUGIN_NAME;
@@ -106,6 +114,8 @@ public void testEvents() throws Exception {
106114
V2Response rsp = req.process(cluster.getSolrClient());
107115
assertEquals(0, rsp.getStatus());
108116

117+
version = waitForVersionChange(version, 10);
118+
109119
// NODES_DOWN
110120

111121
eventsListener.setExpectedType(ClusterEvent.EventType.NODES_DOWN);
@@ -115,10 +125,12 @@ public void testEvents() throws Exception {
115125
for (JettySolrRunner jetty : cluster.getJettySolrRunners()) {
116126
if (cluster.getOpenOverseer().getCoreContainer().getZkController().getNodeName().equals(jetty.getNodeName())) {
117127
continue;
128+
} else {
129+
nonOverseerJetty = jetty;
130+
break;
118131
}
119-
nonOverseerJetty = jetty;
120-
break;
121132
}
133+
122134
String nodeName = nonOverseerJetty.getNodeName();
123135
cluster.stopJettySolrRunner(nonOverseerJetty);
124136
cluster.waitForJettyToStop(nonOverseerJetty);
@@ -269,6 +281,8 @@ public void close() throws IOException {
269281

270282
@Test
271283
public void testListenerPlugins() throws Exception {
284+
int version = waitForVersionChange(-1, 10);
285+
272286
PluginMeta plugin = new PluginMeta();
273287
plugin.klass = DefaultClusterEventProducer.class.getName();
274288
plugin.name = ClusterEventProducer.PLUGIN_NAME;
@@ -278,6 +292,7 @@ public void testListenerPlugins() throws Exception {
278292
.build();
279293
V2Response rsp = req.process(cluster.getSolrClient());
280294
assertEquals(0, rsp.getStatus());
295+
version = waitForVersionChange(-1, 10);
281296

282297
plugin = new PluginMeta();
283298
plugin.name = "testplugin";
@@ -335,6 +350,7 @@ public void testListenerPlugins() throws Exception {
335350
.withPayload(Collections.singletonMap("remove", ClusterEventProducer.PLUGIN_NAME))
336351
.build();
337352
req.process(cluster.getSolrClient());
353+
version = waitForVersionChange(-1, 10);
338354

339355
dummyEventLatch = new CountDownLatch(1);
340356
lastEvent = null;
@@ -355,6 +371,7 @@ public void testListenerPlugins() throws Exception {
355371
.build();
356372
rsp = req.process(cluster.getSolrClient());
357373
assertEquals(0, rsp.getStatus());
374+
version = waitForVersionChange(-1, 10);
358375

359376
dummyEventLatch = new CountDownLatch(1);
360377
lastEvent = null;
@@ -367,4 +384,29 @@ public void testListenerPlugins() throws Exception {
367384
assertNotNull("lastEvent should be COLLECTIONS_REMOVED", lastEvent);
368385
assertEquals("lastEvent should be COLLECTIONS_REMOVED", ClusterEvent.EventType.COLLECTIONS_REMOVED, lastEvent.getType());
369386
}
387+
388+
private int waitForVersionChange(int currentVersion, int timeoutSec) throws Exception {
389+
TimeOut timeout = new TimeOut(timeoutSec, TimeUnit.SECONDS, TimeSource.NANO_TIME);
390+
Overseer overseer = cluster.getOpenOverseer();
391+
if (overseer == null) {
392+
throw new Exception("no overseer");
393+
}
394+
ClusterEventProducer clusterEventProducer = overseer.getCoreContainer().getClusterEventProducer();
395+
assertTrue("not a delegating producer? " + clusterEventProducer.getClass(),
396+
clusterEventProducer instanceof DelegatingClusterEventProducer);
397+
DelegatingClusterEventProducer wrapper = (DelegatingClusterEventProducer) clusterEventProducer;
398+
while (!timeout.hasTimedOut()) {
399+
int newVersion = wrapper.getVersion();
400+
if (newVersion < currentVersion) {
401+
throw new Exception("Invalid version - went back! currentVersion=" + currentVersion +
402+
" newVersion=" + newVersion);
403+
} else if (currentVersion < newVersion) {
404+
log.debug("--current version was {}, new version is {}", currentVersion, newVersion);
405+
return newVersion;
406+
}
407+
timeout.sleep(200);
408+
}
409+
throw new TimeoutException("version didn't change in time, currentVersion=" + currentVersion);
410+
411+
}
370412
}

0 commit comments

Comments
 (0)