diff --git a/java/com/google/gerrit/common/TimeUtil.java b/java/com/google/gerrit/common/TimeUtil.java index 7f53f84bd0..e42eb09fc0 100644 --- a/java/com/google/gerrit/common/TimeUtil.java +++ b/java/com/google/gerrit/common/TimeUtil.java @@ -17,6 +17,7 @@ package com.google.gerrit.common; import com.google.common.annotations.GwtIncompatible; import com.google.common.annotations.VisibleForTesting; import java.sql.Timestamp; +import java.time.Instant; import java.util.function.LongSupplier; import org.eclipse.jgit.lib.Config; import org.eclipse.jgit.storage.file.FileBasedConfig; @@ -36,6 +37,10 @@ public class TimeUtil { return currentMillisSupplier.getAsLong(); } + public static Instant now() { + return Instant.ofEpochMilli(nowMs()); + } + public static Timestamp nowTs() { return new Timestamp(nowMs()); } diff --git a/java/com/google/gerrit/httpd/GitOverHttpServlet.java b/java/com/google/gerrit/httpd/GitOverHttpServlet.java index 739726ed88..c1a75bb31e 100644 --- a/java/com/google/gerrit/httpd/GitOverHttpServlet.java +++ b/java/com/google/gerrit/httpd/GitOverHttpServlet.java @@ -44,10 +44,10 @@ import com.google.inject.Singleton; import com.google.inject.TypeLiteral; import com.google.inject.name.Named; import java.io.IOException; +import java.time.Duration; import java.util.Collections; import java.util.HashSet; import java.util.Set; -import java.util.concurrent.TimeUnit; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; @@ -119,7 +119,7 @@ public class GitOverHttpServlet extends GitServlet { protected void configure() { cache(ID_CACHE, AdvertisedObjectsCacheKey.class, new TypeLiteral>() {}) .maximumWeight(4096) - .expireAfterWrite(10, TimeUnit.MINUTES); + .expireAfterWrite(Duration.ofMinutes(10)); } }); } diff --git a/java/com/google/gerrit/httpd/H2CacheBasedWebSession.java b/java/com/google/gerrit/httpd/H2CacheBasedWebSession.java index c466290b28..caced27a79 100644 --- a/java/com/google/gerrit/httpd/H2CacheBasedWebSession.java +++ b/java/com/google/gerrit/httpd/H2CacheBasedWebSession.java @@ -14,8 +14,6 @@ package com.google.gerrit.httpd; -import static java.util.concurrent.TimeUnit.MINUTES; - import com.google.common.cache.Cache; import com.google.gerrit.common.Nullable; import com.google.gerrit.extensions.registration.DynamicItem; @@ -30,6 +28,7 @@ import com.google.inject.Provider; import com.google.inject.assistedinject.FactoryModuleBuilder; import com.google.inject.name.Named; import com.google.inject.servlet.RequestScoped; +import java.time.Duration; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -41,10 +40,8 @@ public class H2CacheBasedWebSession extends CacheBasedWebSession { protected void configure() { persist(WebSessionManager.CACHE_NAME, String.class, Val.class) .maximumWeight(1024) // reasonable default for many sites - .expireAfterWrite( - CacheBasedWebSession.MAX_AGE_MINUTES, - MINUTES) // expire sessions if they are inactive - ; + // expire sessions if they are inactive + .expireAfterWrite(Duration.ofMinutes(CacheBasedWebSession.MAX_AGE_MINUTES)); install(new FactoryModuleBuilder().build(WebSessionManagerFactory.class)); DynamicItem.itemOf(binder(), WebSession.class); DynamicItem.bind(binder(), WebSession.class) diff --git a/java/com/google/gerrit/server/auth/ldap/LdapModule.java b/java/com/google/gerrit/server/auth/ldap/LdapModule.java index 05228b4168..3fbf04996f 100644 --- a/java/com/google/gerrit/server/auth/ldap/LdapModule.java +++ b/java/com/google/gerrit/server/auth/ldap/LdapModule.java @@ -14,8 +14,6 @@ package com.google.gerrit.server.auth.ldap; -import static java.util.concurrent.TimeUnit.HOURS; - import com.google.common.collect.ImmutableSet; import com.google.gerrit.extensions.registration.DynamicSet; import com.google.gerrit.reviewdb.client.Account; @@ -25,6 +23,7 @@ import com.google.gerrit.server.account.Realm; import com.google.gerrit.server.cache.CacheModule; import com.google.inject.Scopes; import com.google.inject.TypeLiteral; +import java.time.Duration; import java.util.Optional; import java.util.Set; @@ -37,18 +36,18 @@ public class LdapModule extends CacheModule { @Override protected void configure() { cache(GROUP_CACHE, String.class, new TypeLiteral>() {}) - .expireAfterWrite(1, HOURS) + .expireAfterWrite(Duration.ofHours(1)) .loader(LdapRealm.MemberLoader.class); cache(USERNAME_CACHE, String.class, new TypeLiteral>() {}) .loader(LdapRealm.UserLoader.class); cache(GROUP_EXIST_CACHE, String.class, new TypeLiteral() {}) - .expireAfterWrite(1, HOURS) + .expireAfterWrite(Duration.ofHours(1)) .loader(LdapRealm.ExistenceLoader.class); cache(PARENT_GROUPS_CACHE, String.class, new TypeLiteral>() {}) - .expireAfterWrite(1, HOURS); + .expireAfterWrite(Duration.ofHours(1)); bind(Helper.class); bind(Realm.class).to(LdapRealm.class).in(Scopes.SINGLETON); diff --git a/java/com/google/gerrit/server/cache/CacheBinding.java b/java/com/google/gerrit/server/cache/CacheBinding.java index 1c0d7effcd..a8e7419f04 100644 --- a/java/com/google/gerrit/server/cache/CacheBinding.java +++ b/java/com/google/gerrit/server/cache/CacheBinding.java @@ -16,7 +16,7 @@ package com.google.gerrit.server.cache; import com.google.common.cache.CacheLoader; import com.google.common.cache.Weigher; -import java.util.concurrent.TimeUnit; +import java.time.Duration; /** Configure a cache declared within a {@link CacheModule} instance. */ public interface CacheBinding { @@ -24,7 +24,7 @@ public interface CacheBinding { CacheBinding maximumWeight(long weight); /** Set the time an element lives before being expired. */ - CacheBinding expireAfterWrite(long duration, TimeUnit durationUnits); + CacheBinding expireAfterWrite(Duration duration); /** Populate the cache with items from the CacheLoader. */ CacheBinding loader(Class> clazz); diff --git a/java/com/google/gerrit/server/cache/CacheDef.java b/java/com/google/gerrit/server/cache/CacheDef.java index adb75857fe..574ea27b3c 100644 --- a/java/com/google/gerrit/server/cache/CacheDef.java +++ b/java/com/google/gerrit/server/cache/CacheDef.java @@ -18,7 +18,7 @@ import com.google.common.cache.CacheLoader; import com.google.common.cache.Weigher; import com.google.gerrit.common.Nullable; import com.google.inject.TypeLiteral; -import java.util.concurrent.TimeUnit; +import java.time.Duration; public interface CacheDef { /** @@ -45,7 +45,7 @@ public interface CacheDef { long maximumWeight(); @Nullable - Long expireAfterWrite(TimeUnit unit); + Duration expireAfterWrite(); @Nullable Weigher weigher(); diff --git a/java/com/google/gerrit/server/cache/CacheProvider.java b/java/com/google/gerrit/server/cache/CacheProvider.java index ce94bfa2a2..c3d3394d61 100644 --- a/java/com/google/gerrit/server/cache/CacheProvider.java +++ b/java/com/google/gerrit/server/cache/CacheProvider.java @@ -16,7 +16,6 @@ package com.google.gerrit.server.cache; import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Preconditions.checkState; -import static java.util.concurrent.TimeUnit.SECONDS; import com.google.common.base.Strings; import com.google.common.cache.Cache; @@ -27,7 +26,7 @@ import com.google.gerrit.extensions.annotations.PluginName; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.TypeLiteral; -import java.util.concurrent.TimeUnit; +import java.time.Duration; class CacheProvider implements Provider>, CacheBinding, CacheDef { private final CacheModule module; @@ -36,7 +35,7 @@ class CacheProvider implements Provider>, CacheBinding, private final TypeLiteral valType; private String configKey; private long maximumWeight; - private Long expireAfterWrite; + private Duration expireAfterWrite; private Provider> loader; private Provider> weigher; @@ -69,9 +68,9 @@ class CacheProvider implements Provider>, CacheBinding, } @Override - public CacheBinding expireAfterWrite(long duration, TimeUnit unit) { + public CacheBinding expireAfterWrite(Duration duration) { checkNotFrozen(); - expireAfterWrite = SECONDS.convert(duration, unit); + expireAfterWrite = duration; return this; } @@ -126,8 +125,8 @@ class CacheProvider implements Provider>, CacheBinding, @Override @Nullable - public Long expireAfterWrite(TimeUnit unit) { - return expireAfterWrite != null ? unit.convert(expireAfterWrite, SECONDS) : null; + public Duration expireAfterWrite() { + return expireAfterWrite; } @Override diff --git a/java/com/google/gerrit/server/cache/PersistentCacheBinding.java b/java/com/google/gerrit/server/cache/PersistentCacheBinding.java index 794d3bbeee..0239ea2f1f 100644 --- a/java/com/google/gerrit/server/cache/PersistentCacheBinding.java +++ b/java/com/google/gerrit/server/cache/PersistentCacheBinding.java @@ -16,7 +16,7 @@ package com.google.gerrit.server.cache; import com.google.common.cache.CacheLoader; import com.google.common.cache.Weigher; -import java.util.concurrent.TimeUnit; +import java.time.Duration; /** Configure a persistent cache declared within a {@link CacheModule} instance. */ public interface PersistentCacheBinding extends CacheBinding { @@ -24,7 +24,7 @@ public interface PersistentCacheBinding extends CacheBinding { PersistentCacheBinding maximumWeight(long weight); @Override - PersistentCacheBinding expireAfterWrite(long duration, TimeUnit durationUnits); + PersistentCacheBinding expireAfterWrite(Duration duration); @Override PersistentCacheBinding loader(Class> clazz); diff --git a/java/com/google/gerrit/server/cache/PersistentCacheProvider.java b/java/com/google/gerrit/server/cache/PersistentCacheProvider.java index 46a9e61ef3..2db9e56f8c 100644 --- a/java/com/google/gerrit/server/cache/PersistentCacheProvider.java +++ b/java/com/google/gerrit/server/cache/PersistentCacheProvider.java @@ -24,7 +24,7 @@ import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.TypeLiteral; import java.io.Serializable; -import java.util.concurrent.TimeUnit; +import java.time.Duration; class PersistentCacheProvider extends CacheProvider implements Provider>, PersistentCacheBinding, PersistentCacheDef { @@ -53,8 +53,8 @@ class PersistentCacheProvider extends CacheProvider } @Override - public PersistentCacheBinding expireAfterWrite(long duration, TimeUnit durationUnits) { - return (PersistentCacheBinding) super.expireAfterWrite(duration, durationUnits); + public PersistentCacheBinding expireAfterWrite(Duration duration) { + return (PersistentCacheBinding) super.expireAfterWrite(duration); } @Override diff --git a/java/com/google/gerrit/server/cache/h2/BUILD b/java/com/google/gerrit/server/cache/h2/BUILD index 96eba1c9ed..fc57a11796 100644 --- a/java/com/google/gerrit/server/cache/h2/BUILD +++ b/java/com/google/gerrit/server/cache/h2/BUILD @@ -3,6 +3,7 @@ java_library( srcs = glob(["**/*.java"]), visibility = ["//visibility:public"], deps = [ + "//java/com/google/gerrit/common:annotations", "//java/com/google/gerrit/common:server", "//java/com/google/gerrit/extensions:api", "//java/com/google/gerrit/lifecycle", diff --git a/java/com/google/gerrit/server/cache/h2/H2CacheDefProxy.java b/java/com/google/gerrit/server/cache/h2/H2CacheDefProxy.java index 7b3da31c0a..d8edebdc2f 100644 --- a/java/com/google/gerrit/server/cache/h2/H2CacheDefProxy.java +++ b/java/com/google/gerrit/server/cache/h2/H2CacheDefProxy.java @@ -16,11 +16,12 @@ package com.google.gerrit.server.cache.h2; import com.google.common.cache.CacheLoader; import com.google.common.cache.Weigher; +import com.google.gerrit.common.Nullable; import com.google.gerrit.server.cache.CacheSerializer; import com.google.gerrit.server.cache.PersistentCacheDef; import com.google.gerrit.server.cache.h2.H2CacheImpl.ValueHolder; import com.google.inject.TypeLiteral; -import java.util.concurrent.TimeUnit; +import java.time.Duration; class H2CacheDefProxy implements PersistentCacheDef { private final PersistentCacheDef source; @@ -30,8 +31,9 @@ class H2CacheDefProxy implements PersistentCacheDef { } @Override - public Long expireAfterWrite(TimeUnit unit) { - return source.expireAfterWrite(unit); + @Nullable + public Duration expireAfterWrite() { + return source.expireAfterWrite(); } @SuppressWarnings("unchecked") diff --git a/java/com/google/gerrit/server/cache/h2/H2CacheFactory.java b/java/com/google/gerrit/server/cache/h2/H2CacheFactory.java index a1cc1c2690..9abccbc30f 100644 --- a/java/com/google/gerrit/server/cache/h2/H2CacheFactory.java +++ b/java/com/google/gerrit/server/cache/h2/H2CacheFactory.java @@ -215,7 +215,6 @@ class H2CacheFactory implements PersistentCacheFactory, LifecycleListener { if (h2AutoServer) { url.append(";AUTO_SERVER=TRUE"); } - Long expireAfterWrite = def.expireAfterWrite(TimeUnit.SECONDS); return new SqlStore<>( url.toString(), def.keyType(), @@ -223,6 +222,6 @@ class H2CacheFactory implements PersistentCacheFactory, LifecycleListener { def.valueSerializer(), def.version(), maxSize, - expireAfterWrite == null ? 0 : expireAfterWrite.longValue()); + def.expireAfterWrite()); } } diff --git a/java/com/google/gerrit/server/cache/h2/H2CacheImpl.java b/java/com/google/gerrit/server/cache/h2/H2CacheImpl.java index 1c87692afd..d7baee2f97 100644 --- a/java/com/google/gerrit/server/cache/h2/H2CacheImpl.java +++ b/java/com/google/gerrit/server/cache/h2/H2CacheImpl.java @@ -23,6 +23,7 @@ import com.google.common.cache.LoadingCache; import com.google.common.collect.ImmutableSet; import com.google.common.flogger.FluentLogger; import com.google.common.hash.BloomFilter; +import com.google.gerrit.common.Nullable; import com.google.gerrit.common.TimeUtil; import com.google.gerrit.server.cache.CacheSerializer; import com.google.gerrit.server.cache.PersistentCache; @@ -35,6 +36,7 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.sql.Timestamp; +import java.time.Duration; import java.util.Calendar; import java.util.Map; import java.util.concurrent.ArrayBlockingQueue; @@ -254,7 +256,7 @@ public class H2CacheImpl extends AbstractLoadingCache implements Per private final CacheSerializer valueSerializer; private final int version; private final long maxSize; - private final long expireAfterWrite; + @Nullable private final Duration expireAfterWrite; private final BlockingQueue handles; private final AtomicLong hitCount = new AtomicLong(); private final AtomicLong missCount = new AtomicLong(); @@ -268,7 +270,7 @@ public class H2CacheImpl extends AbstractLoadingCache implements Per CacheSerializer valueSerializer, int version, long maxSize, - long expireAfterWrite) { + @Nullable Duration expireAfterWrite) { this.url = jdbcUrl; this.keyType = createKeyType(keyType, keySerializer); this.valueSerializer = valueSerializer; @@ -421,11 +423,11 @@ public class H2CacheImpl extends AbstractLoadingCache implements Per } private boolean expired(Timestamp created) { - if (expireAfterWrite == 0) { + if (expireAfterWrite == null) { return false; } - long age = TimeUtil.nowMs() - created.getTime(); - return 1000 * expireAfterWrite < age; + Duration age = Duration.between(created.toInstant(), TimeUtil.now()); + return age.compareTo(expireAfterWrite) > 0; } private void touch(SqlHandle c, K key) throws IOException, SQLException { diff --git a/java/com/google/gerrit/server/cache/mem/DefaultMemoryCacheFactory.java b/java/com/google/gerrit/server/cache/mem/DefaultMemoryCacheFactory.java index f16912a05b..2463847ab4 100644 --- a/java/com/google/gerrit/server/cache/mem/DefaultMemoryCacheFactory.java +++ b/java/com/google/gerrit/server/cache/mem/DefaultMemoryCacheFactory.java @@ -26,6 +26,7 @@ import com.google.gerrit.server.cache.MemoryCacheFactory; import com.google.gerrit.server.config.ConfigUtil; import com.google.gerrit.server.config.GerritServerConfig; import com.google.inject.Inject; +import java.time.Duration; import java.util.concurrent.TimeUnit; import org.eclipse.jgit.lib.Config; @@ -66,14 +67,19 @@ class DefaultMemoryCacheFactory implements MemoryCacheFactory { } builder.weigher(weigher); - Long age = def.expireAfterWrite(TimeUnit.SECONDS); + Duration age = def.expireAfterWrite(); if (has(def.configKey(), "maxAge")) { builder.expireAfterWrite( ConfigUtil.getTimeUnit( - cfg, "cache", def.configKey(), "maxAge", age != null ? age : 0, TimeUnit.SECONDS), + cfg, + "cache", + def.configKey(), + "maxAge", + age != null ? age.getSeconds() : 0, + TimeUnit.SECONDS), TimeUnit.SECONDS); } else if (age != null) { - builder.expireAfterWrite(age, TimeUnit.SECONDS); + builder.expireAfterWrite(age.toNanos(), TimeUnit.NANOSECONDS); } return builder; diff --git a/javatests/com/google/gerrit/server/cache/h2/H2CacheTest.java b/javatests/com/google/gerrit/server/cache/h2/H2CacheTest.java index 32d0d27e3b..4180192e6e 100644 --- a/javatests/com/google/gerrit/server/cache/h2/H2CacheTest.java +++ b/javatests/com/google/gerrit/server/cache/h2/H2CacheTest.java @@ -47,7 +47,7 @@ public class H2CacheTest { StringSerializer.INSTANCE, version, 1 << 20, - 0); + null); return new H2CacheImpl<>(MoreExecutors.directExecutor(), store, KEY_TYPE, mem); }