SOLR-13036 Fix retry logic in JettySolrRunner

This commit is contained in:
Gus Heck 2018-12-03 21:54:34 -05:00
parent e14432efd8
commit 59919b4ac0
3 changed files with 85 additions and 8 deletions

View File

@ -113,6 +113,8 @@ Other Changes
* SOLR-12775: LowerCaseTokenizer is deprecated, and should be replaced by LetterTokenizer and
LowerCaseFilter (Alan Woodward)
* SOLR-13036: Fix retry logic in JettySolrRunner (Gus Heck)
================== 7.7.0 ==================
Consult the LUCENE_CHANGES.txt file for additional, low level, changes in this release.
@ -172,6 +174,9 @@ Other Changes
* SOLR-12932: ant test (without badapples=false) should pass easily for developers. (Mark Miller)
* SOLR-13036: Fix retry logic in JettySolrRunner (Gus Heck)
================== 7.6.0 ==================
Consult the LUCENE_CHANGES.txt file for additional, low level, changes in this release.

View File

@ -509,12 +509,15 @@ public class JettySolrRunner {
log.info("Trying to start Jetty on port {} try number {} ...", port, tryCnt++);
server.start();
break;
} catch (BindException e) {
log.info("Port is in use, will try again until timeout of " + timeout);
server.stop();
Thread.sleep(3000);
if (!timeout.hasTimedOut()) {
continue;
} catch (IOException ioe) {
Exception e = lookForBindException(ioe);
if (e instanceof BindException) {
log.info("Port is in use, will try again until timeout of " + timeout);
server.stop();
Thread.sleep(3000);
if (!timeout.hasTimedOut()) {
continue;
}
}
throw e;
@ -522,6 +525,26 @@ public class JettySolrRunner {
}
}
/**
* Traverses the cause chain looking for a BindException. Returns either a bind exception
* that was found in the chain or the original argument.
*
* @param ioe An IOException that might wrap a BindException
* @return A bind exception if present otherwise ioe
*/
Exception lookForBindException(IOException ioe) {
Exception e = ioe;
while(e.getCause() != null && !(e == e.getCause()) && ! (e instanceof BindException)) {
if (e.getCause() instanceof Exception) {
e = (Exception) e.getCause();
if (e instanceof BindException) {
return e;
}
}
}
return ioe;
}
/**
* Stop the Jetty server
*

View File

@ -19,8 +19,12 @@ package org.apache.solr.client.solrj.embedded;
import org.apache.solr.SolrTestCaseJ4;
import org.apache.solr.client.solrj.SolrClient;
import org.apache.solr.client.solrj.request.CoreAdminRequest;
import org.apache.solr.cloud.MiniSolrCloudCluster;
import org.junit.Test;
import java.io.IOException;
import java.net.BindException;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
@ -62,11 +66,56 @@ public class TestJettySolrRunner extends SolrTestCaseJ4 {
assertTrue(Files.exists(coresDir.resolve("newcore").resolve("core.properties")));
}
finally {
} finally {
runner.stop();
}
}
@SuppressWarnings("ThrowableNotThrown")
@Test
public void testLookForBindException() throws IOException {
Path solrHome = createTempDir();
Files.write(solrHome.resolve("solr.xml"), MiniSolrCloudCluster.DEFAULT_CLOUD_SOLR_XML.getBytes(Charset.defaultCharset()));
JettyConfig config = JettyConfig.builder().build();
JettySolrRunner jetty = new JettySolrRunner(solrHome.toString(), config);
Exception result;
BindException be = new BindException();
IOException test = new IOException();
result = jetty.lookForBindException(test);
assertEquals(result, test);
test = new IOException();
result = jetty.lookForBindException(test);
assertEquals(result, test);
test = new IOException((Throwable) null);
result = jetty.lookForBindException(test);
assertEquals(result, test);
test = new IOException() {
@Override
public synchronized Throwable getCause() {
return this;
}
};
result = jetty.lookForBindException(test);
assertEquals(result, test);
test = new IOException(new RuntimeException());
result = jetty.lookForBindException(test);
assertEquals(result, test);
test = new IOException(new RuntimeException(be));
result = jetty.lookForBindException(test);
assertEquals(result, be);
}
}