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;