mirror of
https://github.com/google/nomulus.git
synced 2025-05-15 08:57:12 +02:00
Invalidate premium list cache on update
This will only affect the tools service, the primary use case being (1) I go to create a domain through nomulus tool, realize it's premium, (2) update the premium list to not include that domain, (3) kill the tools service instance to wipe out the cached premium value, then (4) create the domain at standard. This commit eliminates step 3. ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=226180160
This commit is contained in:
parent
4a4989e2a5
commit
56b61ad5a2
3 changed files with 38 additions and 13 deletions
|
@ -132,16 +132,22 @@ public final class PremiumList extends BaseDomainLabelList<Money, PremiumList.Pr
|
||||||
* <p>This is cached for a shorter duration because we need to periodically reload this entity to
|
* <p>This is cached for a shorter duration because we need to periodically reload this entity to
|
||||||
* check if a new revision has been published, and if so, then use that.
|
* check if a new revision has been published, and if so, then use that.
|
||||||
*/
|
*/
|
||||||
static final LoadingCache<String, PremiumList> cachePremiumLists =
|
@NonFinalForTesting
|
||||||
CacheBuilder.newBuilder()
|
static LoadingCache<String, PremiumList> cachePremiumLists =
|
||||||
.expireAfterWrite(getDomainLabelListCacheDuration().getMillis(), MILLISECONDS)
|
createCachePremiumLists(getDomainLabelListCacheDuration());
|
||||||
.build(
|
|
||||||
new CacheLoader<String, PremiumList>() {
|
@VisibleForTesting
|
||||||
@Override
|
static LoadingCache<String, PremiumList> createCachePremiumLists(Duration cachePersistDuration) {
|
||||||
public PremiumList load(final String name) {
|
return CacheBuilder.newBuilder()
|
||||||
return ofy().doTransactionless(() -> loadPremiumList(name));
|
.expireAfterWrite(cachePersistDuration.getMillis(), MILLISECONDS)
|
||||||
}
|
.build(
|
||||||
});
|
new CacheLoader<String, PremiumList>() {
|
||||||
|
@Override
|
||||||
|
public PremiumList load(final String name) {
|
||||||
|
return ofy().doTransactionless(() -> loadPremiumList(name));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
private static PremiumList loadPremiumList(String name) {
|
private static PremiumList loadPremiumList(String name) {
|
||||||
return ofy().load().type(PremiumList.class).parent(getCrossTldKey()).id(name).now();
|
return ofy().load().type(PremiumList.class).parent(getCrossTldKey()).id(name).now();
|
||||||
|
|
|
@ -174,6 +174,12 @@ public final class PremiumListUtils {
|
||||||
ofy().save().entities(newList, newRevision);
|
ofy().save().entities(newList, newRevision);
|
||||||
return newList;
|
return newList;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Invalidate the cache on this premium list so the change will take effect instantly. This only
|
||||||
|
// clears the cache on the same instance that the update was run on, which will typically be the
|
||||||
|
// only tools instance.
|
||||||
|
PremiumList.cachePremiumLists.invalidate(premiumList.getName());
|
||||||
|
|
||||||
// TODO(b/79888775): Enqueue the oldPremiumList for deletion after at least
|
// TODO(b/79888775): Enqueue the oldPremiumList for deletion after at least
|
||||||
// RegistryConfig.getDomainLabelListCacheDuration() has elapsed.
|
// RegistryConfig.getDomainLabelListCacheDuration() has elapsed.
|
||||||
return updated;
|
return updated;
|
||||||
|
|
|
@ -26,6 +26,7 @@ import static google.registry.model.registry.label.DomainLabelMetrics.PremiumLis
|
||||||
import static google.registry.model.registry.label.DomainLabelMetrics.PremiumListCheckOutcome.UNCACHED_POSITIVE;
|
import static google.registry.model.registry.label.DomainLabelMetrics.PremiumListCheckOutcome.UNCACHED_POSITIVE;
|
||||||
import static google.registry.model.registry.label.DomainLabelMetrics.premiumListChecks;
|
import static google.registry.model.registry.label.DomainLabelMetrics.premiumListChecks;
|
||||||
import static google.registry.model.registry.label.DomainLabelMetrics.premiumListProcessingTime;
|
import static google.registry.model.registry.label.DomainLabelMetrics.premiumListProcessingTime;
|
||||||
|
import static google.registry.model.registry.label.PremiumList.createCachePremiumLists;
|
||||||
import static google.registry.model.registry.label.PremiumListUtils.deletePremiumList;
|
import static google.registry.model.registry.label.PremiumListUtils.deletePremiumList;
|
||||||
import static google.registry.model.registry.label.PremiumListUtils.doesPremiumListExist;
|
import static google.registry.model.registry.label.PremiumListUtils.doesPremiumListExist;
|
||||||
import static google.registry.model.registry.label.PremiumListUtils.getPremiumPrice;
|
import static google.registry.model.registry.label.PremiumListUtils.getPremiumPrice;
|
||||||
|
@ -35,7 +36,7 @@ import static google.registry.testing.DatastoreHelper.loadPremiumListEntries;
|
||||||
import static google.registry.testing.DatastoreHelper.persistPremiumList;
|
import static google.registry.testing.DatastoreHelper.persistPremiumList;
|
||||||
import static google.registry.testing.DatastoreHelper.persistResource;
|
import static google.registry.testing.DatastoreHelper.persistResource;
|
||||||
import static google.registry.testing.JUnitBackports.assertThrows;
|
import static google.registry.testing.JUnitBackports.assertThrows;
|
||||||
import static org.joda.time.Duration.standardMinutes;
|
import static org.joda.time.Duration.standardDays;
|
||||||
|
|
||||||
import com.google.common.collect.ImmutableList;
|
import com.google.common.collect.ImmutableList;
|
||||||
import com.google.common.collect.ImmutableMap;
|
import com.google.common.collect.ImmutableMap;
|
||||||
|
@ -63,9 +64,11 @@ public class PremiumListUtilsTest {
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void before() {
|
public void before() {
|
||||||
// createTld() overwrites the premium list, so call it first.
|
// Set long persist times on caches so they can be tested (cache times default to 0 in tests).
|
||||||
PremiumList.cachePremiumListEntries =
|
PremiumList.cachePremiumListEntries =
|
||||||
PremiumList.createCachePremiumListEntries(standardMinutes(1));
|
PremiumList.createCachePremiumListEntries(standardDays(1));
|
||||||
|
PremiumList.cachePremiumLists = createCachePremiumLists(standardDays(1));
|
||||||
|
// createTld() overwrites the premium list, so call it first.
|
||||||
createTld("tld");
|
createTld("tld");
|
||||||
PremiumList pl =
|
PremiumList pl =
|
||||||
persistPremiumList(
|
persistPremiumList(
|
||||||
|
@ -309,6 +312,16 @@ public class PremiumListUtilsTest {
|
||||||
assertThat(entriesReloaded.get("test").parent).isEqualTo(resaved.getRevisionKey());
|
assertThat(entriesReloaded.get("test").parent).isEqualTo(resaved.getRevisionKey());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void test_savePremiumListAndEntries_clearsCache() {
|
||||||
|
assertThat(PremiumList.cachePremiumLists.getIfPresent("tld")).isNull();
|
||||||
|
PremiumList pl = PremiumList.getCached("tld").get();
|
||||||
|
assertThat(PremiumList.cachePremiumLists.getIfPresent("tld")).isEqualTo(pl);
|
||||||
|
savePremiumListAndEntries(
|
||||||
|
new PremiumList.Builder().setName("tld").build(), ImmutableList.of("test,USD 1"));
|
||||||
|
assertThat(PremiumList.cachePremiumLists.getIfPresent("tld")).isNull();
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testDelete() {
|
public void testDelete() {
|
||||||
persistPremiumList("gtld1", "trombone,USD 10");
|
persistPremiumList("gtld1", "trombone,USD 10");
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue