diff options
author | Dave Borowitz <dborowitz@google.com> | 2017-10-09 13:15:41 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2017-10-09 13:15:41 +0000 |
commit | a7de44de38ae989d57a4858f482f776efc953a19 (patch) | |
tree | c8383dee4db5be73536dc81ef5f438b3a494909f | |
parent | f4250afdd35df558e6d4e8247149c9e25c7f16e0 (diff) | |
parent | b70b92ca57b1bfc2e7361e973c7ff5d041293ff8 (diff) |
Merge "Fall-back to loading groups from ReviewDb if group index is not available" into stable-2.15
3 files changed, 44 insertions, 3 deletions
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountCacheImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountCacheImpl.java index adca6fb6d3..d062842441 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountCacheImpl.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountCacheImpl.java @@ -224,7 +224,8 @@ public class AccountCacheImpl implements AccountCache { private ImmutableSet<AccountGroup.UUID> getGroupsWithMember(ReviewDb db, Account.Id memberId) throws OrmException { Stream<InternalGroup> internalGroupStream; - if (groupIndexProvider.get().getSchema().hasField(GroupField.MEMBER)) { + if (groupIndexProvider.get() != null + && groupIndexProvider.get().getSchema().hasField(GroupField.MEMBER)) { internalGroupStream = groupQueryProvider.get().byMember(memberId).stream(); } else { internalGroupStream = diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupCacheImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupCacheImpl.java index 81996ab411..7887929f4a 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupCacheImpl.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupCacheImpl.java @@ -21,6 +21,7 @@ import com.google.gerrit.reviewdb.server.ReviewDb; import com.google.gerrit.server.cache.CacheModule; import com.google.gerrit.server.group.Groups; import com.google.gerrit.server.group.InternalGroup; +import com.google.gerrit.server.index.group.GroupIndexCollection; import com.google.gerrit.server.index.group.GroupIndexer; import com.google.gerrit.server.query.group.InternalGroupQuery; import com.google.gwtorm.server.SchemaFactory; @@ -147,16 +148,32 @@ public class GroupCacheImpl implements GroupCache { } static class ByIdLoader extends CacheLoader<AccountGroup.Id, Optional<InternalGroup>> { + private final SchemaFactory<ReviewDb> schema; + private final Groups groups; + private final boolean hasGroupIndex; private final Provider<InternalGroupQuery> groupQueryProvider; @Inject - ByIdLoader(Provider<InternalGroupQuery> groupQueryProvider) { + ByIdLoader( + SchemaFactory<ReviewDb> schema, + Groups groups, + GroupIndexCollection groupIndexCollection, + Provider<InternalGroupQuery> groupQueryProvider) { + this.schema = schema; + this.groups = groups; + this.hasGroupIndex = groupIndexCollection.getSearchIndex() != null; this.groupQueryProvider = groupQueryProvider; } @Override public Optional<InternalGroup> load(AccountGroup.Id key) throws Exception { - return groupQueryProvider.get().byId(key); + if (hasGroupIndex) { + return groupQueryProvider.get().byId(key); + } + + try (ReviewDb db = schema.open()) { + return groups.getGroup(db, key); + } } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/group/Groups.java b/gerrit-server/src/main/java/com/google/gerrit/server/group/Groups.java index a2660f2672..233f36b385 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/group/Groups.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/group/Groups.java @@ -47,6 +47,29 @@ import java.util.stream.Stream; public class Groups { /** + * Returns the {@code AccountGroup} for the specified ID if it exists. + * + * @param db the {@code ReviewDb} instance to use for lookups + * @param groupId the ID of the group + * @return the found {@code AccountGroup} if it exists, or else an empty {@code Optional} + * @throws OrmException if the group couldn't be retrieved from ReviewDb + */ + public Optional<InternalGroup> getGroup(ReviewDb db, AccountGroup.Id groupId) + throws OrmException, NoSuchGroupException { + Optional<AccountGroup> accountGroup = Optional.ofNullable(db.accountGroups().get(groupId)); + + if (!accountGroup.isPresent()) { + return Optional.empty(); + } + + AccountGroup.UUID groupUuid = accountGroup.get().getGroupUUID(); + ImmutableSet<Account.Id> members = getMembers(db, groupUuid).collect(toImmutableSet()); + ImmutableSet<AccountGroup.UUID> subgroups = + getSubgroups(db, groupUuid).collect(toImmutableSet()); + return accountGroup.map(group -> InternalGroup.create(group, members, subgroups)); + } + + /** * Returns the {@code InternalGroup} for the specified UUID if it exists. * * @param db the {@code ReviewDb} instance to use for lookups |