diff --git a/java/com/google/gerrit/server/AnonymousUser.java b/java/com/google/gerrit/server/AnonymousUser.java index c96d61aab5..91d2d05e49 100644 --- a/java/com/google/gerrit/server/AnonymousUser.java +++ b/java/com/google/gerrit/server/AnonymousUser.java @@ -26,6 +26,12 @@ public class AnonymousUser extends CurrentUser { return new ListGroupMembership(Collections.singleton(SystemGroupBackend.ANONYMOUS_USERS)); } + @Override + public Object getCacheKey() { + // Treat all anonymous users as a single user + return "anonymous"; + } + @Override public String toString() { return "ANONYMOUS"; diff --git a/java/com/google/gerrit/server/CurrentUser.java b/java/com/google/gerrit/server/CurrentUser.java index 43d3c7b83d..825b34f3d7 100644 --- a/java/com/google/gerrit/server/CurrentUser.java +++ b/java/com/google/gerrit/server/CurrentUser.java @@ -91,6 +91,12 @@ public abstract class CurrentUser { */ public abstract GroupMembership getEffectiveGroups(); + /** + * Returns a unique identifier for this user that is intended to be used as a cache key. Returned + * object should to implement {@code equals()} and {@code hashCode()} for effective caching. + */ + public abstract Object getCacheKey(); + /** Unique name of the user on this server, if one has been assigned. */ public Optional getUserName() { return Optional.empty(); diff --git a/java/com/google/gerrit/server/IdentifiedUser.java b/java/com/google/gerrit/server/IdentifiedUser.java index ec2eb819bf..75c7cda98e 100644 --- a/java/com/google/gerrit/server/IdentifiedUser.java +++ b/java/com/google/gerrit/server/IdentifiedUser.java @@ -413,6 +413,11 @@ public class IdentifiedUser extends CurrentUser { return effectiveGroups; } + @Override + public Object getCacheKey() { + return getAccountId(); + } + public PersonIdent newRefLogIdent() { return newRefLogIdent(new Date(), TimeZone.getDefault()); } diff --git a/java/com/google/gerrit/server/InternalUser.java b/java/com/google/gerrit/server/InternalUser.java index 821a0c6135..381819d980 100644 --- a/java/com/google/gerrit/server/InternalUser.java +++ b/java/com/google/gerrit/server/InternalUser.java @@ -35,6 +35,11 @@ public class InternalUser extends CurrentUser { return GroupMembership.EMPTY; } + @Override + public String getCacheKey() { + return "internal"; + } + @Override public boolean isInternalUser() { return true; diff --git a/java/com/google/gerrit/server/PeerDaemonUser.java b/java/com/google/gerrit/server/PeerDaemonUser.java index 8a8b67a2be..b27e05cf41 100644 --- a/java/com/google/gerrit/server/PeerDaemonUser.java +++ b/java/com/google/gerrit/server/PeerDaemonUser.java @@ -40,6 +40,11 @@ public class PeerDaemonUser extends CurrentUser { return GroupMembership.EMPTY; } + @Override + public Object getCacheKey() { + return getRemoteAddress(); + } + public SocketAddress getRemoteAddress() { return peer; } diff --git a/java/com/google/gerrit/server/query/change/GroupBackedUser.java b/java/com/google/gerrit/server/query/change/GroupBackedUser.java index dac555d1b6..3960813b40 100644 --- a/java/com/google/gerrit/server/query/change/GroupBackedUser.java +++ b/java/com/google/gerrit/server/query/change/GroupBackedUser.java @@ -64,4 +64,9 @@ public final class GroupBackedUser extends CurrentUser { public String getLoggableName() { return "GroupBackedUser with memberships: " + groups.getKnownGroups(); } + + @Override + public Object getCacheKey() { + return groups.getKnownGroups(); + } } diff --git a/javatests/com/google/gerrit/server/extensions/webui/UiActionsTest.java b/javatests/com/google/gerrit/server/extensions/webui/UiActionsTest.java index 1cdca1b695..de23ef4573 100644 --- a/javatests/com/google/gerrit/server/extensions/webui/UiActionsTest.java +++ b/javatests/com/google/gerrit/server/extensions/webui/UiActionsTest.java @@ -100,6 +100,11 @@ public class UiActionsTest { throw new UnsupportedOperationException("not implemented"); } + @Override + public Object getCacheKey() { + return new Object(); + } + @Override public boolean isIdentifiedUser() { return true; diff --git a/javatests/com/google/gerrit/server/permissions/RefControlTest.java b/javatests/com/google/gerrit/server/permissions/RefControlTest.java index 64f9392f97..81cb732b82 100644 --- a/javatests/com/google/gerrit/server/permissions/RefControlTest.java +++ b/javatests/com/google/gerrit/server/permissions/RefControlTest.java @@ -1197,6 +1197,11 @@ public class RefControlTest { return groups; } + @Override + public Object getCacheKey() { + return new Object(); + } + @Override public Optional getUserName() { return Optional.ofNullable(username); diff --git a/plugins/replication b/plugins/replication index 10b616284a..a6a6ec5982 160000 --- a/plugins/replication +++ b/plugins/replication @@ -1 +1 @@ -Subproject commit 10b616284a846dade09a330896ec76e80df1c68c +Subproject commit a6a6ec5982e41a0ee9bfe24a46be96d4f13fcaaa