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:
@@ -32,9 +32,11 @@ import com.google.gerrit.server.git.VersionedMetaData;
|
|||||||
import com.google.gwtorm.server.OrmDuplicateKeyException;
|
import com.google.gwtorm.server.OrmDuplicateKeyException;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
import java.util.LinkedHashSet;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
import java.util.Set;
|
||||||
import org.eclipse.jgit.errors.ConfigInvalidException;
|
import org.eclipse.jgit.errors.ConfigInvalidException;
|
||||||
import org.eclipse.jgit.lib.BatchRefUpdate;
|
import org.eclipse.jgit.lib.BatchRefUpdate;
|
||||||
import org.eclipse.jgit.lib.CommitBuilder;
|
import org.eclipse.jgit.lib.CommitBuilder;
|
||||||
@@ -178,12 +180,19 @@ public class GroupNameNotes extends VersionedMetaData {
|
|||||||
ObjectReader reader = revWalk.getObjectReader()) {
|
ObjectReader reader = revWalk.getObjectReader()) {
|
||||||
RevCommit notesCommit = revWalk.parseCommit(ref.getObjectId());
|
RevCommit notesCommit = revWalk.parseCommit(ref.getObjectId());
|
||||||
NoteMap noteMap = NoteMap.read(reader, notesCommit);
|
NoteMap noteMap = NoteMap.read(reader, notesCommit);
|
||||||
ImmutableSet.Builder<GroupReference> groupReferences = ImmutableSet.builder();
|
|
||||||
|
Set<GroupReference> groupReferences = new LinkedHashSet<>();
|
||||||
for (Note note : noteMap) {
|
for (Note note : noteMap) {
|
||||||
GroupReference groupReference = getGroupReference(reader, note.getData());
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -15,6 +15,7 @@
|
|||||||
package com.google.gerrit.server.group.db;
|
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.error;
|
||||||
|
import static com.google.gerrit.extensions.api.config.ConsistencyCheckInfo.ConsistencyProblemInfo.warning;
|
||||||
|
|
||||||
import com.google.common.collect.BiMap;
|
import com.google.common.collect.BiMap;
|
||||||
import com.google.common.collect.HashBiMap;
|
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.notes.NoteMap;
|
||||||
import org.eclipse.jgit.revwalk.RevCommit;
|
import org.eclipse.jgit.revwalk.RevCommit;
|
||||||
import org.eclipse.jgit.revwalk.RevWalk;
|
import org.eclipse.jgit.revwalk.RevWalk;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
/** Check the referential integrity of NoteDb group storage. */
|
/** Check the referential integrity of NoteDb group storage. */
|
||||||
@Singleton
|
@Singleton
|
||||||
public class GroupsNoteDbConsistencyChecker {
|
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.
|
* 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;
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user