summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDave Borowitz <dborowitz@google.com>2017-10-09 13:15:41 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2017-10-09 13:15:41 +0000
commita7de44de38ae989d57a4858f482f776efc953a19 (patch)
treec8383dee4db5be73536dc81ef5f438b3a494909f
parentf4250afdd35df558e6d4e8247149c9e25c7f16e0 (diff)
parentb70b92ca57b1bfc2e7361e973c7ff5d041293ff8 (diff)
Merge "Fall-back to loading groups from ReviewDb if group index is not available" into stable-2.15
-rw-r--r--gerrit-server/src/main/java/com/google/gerrit/server/account/AccountCacheImpl.java3
-rw-r--r--gerrit-server/src/main/java/com/google/gerrit/server/account/GroupCacheImpl.java21
-rw-r--r--gerrit-server/src/main/java/com/google/gerrit/server/group/Groups.java23
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