summaryrefslogtreecommitdiffstats
path: root/src/main/java/com/googlesource/gerrit/plugins/replication/ReplicationQueue.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/com/googlesource/gerrit/plugins/replication/ReplicationQueue.java')
-rw-r--r--src/main/java/com/googlesource/gerrit/plugins/replication/ReplicationQueue.java22
1 files changed, 21 insertions, 1 deletions
diff --git a/src/main/java/com/googlesource/gerrit/plugins/replication/ReplicationQueue.java b/src/main/java/com/googlesource/gerrit/plugins/replication/ReplicationQueue.java
index 30aff44..4c7bdfc 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/replication/ReplicationQueue.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/replication/ReplicationQueue.java
@@ -15,6 +15,7 @@
package com.googlesource.gerrit.plugins.replication;
import com.google.common.base.Strings;
+import com.google.common.collect.Queues;
import com.google.gerrit.common.EventDispatcher;
import com.google.gerrit.extensions.events.GitReferenceUpdatedListener;
import com.google.gerrit.extensions.events.HeadUpdatedListener;
@@ -33,6 +34,7 @@ import java.io.OutputStream;
import java.net.URISyntaxException;
import java.util.Collections;
import java.util.HashSet;
+import java.util.Queue;
import java.util.Set;
import org.eclipse.jgit.internal.storage.file.FileRepository;
import org.eclipse.jgit.lib.Constants;
@@ -73,6 +75,7 @@ public class ReplicationQueue
private final ReplicationConfig config;
private final GerritSshApi gerritAdmin;
private volatile boolean running;
+ private final Queue<GitReferenceUpdatedListener.Event> beforeStartupEventsQueue;
@Inject
ReplicationQueue(
@@ -88,12 +91,14 @@ public class ReplicationQueue
config = rc;
stateLog = sl;
gerritAdmin = ga;
+ beforeStartupEventsQueue = Queues.newConcurrentLinkedQueue();
}
@Override
public void start() {
config.startup(workQueue);
running = true;
+ fireBeforeStartupEvents();
}
@Override
@@ -129,7 +134,10 @@ public class ReplicationQueue
public void onGitReferenceUpdated(GitReferenceUpdatedListener.Event event) {
ReplicationState state = new ReplicationState(new GitUpdateProcessing(dispatcher.get()));
if (!running) {
- stateLog.warn("Replication plugin did not finish startup before event", state);
+ stateLog.warn(
+ "Replication plugin did not finish startup before event, event replication is postponed",
+ state);
+ beforeStartupEventsQueue.add(event);
return;
}
@@ -168,6 +176,18 @@ public class ReplicationQueue
}
}
+ private void fireBeforeStartupEvents() {
+ Set<String> eventsReplayed = new HashSet<>();
+ for (GitReferenceUpdatedListener.Event event : beforeStartupEventsQueue) {
+ String eventKey = String.format("%s:%s", event.getProjectName(), event.getRefName());
+ if (!eventsReplayed.contains(eventKey)) {
+ repLog.info("Firing pending task {}", event);
+ onGitReferenceUpdated(event);
+ eventsReplayed.add(eventKey);
+ }
+ }
+ }
+
private Set<URIish> getURIs(Project.NameKey projectName, FilterType filterType) {
if (config.getDestinations(filterType).isEmpty()) {
return Collections.emptySet();