GroupNameNotes: add consistency check for loadAllGroupReferences

This change checks whether there are duplicate UUIDs when we
load all of the group name notes. Possible inconsistencies are
logged as warnings.

Change-Id: Id68353c9e58710b9f4db967c7ec8ac6582a75e6f
This commit is contained in:
Changcheng Xiao
2017-11-27 15:21:55 +01:00
parent a1517102ee
commit 59fecfc6e3
2 changed files with 28 additions and 4 deletions

View File

@@ -32,9 +32,11 @@ import com.google.gerrit.server.git.VersionedMetaData;
import com.google.gwtorm.server.OrmDuplicateKeyException;
import java.io.IOException;
import java.util.Collection;
import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.Set;
import org.eclipse.jgit.errors.ConfigInvalidException;
import org.eclipse.jgit.lib.BatchRefUpdate;
import org.eclipse.jgit.lib.CommitBuilder;
@@ -178,12 +180,19 @@ public class GroupNameNotes extends VersionedMetaData {
ObjectReader reader = revWalk.getObjectReader()) {
RevCommit notesCommit = revWalk.parseCommit(ref.getObjectId());
NoteMap noteMap = NoteMap.read(reader, notesCommit);
ImmutableSet.Builder<GroupReference> groupReferences = ImmutableSet.builder();
Set<GroupReference> groupReferences = new LinkedHashSet<>();
for (Note note : noteMap) {
GroupReference groupReference = getGroupReference(reader, note.getData());
groupReferences.add(groupReference);
boolean result = groupReferences.add(groupReference);
if (!result) {
GroupsNoteDbConsistencyChecker.logConsistencyProblemAsWarning(
"The UUID of group %s (%s) is duplicate in group name notes",
groupReference.getName(), groupReference.getUUID());
}
}
return groupReferences.build();
return ImmutableSet.copyOf(groupReferences);
}
}

View File

@@ -15,6 +15,7 @@
package com.google.gerrit.server.group.db;
import static com.google.gerrit.extensions.api.config.ConsistencyCheckInfo.ConsistencyProblemInfo.error;
import static com.google.gerrit.extensions.api.config.ConsistencyCheckInfo.ConsistencyProblemInfo.warning;
import com.google.common.collect.BiMap;
import com.google.common.collect.HashBiMap;
@@ -41,11 +42,13 @@ import org.eclipse.jgit.notes.Note;
import org.eclipse.jgit.notes.NoteMap;
import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.jgit.revwalk.RevWalk;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/** Check the referential integrity of NoteDb group storage. */
@Singleton
public class GroupsNoteDbConsistencyChecker {
private static final Logger log = LoggerFactory.getLogger(GroupsNoteDbConsistencyChecker.class);
/**
* The result of a consistency check. The UUID map is only non-null if no problems were detected.
*/
@@ -206,4 +209,16 @@ public class GroupsNoteDbConsistencyChecker {
return problems;
}
public static void logConsistencyProblemAsWarning(String fmt, Object... args) {
logConsistencyProblem(warning(fmt, args));
}
public static void logConsistencyProblem(ConsistencyProblemInfo p) {
if (p.status == ConsistencyProblemInfo.Status.WARNING) {
log.warn(p.message);
} else {
log.error(p.message);
}
}
}