From 52b94deb9ede08e9ffda05bfaf6c57efebc7832d Mon Sep 17 00:00:00 2001 From: sarahcaseybot Date: Mon, 16 Oct 2023 15:22:22 -0400 Subject: [PATCH] Use reTransact when loading the cache for database objects (#2179) Cache loads will likely always be inner transactions, if they have a transaction at all. Cache loads do not always call a transaction since they are only necessary if the cache is not fresh at the time it is called. Since the cache itself needs to decide whether or not a DB transaction is necessary, it should use the reTransact method to safely indicate that the isolation level of the outer transaction is what should be used. --- .../google/registry/model/domain/token/AllocationToken.java | 4 ++-- .../java/google/registry/model/registrar/Registrar.java | 6 +++++- .../registry/model/smd/SignedMarkRevocationListDao.java | 2 +- core/src/main/java/google/registry/model/tld/Tld.java | 5 +++-- core/src/main/java/google/registry/model/tld/Tlds.java | 2 +- 5 files changed, 12 insertions(+), 7 deletions(-) diff --git a/core/src/main/java/google/registry/model/domain/token/AllocationToken.java b/core/src/main/java/google/registry/model/domain/token/AllocationToken.java index 40202ba92..978678e98 100644 --- a/core/src/main/java/google/registry/model/domain/token/AllocationToken.java +++ b/core/src/main/java/google/registry/model/domain/token/AllocationToken.java @@ -305,14 +305,14 @@ public class AllocationToken extends UpdateAutoTimestampEntity implements Builda new CacheLoader, Optional>() { @Override public Optional load(VKey key) { - return tm().transact(() -> tm().loadByKeyIfPresent(key)); + return tm().reTransact(() -> tm().loadByKeyIfPresent(key)); } @Override public Map, Optional> loadAll( Iterable> keys) { ImmutableSet> keySet = ImmutableSet.copyOf(keys); - return tm().transact( + return tm().reTransact( () -> keySet.stream() .collect( diff --git a/core/src/main/java/google/registry/model/registrar/Registrar.java b/core/src/main/java/google/registry/model/registrar/Registrar.java index b03893937..b326037ad 100644 --- a/core/src/main/java/google/registry/model/registrar/Registrar.java +++ b/core/src/main/java/google/registry/model/registrar/Registrar.java @@ -200,7 +200,11 @@ public class Registrar extends UpdateAutoTimestampEntity implements Buildable, J /** A caching {@link Supplier} of a registrarId to {@link Registrar} map. */ private static final Supplier> CACHE_BY_REGISTRAR_ID = - memoizeWithShortExpiration(() -> Maps.uniqueIndex(loadAll(), Registrar::getRegistrarId)); + memoizeWithShortExpiration( + () -> + Maps.uniqueIndex( + tm().reTransact(() -> tm().loadAllOf(Registrar.class)), + Registrar::getRegistrarId)); /** * Unique registrar client id. Must conform to "clIDType" as defined in RFC5730. diff --git a/core/src/main/java/google/registry/model/smd/SignedMarkRevocationListDao.java b/core/src/main/java/google/registry/model/smd/SignedMarkRevocationListDao.java index ec2533926..ed633c2e7 100644 --- a/core/src/main/java/google/registry/model/smd/SignedMarkRevocationListDao.java +++ b/core/src/main/java/google/registry/model/smd/SignedMarkRevocationListDao.java @@ -28,7 +28,7 @@ public class SignedMarkRevocationListDao { /** Loads the {@link SignedMarkRevocationList}. */ static SignedMarkRevocationList load() { Optional smdrl = - tm().transact( + tm().reTransact( () -> { Long revisionId = tm().query("SELECT MAX(revisionId) FROM SignedMarkRevocationList", Long.class) diff --git a/core/src/main/java/google/registry/model/tld/Tld.java b/core/src/main/java/google/registry/model/tld/Tld.java index e2b5cadcf..441305659 100644 --- a/core/src/main/java/google/registry/model/tld/Tld.java +++ b/core/src/main/java/google/registry/model/tld/Tld.java @@ -233,7 +233,8 @@ public class Tld extends ImmutableObject implements Buildable, UnsafeSerializabl new CacheLoader() { @Override public Tld load(final String tld) { - return tm().transact(() -> tm().loadByKeyIfPresent(createVKey(tld))).orElse(null); + return tm().reTransact(() -> tm().loadByKeyIfPresent(createVKey(tld))) + .orElse(null); } @Override @@ -241,7 +242,7 @@ public class Tld extends ImmutableObject implements Buildable, UnsafeSerializabl ImmutableMap> keysMap = toMap(ImmutableSet.copyOf(tlds), Tld::createVKey); Map, Tld> entities = - tm().transact(() -> tm().loadByKeysIfPresent(keysMap.values())); + tm().reTransact(() -> tm().loadByKeysIfPresent(keysMap.values())); return Maps.transformEntries(keysMap, (k, v) -> entities.getOrDefault(v, null)); } }); diff --git a/core/src/main/java/google/registry/model/tld/Tlds.java b/core/src/main/java/google/registry/model/tld/Tlds.java index 4aea66fdc..d37725f6a 100644 --- a/core/src/main/java/google/registry/model/tld/Tlds.java +++ b/core/src/main/java/google/registry/model/tld/Tlds.java @@ -56,7 +56,7 @@ public final class Tlds { private static Supplier> createFreshCache() { return memoizeWithShortExpiration( () -> - tm().transact( + tm().reTransact( () -> { EntityManager entityManager = tm().getEntityManager(); Stream resultStream =