You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by ab...@apache.org on 2017/05/18 19:20:49 UTC

[1/2] lucene-solr:jira/solr-10515: SOLR-10373: Move setWT to RequestHandlerUtils. Use JSON as default response writer for autoscaling API.

Repository: lucene-solr
Updated Branches:
  refs/heads/jira/solr-10515 f4d473f03 -> e15ce8098


SOLR-10373: Move setWT to RequestHandlerUtils. Use JSON as default response writer for autoscaling API.


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/d583dcd3
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/d583dcd3
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/d583dcd3

Branch: refs/heads/jira/solr-10515
Commit: d583dcd3b5dbda1a200837c8e28b2dd36282cb25
Parents: f4d473f
Author: Shalin Shekhar Mangar <sh...@apache.org>
Authored: Tue May 16 13:37:55 2017 +0530
Committer: Andrzej Bialecki <ab...@apache.org>
Committed: Thu May 18 17:24:38 2017 +0200

----------------------------------------------------------------------
 .../solr/cloud/autoscaling/AutoScalingHandler.java     |  3 +++
 .../src/java/org/apache/solr/handler/BlobHandler.java  |  2 +-
 .../org/apache/solr/handler/RequestHandlerUtils.java   | 13 +++++++++++++
 .../java/org/apache/solr/handler/SchemaHandler.java    |  2 +-
 .../org/apache/solr/handler/SolrConfigHandler.java     | 11 +----------
 .../apache/solr/handler/admin/SecurityConfHandler.java |  4 ++--
 6 files changed, 21 insertions(+), 14 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/d583dcd3/solr/core/src/java/org/apache/solr/cloud/autoscaling/AutoScalingHandler.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/cloud/autoscaling/AutoScalingHandler.java b/solr/core/src/java/org/apache/solr/cloud/autoscaling/AutoScalingHandler.java
index 759ca14..701d499 100644
--- a/solr/core/src/java/org/apache/solr/cloud/autoscaling/AutoScalingHandler.java
+++ b/solr/core/src/java/org/apache/solr/cloud/autoscaling/AutoScalingHandler.java
@@ -52,6 +52,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import static org.apache.solr.common.cloud.ZkStateReader.SOLR_AUTOSCALING_CONF_PATH;
+import static org.apache.solr.common.params.CommonParams.JSON;
 
 /**
  * Handler for /cluster/autoscaling
@@ -83,6 +84,8 @@ public class AutoScalingHandler extends RequestHandlerBase implements Permission
   @Override
   public void handleRequestBody(SolrQueryRequest req, SolrQueryResponse rsp) throws Exception {
     String httpMethod = (String) req.getContext().get("httpMethod");
+    RequestHandlerUtils.setWt(req, JSON);
+
     if ("GET".equals(httpMethod)) {
       Map<String, Object> map = zkReadAutoScalingConf(container.getZkController().getZkStateReader());
       rsp.getValues().addAll(map);

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/d583dcd3/solr/core/src/java/org/apache/solr/handler/BlobHandler.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/BlobHandler.java b/solr/core/src/java/org/apache/solr/handler/BlobHandler.java
index 052fcfe..ca0529a 100644
--- a/solr/core/src/java/org/apache/solr/handler/BlobHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/BlobHandler.java
@@ -80,7 +80,7 @@ public class BlobHandler extends RequestHandlerBase implements PluginInfoInitial
   public void handleRequestBody(final SolrQueryRequest req, SolrQueryResponse rsp) throws Exception {
     String httpMethod = req.getHttpMethod();
     String path = (String) req.getContext().get("path");
-    SolrConfigHandler.setWt(req, JSON);
+    RequestHandlerUtils.setWt(req, JSON);
 
     List<String> pieces = StrUtils.splitSmart(path, '/');
     String blobName = null;

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/d583dcd3/solr/core/src/java/org/apache/solr/handler/RequestHandlerUtils.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/RequestHandlerUtils.java b/solr/core/src/java/org/apache/solr/handler/RequestHandlerUtils.java
index 99f8315..4441024 100644
--- a/solr/core/src/java/org/apache/solr/handler/RequestHandlerUtils.java
+++ b/solr/core/src/java/org/apache/solr/handler/RequestHandlerUtils.java
@@ -20,6 +20,7 @@ import java.io.IOException;
 import java.util.*;
 
 import org.apache.solr.common.SolrException;
+import org.apache.solr.common.params.CommonParams;
 import org.apache.solr.common.params.MapSolrParams;
 import org.apache.solr.common.params.SolrParams;
 import org.apache.solr.common.params.UpdateParams;
@@ -119,4 +120,16 @@ public class RequestHandlerUtils
     }
     return false;
   }
+
+  /**
+   * @since 6.7
+   */
+  public static void setWt(SolrQueryRequest req, String wt) {
+    SolrParams params = req.getParams();
+    if (params.get(CommonParams.WT) != null) return;//wt is set by user
+    Map<String, String> map = new HashMap<>(1);
+    map.put(CommonParams.WT, wt);
+    map.put("indent", "true");
+    req.setParams(SolrParams.wrapDefaults(params, new MapSolrParams(map)));
+  }
 }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/d583dcd3/solr/core/src/java/org/apache/solr/handler/SchemaHandler.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/SchemaHandler.java b/solr/core/src/java/org/apache/solr/handler/SchemaHandler.java
index f3e503e..d37b388 100644
--- a/solr/core/src/java/org/apache/solr/handler/SchemaHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/SchemaHandler.java
@@ -76,7 +76,7 @@ public class SchemaHandler extends RequestHandlerBase implements SolrCoreAware,
 
   @Override
   public void handleRequestBody(SolrQueryRequest req, SolrQueryResponse rsp) throws Exception {
-    SolrConfigHandler.setWt(req, JSON);
+    RequestHandlerUtils.setWt(req, JSON);
     String httpMethod = (String) req.getContext().get("httpMethod");
     if ("POST".equals(httpMethod)) {
       if (isImmutableConfigSet) {

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/d583dcd3/solr/core/src/java/org/apache/solr/handler/SolrConfigHandler.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/SolrConfigHandler.java b/solr/core/src/java/org/apache/solr/handler/SolrConfigHandler.java
index 08ce838..2ae2c14 100644
--- a/solr/core/src/java/org/apache/solr/handler/SolrConfigHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/SolrConfigHandler.java
@@ -119,7 +119,7 @@ public class SolrConfigHandler extends RequestHandlerBase implements SolrCoreAwa
   @Override
   public void handleRequestBody(SolrQueryRequest req, SolrQueryResponse rsp) throws Exception {
 
-    setWt(req, CommonParams.JSON);
+    RequestHandlerUtils.setWt(req, CommonParams.JSON);
     String httpMethod = (String) req.getContext().get("httpMethod");
     Command command = new Command(req, rsp, httpMethod);
     if ("POST".equals(httpMethod)) {
@@ -668,15 +668,6 @@ public class SolrConfigHandler extends RequestHandlerBase implements SolrCoreAwa
     return null;
   }
 
-  public static void setWt(SolrQueryRequest req, String wt) {
-    SolrParams params = req.getParams();
-    if (params.get(CommonParams.WT) != null) return;//wt is set by user
-    Map<String, String> map = new HashMap<>(1);
-    map.put(CommonParams.WT, wt);
-    map.put("indent", "true");
-    req.setParams(SolrParams.wrapDefaults(params, new MapSolrParams(map)));
-  }
-
   @Override
   public SolrRequestHandler getSubHandler(String path) {
     if (subPaths.contains(path)) return this;

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/d583dcd3/solr/core/src/java/org/apache/solr/handler/admin/SecurityConfHandler.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/admin/SecurityConfHandler.java b/solr/core/src/java/org/apache/solr/handler/admin/SecurityConfHandler.java
index eceb4b7..aba1c04 100644
--- a/solr/core/src/java/org/apache/solr/handler/admin/SecurityConfHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/admin/SecurityConfHandler.java
@@ -34,7 +34,7 @@ import org.apache.solr.common.params.CommonParams;
 import org.apache.solr.common.util.Utils;
 import org.apache.solr.core.CoreContainer;
 import org.apache.solr.handler.RequestHandlerBase;
-import org.apache.solr.handler.SolrConfigHandler;
+import org.apache.solr.handler.RequestHandlerUtils;
 import org.apache.solr.request.SolrQueryRequest;
 import org.apache.solr.response.SolrQueryResponse;
 import org.apache.solr.security.AuthenticationPlugin;
@@ -74,7 +74,7 @@ public abstract class SecurityConfHandler extends RequestHandlerBase implements
 
   @Override
   public void handleRequestBody(SolrQueryRequest req, SolrQueryResponse rsp) throws Exception {
-    SolrConfigHandler.setWt(req, CommonParams.JSON);
+    RequestHandlerUtils.setWt(req, CommonParams.JSON);
     String httpMethod = (String) req.getContext().get("httpMethod");
     String path = (String) req.getContext().get("path");
     String key = path.substring(path.lastIndexOf('/')+1);


[2/2] lucene-solr:jira/solr-10515: SOLR-10515: Use MapWriter for serialization of TriggerEvents. WIP on unit testing.

Posted by ab...@apache.org.
SOLR-10515: Use MapWriter for serialization of TriggerEvents. WIP on unit testing.


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/e15ce809
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/e15ce809
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/e15ce809

Branch: refs/heads/jira/solr-10515
Commit: e15ce80980b854c60e2e287f0e39afcc7f3f14a5
Parents: d583dcd
Author: Andrzej Bialecki <ab...@apache.org>
Authored: Thu May 18 21:19:40 2017 +0200
Committer: Andrzej Bialecki <ab...@apache.org>
Committed: Thu May 18 21:19:40 2017 +0200

----------------------------------------------------------------------
 .../solr/cloud/autoscaling/AutoScaling.java     |   3 +-
 .../cloud/autoscaling/NodeAddedTrigger.java     |   1 -
 .../solr/cloud/autoscaling/NodeLostTrigger.java |   1 -
 .../autoscaling/OverseerTriggerThread.java      |   2 +-
 .../cloud/autoscaling/ScheduledTriggers.java    |   1 +
 .../cloud/autoscaling/TriggerEventBase.java     |  12 +++
 .../cloud/autoscaling/TriggerEventQueue.java    |   8 +-
 .../autoscaling/TriggerIntegrationTest.java     | 107 ++++++++++++++++++-
 8 files changed, 119 insertions(+), 16 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/e15ce809/solr/core/src/java/org/apache/solr/cloud/autoscaling/AutoScaling.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/cloud/autoscaling/AutoScaling.java b/solr/core/src/java/org/apache/solr/cloud/autoscaling/AutoScaling.java
index 0b6aca3..e8d9b5e 100644
--- a/solr/core/src/java/org/apache/solr/cloud/autoscaling/AutoScaling.java
+++ b/solr/core/src/java/org/apache/solr/cloud/autoscaling/AutoScaling.java
@@ -24,6 +24,7 @@ import java.util.List;
 import java.util.Map;
 
 import org.apache.lucene.store.AlreadyClosedException;
+import org.apache.solr.common.MapWriter;
 import org.apache.solr.core.CoreContainer;
 
 public class AutoScaling {
@@ -48,7 +49,7 @@ public class AutoScaling {
     AFTER_ACTION
   }
 
-  public interface TriggerEvent {
+  public interface TriggerEvent extends MapWriter {
     EventType getEventType();
 
     String getSource();

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/e15ce809/solr/core/src/java/org/apache/solr/cloud/autoscaling/NodeAddedTrigger.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/cloud/autoscaling/NodeAddedTrigger.java b/solr/core/src/java/org/apache/solr/cloud/autoscaling/NodeAddedTrigger.java
index 86cc13e..dac40b5 100644
--- a/solr/core/src/java/org/apache/solr/cloud/autoscaling/NodeAddedTrigger.java
+++ b/solr/core/src/java/org/apache/solr/cloud/autoscaling/NodeAddedTrigger.java
@@ -226,7 +226,6 @@ public class NodeAddedTrigger implements AutoScaling.Trigger<NodeAddedTrigger.No
   }
 
   public static class NodeAddedEvent extends TriggerEventBase {
-    public static final String NODE_NAME = "nodeName";
 
     public NodeAddedEvent(AutoScaling.EventType eventType, String source, long nodeAddedNanoTime, String nodeAdded) {
       super(eventType, source, nodeAddedNanoTime, Collections.singletonMap(NODE_NAME, nodeAdded));

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/e15ce809/solr/core/src/java/org/apache/solr/cloud/autoscaling/NodeLostTrigger.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/cloud/autoscaling/NodeLostTrigger.java b/solr/core/src/java/org/apache/solr/cloud/autoscaling/NodeLostTrigger.java
index 35c94ac..4eb71fe 100644
--- a/solr/core/src/java/org/apache/solr/cloud/autoscaling/NodeLostTrigger.java
+++ b/solr/core/src/java/org/apache/solr/cloud/autoscaling/NodeLostTrigger.java
@@ -220,7 +220,6 @@ public class NodeLostTrigger implements AutoScaling.Trigger<NodeLostTrigger.Node
   }
 
   public static class NodeLostEvent extends TriggerEventBase {
-    public static final String NODE_NAME = "nodeName";
 
     public NodeLostEvent(AutoScaling.EventType eventType, String source, long nodeLostNanoTime, String nodeRemoved) {
       super(eventType, source, nodeLostNanoTime, Collections.singletonMap(NODE_NAME, nodeRemoved));

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/e15ce809/solr/core/src/java/org/apache/solr/cloud/autoscaling/OverseerTriggerThread.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/cloud/autoscaling/OverseerTriggerThread.java b/solr/core/src/java/org/apache/solr/cloud/autoscaling/OverseerTriggerThread.java
index 0db38fb..dcc76b4 100644
--- a/solr/core/src/java/org/apache/solr/cloud/autoscaling/OverseerTriggerThread.java
+++ b/solr/core/src/java/org/apache/solr/cloud/autoscaling/OverseerTriggerThread.java
@@ -98,7 +98,7 @@ public class OverseerTriggerThread implements Runnable, Closeable {
     SolrZkClient zkClient = zkStateReader.getZkClient();
     createWatcher(zkClient);
 
-    while (true) {
+    while (!isClosed) {
       Map<String, AutoScaling.Trigger> copy = null;
       try {
         // this can throw InterruptedException and we don't want to unlock if it did, so we keep this outside

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/e15ce809/solr/core/src/java/org/apache/solr/cloud/autoscaling/ScheduledTriggers.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/cloud/autoscaling/ScheduledTriggers.java b/solr/core/src/java/org/apache/solr/cloud/autoscaling/ScheduledTriggers.java
index 533fbc9..74b61a1 100644
--- a/solr/core/src/java/org/apache/solr/cloud/autoscaling/ScheduledTriggers.java
+++ b/solr/core/src/java/org/apache/solr/cloud/autoscaling/ScheduledTriggers.java
@@ -225,6 +225,7 @@ public class ScheduledTriggers implements Closeable {
 
     @Override
     public void run() {
+      log.info("--running " + trigger.getName());
       // replay accumulated events first, if any
       AutoScaling.TriggerEvent event;
       while ((event = queue.pollEvent()) != null) {

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/e15ce809/solr/core/src/java/org/apache/solr/cloud/autoscaling/TriggerEventBase.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/cloud/autoscaling/TriggerEventBase.java b/solr/core/src/java/org/apache/solr/cloud/autoscaling/TriggerEventBase.java
index 2290e40..168dfaa 100644
--- a/solr/core/src/java/org/apache/solr/cloud/autoscaling/TriggerEventBase.java
+++ b/solr/core/src/java/org/apache/solr/cloud/autoscaling/TriggerEventBase.java
@@ -16,14 +16,18 @@
  */
 package org.apache.solr.cloud.autoscaling;
 
+import java.io.IOException;
 import java.util.HashMap;
 import java.util.Map;
 
+import org.apache.solr.common.MapWriter;
+
 /**
  * Base class for event implementations.
  */
 public abstract class TriggerEventBase implements AutoScaling.TriggerEvent {
   public static final String REPLAYING = "replaying";
+  public static final String NODE_NAME = "nodeName";
 
   protected final String source;
   protected final long eventNanoTime;
@@ -74,6 +78,14 @@ public abstract class TriggerEventBase implements AutoScaling.TriggerEvent {
   }
 
   @Override
+  public void writeMap(EntryWriter ew) throws IOException {
+    ew.put("source", source);
+    ew.put("eventNanoTime", eventNanoTime);
+    ew.put("eventType", eventType.toString());
+    ew.put("properties", properties);
+  }
+
+  @Override
   public String toString() {
     return this.getClass().getSimpleName() + "{" +
         "source='" + source + '\'' +

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/e15ce809/solr/core/src/java/org/apache/solr/cloud/autoscaling/TriggerEventQueue.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/cloud/autoscaling/TriggerEventQueue.java b/solr/core/src/java/org/apache/solr/cloud/autoscaling/TriggerEventQueue.java
index 3bf79a6..83b30fc 100644
--- a/solr/core/src/java/org/apache/solr/cloud/autoscaling/TriggerEventQueue.java
+++ b/solr/core/src/java/org/apache/solr/cloud/autoscaling/TriggerEventQueue.java
@@ -36,13 +36,7 @@ public class TriggerEventQueue extends DistributedQueue {
 
   public boolean offerEvent(AutoScaling.TriggerEvent event) {
     try {
-      // yuck, serializing simple beans should be supported by Utils...
-      Map<String, Object> map = new HashMap<>();
-      map.put("eventType", event.getEventType().toString());
-      map.put("source", event.getSource());
-      map.put("eventNanoTime", event.getEventNanoTime());
-      map.put("properties", event.getProperties());
-      byte[] data = Utils.toJSON(map);
+      byte[] data = Utils.toJSON(event);
       offer(data);
       return true;
     } catch (KeeperException | InterruptedException e) {

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/e15ce809/solr/core/src/test/org/apache/solr/cloud/autoscaling/TriggerIntegrationTest.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/cloud/autoscaling/TriggerIntegrationTest.java b/solr/core/src/test/org/apache/solr/cloud/autoscaling/TriggerIntegrationTest.java
index 34e8587..75cf320 100644
--- a/solr/core/src/test/org/apache/solr/cloud/autoscaling/TriggerIntegrationTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/autoscaling/TriggerIntegrationTest.java
@@ -21,7 +21,9 @@ import java.io.IOException;
 import java.lang.invoke.MethodHandles;
 import java.util.List;
 import java.util.Map;
+import java.util.concurrent.BrokenBarrierException;
 import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.CyclicBarrier;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicLong;
@@ -60,6 +62,7 @@ public class TriggerIntegrationTest extends SolrCloudTestCase {
   private static CountDownLatch actionCreated;
   private static CountDownLatch triggerFiredLatch;
   private static int waitForSeconds = 1;
+  private static CyclicBarrier actionStarted;
   private static AtomicBoolean triggerFired;
   private static AtomicReference<AutoScaling.TriggerEvent> eventRef;
 
@@ -78,6 +81,7 @@ public class TriggerIntegrationTest extends SolrCloudTestCase {
     actionCreated = new CountDownLatch(1);
     triggerFiredLatch = new CountDownLatch(1);
     triggerFired = new AtomicBoolean(false);
+    actionStarted = new CyclicBarrier(2);
     eventRef = new AtomicReference<>();
     // clear any persisted auto scaling configuration
     Stat stat = zkClient().setData(SOLR_AUTOSCALING_CONF_PATH, Utils.toJSON(new ZkNodeProps()), true);
@@ -103,7 +107,7 @@ public class TriggerIntegrationTest extends SolrCloudTestCase {
         "'event' : 'nodeAdded'," +
         "'waitFor' : '0s'," +
         "'enabled' : true," +
-        "'actions' : [{'name':'test','class':'" + ThrottingTesterAction.class.getName() + "'}]" +
+        "'actions' : [{'name':'test','class':'" + ThrottlingTesterAction.class.getName() + "'}]" +
         "}}";
     SolrRequest req = new AutoScalingHandlerTest.AutoScalingRequest(SolrRequest.METHOD.POST, path, setTriggerCommand);
     NamedList<Object> response = solrClient.request(req);
@@ -116,7 +120,7 @@ public class TriggerIntegrationTest extends SolrCloudTestCase {
         "'event' : 'nodeAdded'," +
         "'waitFor' : '0s'," +
         "'enabled' : true," +
-        "'actions' : [{'name':'test','class':'" + ThrottingTesterAction.class.getName() + "'}]" +
+        "'actions' : [{'name':'test','class':'" + ThrottlingTesterAction.class.getName() + "'}]" +
         "}}";
     req = new AutoScalingHandlerTest.AutoScalingRequest(SolrRequest.METHOD.POST, path, setTriggerCommand);
     response = solrClient.request(req);
@@ -144,7 +148,7 @@ public class TriggerIntegrationTest extends SolrCloudTestCase {
         "'event' : 'nodeLost'," +
         "'waitFor' : '0s'," +
         "'enabled' : true," +
-        "'actions' : [{'name':'test','class':'" + ThrottingTesterAction.class.getName() + "'}]" +
+        "'actions' : [{'name':'test','class':'" + ThrottlingTesterAction.class.getName() + "'}]" +
         "}}";
     req = new AutoScalingHandlerTest.AutoScalingRequest(SolrRequest.METHOD.POST, path, setTriggerCommand);
     response = solrClient.request(req);
@@ -156,7 +160,7 @@ public class TriggerIntegrationTest extends SolrCloudTestCase {
         "'event' : 'nodeLost'," +
         "'waitFor' : '0s'," +
         "'enabled' : true," +
-        "'actions' : [{'name':'test','class':'" + ThrottingTesterAction.class.getName() + "'}]" +
+        "'actions' : [{'name':'test','class':'" + ThrottlingTesterAction.class.getName() + "'}]" +
         "}}";
     req = new AutoScalingHandlerTest.AutoScalingRequest(SolrRequest.METHOD.POST, path, setTriggerCommand);
     response = solrClient.request(req);
@@ -184,7 +188,7 @@ public class TriggerIntegrationTest extends SolrCloudTestCase {
 
   static AtomicLong lastActionExecutedAt = new AtomicLong(0);
   static ReentrantLock lock = new ReentrantLock();
-  public static class ThrottingTesterAction extends TestTriggerAction {
+  public static class ThrottlingTesterAction extends TestTriggerAction {
     // nanos are very precise so we need a delta for comparison with ms
     private static final long DELTA_MS = 2;
 
@@ -456,4 +460,97 @@ public class TriggerIntegrationTest extends SolrCloudTestCase {
 
     }
   }
+
+  public static class TestEventQueueAction implements TriggerAction {
+
+    public TestEventQueueAction() {
+      log.info("TestEventQueueAction instantiated");
+      actionCreated.countDown();
+    }
+
+    @Override
+    public String getName() {
+      return this.getClass().getSimpleName();
+    }
+
+    @Override
+    public String getClassName() {
+      return this.getClass().getName();
+    }
+
+    @Override
+    public void process(AutoScaling.TriggerEvent event) {
+      eventRef.set(event);
+      try {
+        actionStarted.await();
+      } catch (InterruptedException | BrokenBarrierException e) {
+        throw new RuntimeException("broken barrier", e);
+      }
+      try {
+        Thread.sleep(5000);
+        triggerFired.compareAndSet(false, true);
+      } catch (InterruptedException e) {
+        return;
+      }
+    }
+
+    @Override
+    public void close() throws IOException {
+
+    }
+
+    @Override
+    public void init(Map<String, String> args) {
+
+    }
+  }
+
+  @Test
+  public void testEventQueue() throws Exception {
+    CloudSolrClient solrClient = cluster.getSolrClient();
+    String setTriggerCommand = "{" +
+        "'set-trigger' : {" +
+        "'name' : 'node_added_trigger1'," +
+        "'event' : 'nodeAdded'," +
+        "'waitFor' : '" + waitForSeconds + "s'," +
+        "'enabled' : true," +
+        "'actions' : [{'name':'test','class':'" + TestEventQueueAction.class.getName() + "'}]" +
+        "}}";
+    NamedList<Object> overSeerStatus = cluster.getSolrClient().request(CollectionAdminRequest.getOverseerStatus());
+    String overseerLeader = (String) overSeerStatus.get("leader");
+    int overseerLeaderIndex = 0;
+    for (int i = 0; i < cluster.getJettySolrRunners().size(); i++) {
+      JettySolrRunner jetty = cluster.getJettySolrRunner(i);
+      if (jetty.getNodeName().equals(overseerLeader)) {
+        overseerLeaderIndex = i;
+        break;
+      }
+    }
+    SolrRequest req = new AutoScalingHandlerTest.AutoScalingRequest(SolrRequest.METHOD.POST, path, setTriggerCommand);
+    NamedList<Object> response = solrClient.request(req);
+    assertEquals(response.get("result").toString(), "success");
+
+    if (!actionCreated.await(3, TimeUnit.SECONDS))  {
+      fail("The TriggerAction should have been created by now");
+    }
+
+    // add node to generate the event
+    JettySolrRunner newNode = cluster.startJettySolrRunner();
+    int await = actionStarted.await(60, TimeUnit.SECONDS);
+    assertEquals("The trigger did not fire at all", 1, await);
+    // event should be there
+    NodeAddedTrigger.NodeAddedEvent nodeAddedEvent = (NodeAddedTrigger.NodeAddedEvent) eventRef.get();
+    assertNotNull(nodeAddedEvent);
+    // but action did not complete yet so the event is still enqueued
+    assertFalse(triggerFired.get());
+    actionStarted.reset();
+    // kill overseer leader
+    cluster.stopJettySolrRunner(overseerLeaderIndex);
+    Thread.sleep(5000);
+    // new overseer leader should be elected and run triggers
+    newNode = cluster.startJettySolrRunner();
+    // it should fire again but not complete yet
+    await = actionStarted.await(600, TimeUnit.SECONDS);
+    AutoScaling.TriggerEvent replayedEvent = eventRef.get();
+  }
 }