in src/main/java/com/googlesource/gerrit/plugins/replication/pull/FetchOne.java [395:475]
private void updateStates(List<RefUpdateState> refUpdates) throws IOException {
Set<String> doneRefs = new HashSet<>();
boolean anyRefFailed = false;
RefUpdate.Result lastRefUpdateResult = RefUpdate.Result.NO_CHANGE;
for (RefUpdateState u : refUpdates) {
ReplicationState.RefFetchResult fetchStatus = ReplicationState.RefFetchResult.SUCCEEDED;
Set<ReplicationState> logStates = new HashSet<>();
lastRefUpdateResult = u.getResult();
logStates.addAll(stateMap.get(u.getRemoteName()));
logStates.addAll(stateMap.get(ALL_REFS));
ReplicationState[] logStatesArray = logStates.toArray(new ReplicationState[logStates.size()]);
doneRefs.add(u.getRemoteName());
switch (u.getResult()) {
case NO_CHANGE:
case NEW:
case FORCED:
case RENAMED:
case FAST_FORWARD:
break;
case NOT_ATTEMPTED:
case REJECTED:
case REJECTED_CURRENT_BRANCH:
case REJECTED_MISSING_OBJECT:
stateLog.error(
String.format(
"Failed replicate %s from %s: result %s", uri, u.getRemoteName(), u.getResult()),
logStatesArray);
fetchStatus = ReplicationState.RefFetchResult.FAILED;
anyRefFailed = true;
break;
case LOCK_FAILURE:
throw new LockFailureException(uri, u.toString());
case IO_FAILURE:
throw new IOException(u.toString());
case REJECTED_OTHER_REASON:
stateLog.error(
String.format(
"Failed replicate %s from %s, reason: %s", uri, u.getRemoteName(), u.toString()),
logStatesArray);
fetchStatus = ReplicationState.RefFetchResult.FAILED;
anyRefFailed = true;
break;
}
for (ReplicationState rs : getStatesByRef(u.getRemoteName())) {
rs.notifyRefReplicated(
projectName.get(), u.getRemoteName(), uri, fetchStatus, u.getResult());
}
}
doneRefs.add(ALL_REFS);
for (ReplicationState rs : getStatesByRef(ALL_REFS)) {
rs.notifyRefReplicated(
projectName.get(),
ALL_REFS,
uri,
anyRefFailed
? ReplicationState.RefFetchResult.FAILED
: ReplicationState.RefFetchResult.SUCCEEDED,
lastRefUpdateResult);
}
for (Map.Entry<String, ReplicationState> entry : stateMap.entries()) {
if (!doneRefs.contains(entry.getKey())) {
entry
.getValue()
.notifyRefReplicated(
projectName.get(),
entry.getKey(),
uri,
ReplicationState.RefFetchResult.NOT_ATTEMPTED,
null);
}
}
stateMap.clear();
}