Fix delete change event propagation

For deleted changes the checker always returns no result and thus all
change deletion events are erroneously dropped. To rectify skip the
check in that case, construct the index event manually and dispatch
it to the other nodes.

Change-Id: I567b6e12c772174d554ca3c5d3f9cda4c2dba518
diff --git a/src/main/java/com/ericsson/gerrit/plugins/highavailability/index/IndexEventHandler.java b/src/main/java/com/ericsson/gerrit/plugins/highavailability/index/IndexEventHandler.java
index 3010689..122327e 100644
--- a/src/main/java/com/ericsson/gerrit/plugins/highavailability/index/IndexEventHandler.java
+++ b/src/main/java/com/ericsson/gerrit/plugins/highavailability/index/IndexEventHandler.java
@@ -83,23 +83,38 @@
 
   private void executeIndexChangeTask(String projectName, int id, boolean deleted) {
     if (!Context.isForwardedEvent()) {
-      ChangeChecker checker = changeChecker.create(projectName + "~" + id);
-      try {
-        checker
-            .newIndexEvent()
-            .map(event -> new IndexChangeTask(projectName, id, deleted, event))
-            .ifPresent(
-                task -> {
-                  if (queuedTasks.add(task)) {
-                    executor.execute(task);
-                  }
-                });
-      } catch (Exception e) {
-        log.warn("Unable to create task to handle change {}~{}", projectName, id, e);
+      if (deleted) {
+        deleteChangeFromIndex(projectName, id);
+      } else {
+        reindexChange(projectName, id);
       }
     }
   }
 
+  private void reindexChange(String projectName, int id) {
+    ChangeChecker checker = changeChecker.create(projectName + "~" + id);
+    try {
+      checker
+          .newIndexEvent()
+          .map(event -> new IndexChangeTask(projectName, id, false, event))
+          .ifPresent(
+              task -> {
+                if (queuedTasks.add(task)) {
+                  executor.execute(task);
+                }
+              });
+    } catch (Exception e) {
+      log.warn("Unable to create task to reindex change {}~{}", projectName, id, e);
+    }
+  }
+
+  private void deleteChangeFromIndex(String projectName, int id) {
+    IndexChangeTask task = new IndexChangeTask(projectName, id, true, new IndexEvent());
+    if (queuedTasks.add(task)) {
+      executor.execute(task);
+    }
+  }
+
   abstract class IndexTask implements Runnable {
     protected final IndexEvent indexEvent;
 
diff --git a/src/test/java/com/ericsson/gerrit/plugins/highavailability/index/IndexEventHandlerTest.java b/src/test/java/com/ericsson/gerrit/plugins/highavailability/index/IndexEventHandlerTest.java
index 3ec979c..3240b84 100644
--- a/src/test/java/com/ericsson/gerrit/plugins/highavailability/index/IndexEventHandlerTest.java
+++ b/src/test/java/com/ericsson/gerrit/plugins/highavailability/index/IndexEventHandlerTest.java
@@ -86,6 +86,8 @@
   public void shouldDeleteFromIndexInRemoteOnChangeDeletedEvent() throws Exception {
     indexEventHandler.onChangeDeleted(changeId.get());
     verify(forwarder).deleteChangeFromIndex(eq(CHANGE_ID), any());
+    verifyZeroInteractions(
+        changeCheckerMock); // Deleted changes should not be checked against NoteDb
   }
 
   @Test