in src/main/java/com/googlesource/gerrit/plugins/replication/Destination.java [393:447]
void schedule(
Project.NameKey project, String ref, URIish uri, ReplicationState state, boolean now) {
if (!shouldReplicate(project, ref, state)) {
repLog.atFine().log("Not scheduling replication %s:%s => %s", project, ref, uri);
return;
}
repLog.atInfo().log("scheduling replication %s:%s => %s", project, ref, uri);
if (!config.replicatePermissions()) {
PushOne e;
synchronized (stateLock) {
e = getPendingPush(uri);
}
if (e == null) {
try (Repository git = gitManager.openRepository(project)) {
try {
Ref head = git.exactRef(Constants.HEAD);
if (head != null
&& head.isSymbolic()
&& RefNames.REFS_CONFIG.equals(head.getLeaf().getName())) {
return;
}
} catch (IOException err) {
stateLog.error(String.format("cannot check type of project %s", project), err, state);
return;
}
} catch (IOException err) {
stateLog.error(String.format(PROJECT_NOT_AVAILABLE, project), err, state);
return;
}
}
}
synchronized (stateLock) {
PushOne task = getPendingPush(uri);
if (task == null) {
task = opFactory.create(project, uri);
addRef(task, ref);
task.addState(ref, state);
@SuppressWarnings("unused")
ScheduledFuture<?> ignored =
pool.schedule(task, now ? 0 : config.getDelay(), TimeUnit.SECONDS);
pending.put(uri, task);
repLog.atInfo().log(
"scheduled %s:%s => %s to run %s",
project, ref, task, now ? "now" : "after " + config.getDelay() + "s");
} else {
addRef(task, ref);
task.addState(ref, state);
repLog.atInfo().log(
"consolidated %s:%s => %s with an existing pending push", project, ref, task);
}
state.increasePushTaskCount(project.get(), ref);
}
}