You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by ma...@apache.org on 2020/09/28 16:58:19 UTC
[lucene-solr] 02/03: @869 Work on more graceful shutdown.
This is an automated email from the ASF dual-hosted git repository.
markrmiller pushed a commit to branch reference_impl_dev
in repository https://gitbox.apache.org/repos/asf/lucene-solr.git
commit f74b61c6785b2c2120b857bab3b865f457767780
Author: markrmiller@gmail.com <ma...@gmail.com>
AuthorDate: Sun Sep 27 16:01:49 2020 -0500
@869 Work on more graceful shutdown.
---
.../client/solrj/embedded/JettySolrRunner.java | 8 ++--
.../java/org/apache/solr/cloud/ZkController.java | 4 ++
.../apache/solr/servlet/SolrDispatchFilter.java | 11 -----
.../apache/solr/servlet/SolrShutdownHandler.java | 56 ++++++++--------------
solr/server/etc/jetty.xml | 8 ++--
.../solr/common/util/SolrQueuedThreadPool.java | 14 +++++-
6 files changed, 45 insertions(+), 56 deletions(-)
diff --git a/solr/core/src/java/org/apache/solr/client/solrj/embedded/JettySolrRunner.java b/solr/core/src/java/org/apache/solr/client/solrj/embedded/JettySolrRunner.java
index af9eb47..ccc1c8d 100644
--- a/solr/core/src/java/org/apache/solr/client/solrj/embedded/JettySolrRunner.java
+++ b/solr/core/src/java/org/apache/solr/client/solrj/embedded/JettySolrRunner.java
@@ -61,6 +61,7 @@ import org.apache.solr.core.CoreContainer;
import org.apache.solr.core.NodeConfig;
import org.apache.solr.servlet.SolrDispatchFilter;
import org.apache.solr.servlet.SolrQoSFilter;
+import org.apache.solr.servlet.SolrShutdownHandler;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
@@ -80,6 +81,7 @@ import org.eclipse.jetty.server.ServerConnector;
import org.eclipse.jetty.server.SessionIdManager;
import org.eclipse.jetty.server.SslConnectionFactory;
import org.eclipse.jetty.server.handler.HandlerWrapper;
+import org.eclipse.jetty.server.handler.ShutdownHandler;
import org.eclipse.jetty.server.handler.gzip.GzipHandler;
import org.eclipse.jetty.server.session.HouseKeeper;
import org.eclipse.jetty.server.session.SessionHandler;
@@ -442,9 +444,9 @@ public class JettySolrRunner implements Closeable {
}
chain = injectJettyHandlers(chain);
-// ShutdownHandler shutdownHandler = new ShutdownHandler("solrrocks", false, false);
-// shutdownHandler.setHandler(chain);
-// chain = shutdownHandler;
+ SolrShutdownHandler shutdownHandler = new SolrShutdownHandler();
+ shutdownHandler.setHandler(chain);
+ chain = shutdownHandler;
if(config.enableV2) {
RewriteHandler rwh = new RewriteHandler();
rwh.setHandler(chain);
diff --git a/solr/core/src/java/org/apache/solr/cloud/ZkController.java b/solr/core/src/java/org/apache/solr/cloud/ZkController.java
index 660994f..baa6c5a 100644
--- a/solr/core/src/java/org/apache/solr/cloud/ZkController.java
+++ b/solr/core/src/java/org/apache/solr/cloud/ZkController.java
@@ -85,6 +85,8 @@ import org.apache.zookeeper.KeeperException.SessionExpiredException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.data.Stat;
+import org.eclipse.jetty.server.ShutdownMonitor;
+import org.eclipse.jetty.util.component.LifeCycle;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -402,6 +404,8 @@ public class ZkController implements Closeable {
public void start() throws KeeperException {
+ // boolean isRegistered = ShutdownMonitor.isRegistered(this);
+
String zkCredentialsProviderClass = cloudConfig.getZkCredentialsProviderClass();
if (zkCredentialsProviderClass != null && zkCredentialsProviderClass.trim().length() > 0) {
zkClient.getConnectionManager().setZkCredentialsToAddAutomatically(cc.getResourceLoader().newInstance(zkCredentialsProviderClass, ZkCredentialsProvider.class));
diff --git a/solr/core/src/java/org/apache/solr/servlet/SolrDispatchFilter.java b/solr/core/src/java/org/apache/solr/servlet/SolrDispatchFilter.java
index 5710ce2..b01a97d 100644
--- a/solr/core/src/java/org/apache/solr/servlet/SolrDispatchFilter.java
+++ b/solr/core/src/java/org/apache/solr/servlet/SolrDispatchFilter.java
@@ -125,7 +125,6 @@ public class SolrDispatchFilter extends BaseSolrFilter {
private String registryName;
private volatile boolean closeOnDestroy = true;
private volatile SolrZkClient zkClient;
- private boolean shutdownRootExec = true;
/**
* Enum to define action that needs to be processed.
@@ -391,19 +390,9 @@ public class SolrDispatchFilter extends BaseSolrFilter {
ParWork.close(zkClient);
}
GlobalTracer.get().close();
-
- assert disableRootExecShutdownForTests();
- if (shutdownRootExec) {
- ParWork.shutdownRootSharedExec(true);
- }
}
}
- private boolean disableRootExecShutdownForTests() {
- shutdownRootExec = false;
- return true;
- }
-
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
doFilter(request, response, chain, false);
diff --git a/solr/core/src/java/org/apache/solr/servlet/SolrShutdownHandler.java b/solr/core/src/java/org/apache/solr/servlet/SolrShutdownHandler.java
index cf459ac..094bf73 100644
--- a/solr/core/src/java/org/apache/solr/servlet/SolrShutdownHandler.java
+++ b/solr/core/src/java/org/apache/solr/servlet/SolrShutdownHandler.java
@@ -1,48 +1,30 @@
package org.apache.solr.servlet;
-import org.apache.solr.common.ParWork;
-import org.eclipse.jetty.server.Connector;
-import org.eclipse.jetty.server.Request;
-import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.server.handler.ShutdownHandler;
+import org.eclipse.jetty.server.handler.HandlerWrapper;
+import org.eclipse.jetty.util.FutureCallback;
+import org.eclipse.jetty.util.component.Graceful;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
+import java.lang.invoke.MethodHandles;
+import java.util.concurrent.Future;
-public class SolrShutdownHandler extends ShutdownHandler {
- public SolrShutdownHandler() {
- super("solrrocks");
- }
-
- protected void doShutdown(Request baseRequest, HttpServletResponse response) throws IOException {
- for (Connector connector : getServer().getConnectors()) {
- connector.shutdown();
- }
+public class SolrShutdownHandler extends HandlerWrapper implements Graceful {
- baseRequest.setHandled(true);
- response.setStatus(200);
- response.flushBuffer();
+ private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
- final Server server = getServer();
- new Thread() {
- @Override
- public void run() {
- try {
- shutdownServer(server);
- } catch (InterruptedException e) {
-
- } catch (Exception e) {
- throw new RuntimeException("Shutting down server", e);
- }
- }
- }.start();
+ public SolrShutdownHandler() {
+ super();
}
- private void shutdownServer(Server server) throws Exception
- {
- server.stop();
- ParWork.shutdownRootSharedExec();
- System.exit(0);
+ @Override
+ public Future<Void> shutdown() {
+ log.error("GRACEFUL SHUTDOWN CALLED");
+ return new FutureCallback(true);
}
+ @Override
+ public boolean isShutdown() {
+ return true;
+ }
}
diff --git a/solr/server/etc/jetty.xml b/solr/server/etc/jetty.xml
index e4ae796..774d1c9 100644
--- a/solr/server/etc/jetty.xml
+++ b/solr/server/etc/jetty.xml
@@ -150,6 +150,10 @@
<Set name="handlers">
<Array type="org.eclipse.jetty.server.Handler">
<Item>
+ <New id="ShutdownHandler" class="org.apache.solr.servlet.SolrShutdownHandler">
+ </New>
+ </Item>
+ <Item>
<New class="org.eclipse.jetty.server.handler.InetAccessHandler">
<Call name="include">
<Arg>
@@ -170,10 +174,6 @@
</Set>
</New>
</Item>
- <Item>
- <New id="ShutdownHandler" class="org.apache.solr.servlet.SolrShutdownHandler">
- </New>
- </Item>
</Array>
</Set>
</New>
diff --git a/solr/solrj/src/java/org/apache/solr/common/util/SolrQueuedThreadPool.java b/solr/solrj/src/java/org/apache/solr/common/util/SolrQueuedThreadPool.java
index a200b6f..9bb37ff 100644
--- a/solr/solrj/src/java/org/apache/solr/common/util/SolrQueuedThreadPool.java
+++ b/solr/solrj/src/java/org/apache/solr/common/util/SolrQueuedThreadPool.java
@@ -19,6 +19,7 @@ package org.apache.solr.common.util;
import org.apache.solr.common.ParWork;
import org.eclipse.jetty.util.AtomicBiInteger;
import org.eclipse.jetty.util.BlockingArrayQueue;
+import org.eclipse.jetty.util.FutureCallback;
import org.eclipse.jetty.util.StringUtil;
import org.eclipse.jetty.util.annotation.ManagedAttribute;
import org.eclipse.jetty.util.annotation.ManagedOperation;
@@ -26,6 +27,7 @@ import org.eclipse.jetty.util.annotation.Name;
import org.eclipse.jetty.util.component.ContainerLifeCycle;
import org.eclipse.jetty.util.component.Dumpable;
import org.eclipse.jetty.util.component.DumpableCollection;
+import org.eclipse.jetty.util.component.Graceful;
import org.eclipse.jetty.util.thread.QueuedThreadPool;
import org.eclipse.jetty.util.thread.ReservedThreadExecutor;
import org.eclipse.jetty.util.thread.ThreadPool;
@@ -53,7 +55,7 @@ import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import java.util.concurrent.atomic.AtomicLong;
-public class SolrQueuedThreadPool extends ContainerLifeCycle implements ThreadFactory, ThreadPool.SizedThreadPool, Dumpable, TryExecutor, Closeable {
+public class SolrQueuedThreadPool extends ContainerLifeCycle implements ThreadFactory, ThreadPool.SizedThreadPool, Dumpable, TryExecutor, Closeable, Graceful {
private static final Logger LOG = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
private static Runnable NOOP = () ->
{
@@ -705,6 +707,16 @@ public class SolrQueuedThreadPool extends ContainerLifeCycle implements ThreadFa
return null;
}
+ @Override
+ public Future<Void> shutdown() {
+ return new FutureCallback(true);
+ }
+
+ @Override
+ public boolean isShutdown() {
+ return true;
+ }
+
private static class MyRunnable implements Runnable {
private final Runnable runnable;