Page MenuHomePhabricator
Paste P9394

(An Untitled Masterwork)
ActivePublic

Authored by Paladox on Oct 18 2019, 11:19 PM.
Tags
None
Referenced Files
F30857038: raw.txt
Oct 18 2019, 11:19 PM
Subscribers
None
diff --git a/java/com/google/gerrit/server/cache/h2/BUILD b/java/com/google/gerrit/server/cache/h2/BUILD
index 5e64aa765d..ad47200a12 100644
--- a/java/com/google/gerrit/server/cache/h2/BUILD
+++ b/java/com/google/gerrit/server/cache/h2/BUILD
@@ -8,10 +8,12 @@ java_library(
"//java/com/google/gerrit/common:annotations",
"//java/com/google/gerrit/extensions:api",
"//java/com/google/gerrit/lifecycle",
+ "//java/com/google/gerrit/httpd",
"//java/com/google/gerrit/server",
"//java/com/google/gerrit/server/cache/serialize",
"//java/com/google/gerrit/server/logging",
"//java/com/google/gerrit/server/util/time",
+ "//java/com/google/gerrit/reviewdb:server",
"//lib:guava",
"//lib:h2",
"//lib:jgit",
diff --git a/java/com/google/gerrit/server/cache/h2/H2CacheFactory.java b/java/com/google/gerrit/server/cache/h2/H2CacheFactory.java
index af1228dfe3..1548919003 100644
--- a/java/com/google/gerrit/server/cache/h2/H2CacheFactory.java
+++ b/java/com/google/gerrit/server/cache/h2/H2CacheFactory.java
@@ -45,6 +45,9 @@ import java.util.concurrent.Future;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import org.eclipse.jgit.lib.Config;
+import com.google.gerrit.extensions.registration.DynamicItem;
+import com.google.gerrit.httpd.WebSession;
+
@Singleton
class H2CacheFactory implements PersistentCacheFactory, LifecycleListener {
@@ -59,13 +62,15 @@ class H2CacheFactory implements PersistentCacheFactory, LifecycleListener {
private final ScheduledExecutorService cleanup;
private final long h2CacheSize;
private final boolean h2AutoServer;
+ private final DynamicItem<WebSession> session;
@Inject
H2CacheFactory(
MemoryCacheFactory memCacheFactory,
@GerritServerConfig Config cfg,
SitePaths site,
- DynamicMap<Cache<?, ?>> cacheMap) {
+ DynamicMap<Cache<?, ?>> cacheMap,
+ @Inject DynamicItem<WebSession> session) {
this.memCacheFactory = memCacheFactory;
config = cfg;
cacheDir = getCacheDir(site, cfg.getString("cache", null, "directory"));
@@ -91,6 +96,7 @@ class H2CacheFactory implements PersistentCacheFactory, LifecycleListener {
executor = null;
cleanup = null;
}
+ this.session = session;
}
private static Path getCacheDir(SitePaths site, String name) {
@@ -167,7 +173,7 @@ class H2CacheFactory implements PersistentCacheFactory, LifecycleListener {
SqlStore<K, V> store = newSqlStore(def, limit);
H2CacheImpl<K, V> cache =
new H2CacheImpl<>(
- executor, store, def.keyType(), (Cache<K, ValueHolder<V>>) memCacheFactory.build(def));
+ executor, store, def.keyType(), (Cache<K, ValueHolder<V>>) memCacheFactory.build(def), session);
synchronized (caches) {
caches.add(cache);
}
@@ -189,7 +195,7 @@ class H2CacheFactory implements PersistentCacheFactory, LifecycleListener {
(Cache<K, ValueHolder<V>>)
memCacheFactory.build(
def, (CacheLoader<K, V>) new H2CacheImpl.Loader<>(executor, store, loader));
- H2CacheImpl<K, V> cache = new H2CacheImpl<>(executor, store, def.keyType(), mem);
+ H2CacheImpl<K, V> cache = new H2CacheImpl<>(executor, store, def.keyType(), mem, session);
synchronized (caches) {
caches.add(cache);
}
diff --git a/java/com/google/gerrit/server/cache/h2/H2CacheImpl.java b/java/com/google/gerrit/server/cache/h2/H2CacheImpl.java
index ef4e44cd4f..d49e8fa3c3 100644
--- a/java/com/google/gerrit/server/cache/h2/H2CacheImpl.java
+++ b/java/com/google/gerrit/server/cache/h2/H2CacheImpl.java
@@ -14,6 +14,7 @@
package com.google.gerrit.server.cache.h2;
+import com.google.gerrit.httpd.WebSession;
import com.google.common.base.Throwables;
import com.google.common.cache.AbstractLoadingCache;
import com.google.common.cache.Cache;
@@ -51,6 +52,10 @@ import java.util.concurrent.Future;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicLong;
+import com.google.gerrit.extensions.registration.DynamicItem;
+import com.google.gerrit.httpd.WebSession;
+import com.google.gerrit.reviewdb.client.Account;
+
/**
* Hybrid in-memory and database backed cache built on H2.
@@ -83,16 +88,19 @@ public class H2CacheImpl<K, V> extends AbstractLoadingCache<K, V> implements Per
private final SqlStore<K, V> store;
private final TypeLiteral<K> keyType;
private final Cache<K, ValueHolder<V>> mem;
+ private final DynamicItem<WebSession> session;
H2CacheImpl(
Executor executor,
SqlStore<K, V> store,
TypeLiteral<K> keyType,
- Cache<K, ValueHolder<V>> mem) {
+ Cache<K, ValueHolder<V>> mem,
+ DynamicItem<WebSession> session) {
this.executor = executor;
this.store = store;
this.keyType = keyType;
this.mem = mem;
+ this.session = session;
}
@Override
@@ -158,12 +166,20 @@ public class H2CacheImpl<K, V> extends AbstractLoadingCache<K, V> implements Per
@SuppressWarnings("unchecked")
@Override
public void invalidate(Object key) {
+ Account.Id id = (Account.Id) key;
+ WebSession ws = session.get();
+ ws.setUserAccountId(id);
if (keyType.getRawType().isInstance(key) && store.mightContain((K) key)) {
executor.execute(() -> store.invalidate((K) key));
}
mem.invalidate(key);
}
+ public void invalidateSpecific(Account.Id id) {
+ WebSession ws = session.get();
+ ws.setUserAccountId(id);
+ }
+
@Override
public void invalidateAll() {
store.invalidateAll();
diff --git a/java/com/google/gerrit/server/restapi/config/FlushCache.java b/java/com/google/gerrit/server/restapi/config/FlushCache.java
index 9ea9e330a1..de12b88b76 100644
--- a/java/com/google/gerrit/server/restapi/config/FlushCache.java
+++ b/java/com/google/gerrit/server/restapi/config/FlushCache.java
@@ -26,8 +26,14 @@ import com.google.gerrit.server.config.CacheResource;
import com.google.gerrit.server.permissions.GlobalPermission;
import com.google.gerrit.server.permissions.PermissionBackend;
import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.account.AccountCache;
+import com.google.gerrit.server.account.AccountResolver;
+import com.google.gerrit.server.account.AccountResource;
+import com.google.gerrit.server.account.AccountState;
import com.google.inject.Inject;
import com.google.inject.Singleton;
+import com.google.gerrit.reviewdb.client.Account;
+import java.util.Set;
@RequiresAnyCapability({FLUSH_CACHES, MAINTAIN_SERVER})
@Singleton
@@ -36,20 +42,44 @@ public class FlushCache implements RestModifyView<CacheResource, Input> {
public static final String WEB_SESSIONS = "web_sessions";
private final PermissionBackend permissionBackend;
+ private final AccountResolver accountResolver;
@Inject
- public FlushCache(PermissionBackend permissionBackend) {
+ public FlushCache(
+ PermissionBackend permissionBackend,
+ AccountResolver accountResolver) {
this.permissionBackend = permissionBackend;
+ this.accountResolver = accountResolver;
}
@Override
public Response<String> apply(CacheResource rsrc, Input input)
- throws AuthException, PermissionBackendException {
+ throws AuthException, PermissionBackendException, Exception {
if (WEB_SESSIONS.equals(rsrc.getName())) {
permissionBackend.currentUser().check(GlobalPermission.MAINTAIN_SERVER);
+
+ AccountState account;
+ Set<Account.Id> idList = accountResolver.resolve("admin").asIdSet();
+ if (idList.isEmpty()) {
+ /*throw new UnloggedFailure(
+ 1,
+ "No accounts found for your query: \""
+ + name
+ + "\""
+ + " Tip: Try double-escaping spaces, for example: \"log-users-out Last,\\\\ First\"");*/
+ }
+ for (Account.Id id : idList) {
+ account = accountResolver.resolve(id.toString()).asUnique();
+ if (account == null) {
+ //throw new UnloggedFailure("Account " + id.toString() + " does not exist.");
+ }
+ rsrc.getCache().invalidate(id);
+ }
+ } else {
+ rsrc.getCache().invalidateAll();
}
- rsrc.getCache().invalidateAll();
+ //rsrc.getCache().invalidateAll();
return Response.ok("");
}
}
diff --git a/java/com/google/gerrit/server/restapi/config/PostCaches.java b/java/com/google/gerrit/server/restapi/config/PostCaches.java
index c633af0ce5..618cdaf774 100644
--- a/java/com/google/gerrit/server/restapi/config/PostCaches.java
+++ b/java/com/google/gerrit/server/restapi/config/PostCaches.java
@@ -72,7 +72,7 @@ public class PostCaches implements RestCollectionModifyView<ConfigResource, Cach
@Override
public Response<String> apply(ConfigResource rsrc, Input input)
throws AuthException, BadRequestException, UnprocessableEntityException,
- PermissionBackendException {
+ PermissionBackendException, Exception {
if (input == null || input.operation == null) {
throw new BadRequestException("operation must be specified");
}
@@ -96,7 +96,7 @@ public class PostCaches implements RestCollectionModifyView<ConfigResource, Cach
}
}
- private void flushAll() throws AuthException, PermissionBackendException {
+ private void flushAll() throws AuthException, PermissionBackendException, Exception {
for (Extension<Cache<?, ?>> e : cacheMap) {
CacheResource cacheResource =
new CacheResource(e.getPluginName(), e.getExportName(), e.getProvider());
@@ -108,7 +108,7 @@ public class PostCaches implements RestCollectionModifyView<ConfigResource, Cach
}
private void flush(List<String> cacheNames)
- throws UnprocessableEntityException, AuthException, PermissionBackendException {
+ throws UnprocessableEntityException, AuthException, PermissionBackendException, Exception {
List<CacheResource> cacheResources = new ArrayList<>(cacheNames.size());
for (String n : cacheNames) {