diff options
Diffstat (limited to 'gerrit-server/src/main/java/com/google/gerrit/server/account/GroupIncludeCacheImpl.java')
-rw-r--r-- | gerrit-server/src/main/java/com/google/gerrit/server/account/GroupIncludeCacheImpl.java | 129 |
1 files changed, 115 insertions, 14 deletions
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupIncludeCacheImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupIncludeCacheImpl.java index 7fbba450a2..bbcdfaff98 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupIncludeCacheImpl.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupIncludeCacheImpl.java @@ -19,7 +19,7 @@ import com.google.common.cache.LoadingCache; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Sets; import com.google.gerrit.reviewdb.client.AccountGroup; -import com.google.gerrit.reviewdb.client.AccountGroupInclude; +import com.google.gerrit.reviewdb.client.AccountGroupIncludeByUuid; import com.google.gerrit.reviewdb.server.ReviewDb; import com.google.gerrit.server.cache.CacheModule; import com.google.gwtorm.server.SchemaFactory; @@ -32,7 +32,6 @@ import com.google.inject.name.Named; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Set; @@ -44,6 +43,8 @@ public class GroupIncludeCacheImpl implements GroupIncludeCache { private static final Logger log = LoggerFactory .getLogger(GroupIncludeCacheImpl.class); private static final String BYINCLUDE_NAME = "groups_byinclude"; + private static final String MEMBERS_NAME = "groups_members"; + private static final String EXTERNAL_NAME = "groups_external"; public static Module module() { return new CacheModule() { @@ -52,7 +53,17 @@ public class GroupIncludeCacheImpl implements GroupIncludeCache { cache(BYINCLUDE_NAME, AccountGroup.UUID.class, new TypeLiteral<Set<AccountGroup.UUID>>() {}) - .loader(ByIncludeLoader.class); + .loader(MemberInLoader.class); + + cache(MEMBERS_NAME, + AccountGroup.UUID.class, + new TypeLiteral<Set<AccountGroup.UUID>>() {}) + .loader(MembersOfLoader.class); + + cache(EXTERNAL_NAME, + String.class, + new TypeLiteral<Set<AccountGroup.UUID>>() {}) + .loader(AllExternalLoader.class); bind(GroupIncludeCacheImpl.class); bind(GroupIncludeCache.class).to(GroupIncludeCacheImpl.class); @@ -60,35 +71,74 @@ public class GroupIncludeCacheImpl implements GroupIncludeCache { }; } - private final LoadingCache<AccountGroup.UUID, Set<AccountGroup.UUID>> byInclude; + private final LoadingCache<AccountGroup.UUID, Set<AccountGroup.UUID>> membersOf; + private final LoadingCache<AccountGroup.UUID, Set<AccountGroup.UUID>> memberIn; + private final LoadingCache<String, Set<AccountGroup.UUID>> external; @Inject GroupIncludeCacheImpl( - @Named(BYINCLUDE_NAME) LoadingCache<AccountGroup.UUID, Set<AccountGroup.UUID>> byInclude) { - this.byInclude = byInclude; + @Named(MEMBERS_NAME) LoadingCache<AccountGroup.UUID, Set<AccountGroup.UUID>> membersOf, + @Named(BYINCLUDE_NAME) LoadingCache<AccountGroup.UUID, Set<AccountGroup.UUID>> memberIn, + @Named(EXTERNAL_NAME) LoadingCache<String, Set<AccountGroup.UUID>> external) { + this.membersOf = membersOf; + this.memberIn = memberIn; + this.external = external; } - public Collection<AccountGroup.UUID> getByInclude(AccountGroup.UUID groupId) { + @Override + public Set<AccountGroup.UUID> membersOf(AccountGroup.UUID groupId) { try { - return byInclude.get(groupId); + return membersOf.get(groupId); + } catch (ExecutionException e) { + log.warn("Cannot load members of group", e); + return Collections.emptySet(); + } + } + + @Override + public Set<AccountGroup.UUID> memberIn(AccountGroup.UUID groupId) { + try { + return memberIn.get(groupId); } catch (ExecutionException e) { log.warn("Cannot load included groups", e); return Collections.emptySet(); } } - public void evictInclude(AccountGroup.UUID groupId) { + @Override + public void evictMembersOf(AccountGroup.UUID groupId) { if (groupId != null) { - byInclude.invalidate(groupId); + membersOf.invalidate(groupId); } } - static class ByIncludeLoader extends + @Override + public void evictMemberIn(AccountGroup.UUID groupId) { + if (groupId != null) { + memberIn.invalidate(groupId); + + if (!AccountGroup.isInternalGroup(groupId)) { + external.invalidate(EXTERNAL_NAME); + } + } + } + + @Override + public Set<AccountGroup.UUID> allExternalMembers() { + try { + return external.get(EXTERNAL_NAME); + } catch (ExecutionException e) { + log.warn("Cannot load set of non-internal groups", e); + return Collections.emptySet(); + } + } + + static class MembersOfLoader extends CacheLoader<AccountGroup.UUID, Set<AccountGroup.UUID>> { private final SchemaFactory<ReviewDb> schema; @Inject - ByIncludeLoader(final SchemaFactory<ReviewDb> sf) { + MembersOfLoader(final SchemaFactory<ReviewDb> sf) { schema = sf; } @@ -101,9 +151,34 @@ public class GroupIncludeCacheImpl implements GroupIncludeCache { return Collections.emptySet(); } + Set<AccountGroup.UUID> ids = Sets.newHashSet(); + for (AccountGroupIncludeByUuid agi : db.accountGroupIncludesByUuid() + .byGroup(group.get(0).getId())) { + ids.add(agi.getIncludeUUID()); + } + return ImmutableSet.copyOf(ids); + } finally { + db.close(); + } + } + } + + static class MemberInLoader extends + CacheLoader<AccountGroup.UUID, Set<AccountGroup.UUID>> { + private final SchemaFactory<ReviewDb> schema; + + @Inject + MemberInLoader(final SchemaFactory<ReviewDb> sf) { + schema = sf; + } + + @Override + public Set<AccountGroup.UUID> load(AccountGroup.UUID key) throws Exception { + final ReviewDb db = schema.open(); + try { Set<AccountGroup.Id> ids = Sets.newHashSet(); - for (AccountGroupInclude agi : db.accountGroupIncludes() - .byInclude(group.get(0).getId())) { + for (AccountGroupIncludeByUuid agi : db.accountGroupIncludesByUuid() + .byIncludeUUID(key)) { ids.add(agi.getGroupId()); } @@ -117,4 +192,30 @@ public class GroupIncludeCacheImpl implements GroupIncludeCache { } } } + + static class AllExternalLoader extends + CacheLoader<String, Set<AccountGroup.UUID>> { + private final SchemaFactory<ReviewDb> schema; + + @Inject + AllExternalLoader(final SchemaFactory<ReviewDb> sf) { + schema = sf; + } + + @Override + public Set<AccountGroup.UUID> load(String key) throws Exception { + final ReviewDb db = schema.open(); + try { + Set<AccountGroup.UUID> ids = Sets.newHashSet(); + for (AccountGroupIncludeByUuid agi : db.accountGroupIncludesByUuid().all()) { + if (!AccountGroup.isInternalGroup(agi.getIncludeUUID())) { + ids.add(agi.getIncludeUUID()); + } + } + return ImmutableSet.copyOf(ids); + } finally { + db.close(); + } + } + } } |