Don't change UpdateAutoTimestamp on DS->SQL replay (#1322)

* Don't change UpdateAutoTimestamp on DS->SQL replay
This commit is contained in:
gbrodman 2021-09-16 10:44:53 -04:00 committed by GitHub
parent b2554dfdee
commit 0b6f18f6d4
2 changed files with 38 additions and 3 deletions

View file

@ -33,6 +33,7 @@ import com.google.common.collect.ImmutableList;
import com.google.common.flogger.FluentLogger; import com.google.common.flogger.FluentLogger;
import google.registry.config.RegistryConfig.Config; import google.registry.config.RegistryConfig.Config;
import google.registry.gcs.GcsUtils; import google.registry.gcs.GcsUtils;
import google.registry.model.UpdateAutoTimestamp;
import google.registry.model.common.DatabaseMigrationStateSchedule; import google.registry.model.common.DatabaseMigrationStateSchedule;
import google.registry.model.common.DatabaseMigrationStateSchedule.MigrationState; import google.registry.model.common.DatabaseMigrationStateSchedule.MigrationState;
import google.registry.model.common.DatabaseMigrationStateSchedule.ReplayDirection; import google.registry.model.common.DatabaseMigrationStateSchedule.ReplayDirection;
@ -222,8 +223,11 @@ public class ReplayCommitLogsToSqlAction implements Runnable {
// Load and process the Datastore transactions one at a time // Load and process the Datastore transactions one at a time
ImmutableList<ImmutableList<VersionedEntity>> allTransactions = ImmutableList<ImmutableList<VersionedEntity>> allTransactions =
CommitLogImports.loadEntitiesByTransaction(input); CommitLogImports.loadEntitiesByTransaction(input);
allTransactions.forEach( try (UpdateAutoTimestamp.DisableAutoUpdateResource disabler =
transaction -> jpaTm().transact(() -> replayTransaction(transaction))); UpdateAutoTimestamp.disableAutoUpdate()) {
allTransactions.forEach(
transaction -> jpaTm().transact(() -> replayTransaction(transaction)));
}
// if we succeeded, set the last-seen time // if we succeeded, set the last-seen time
DateTime checkpoint = DateTime.parse(metadata.getName().substring(DIFF_FILE_PREFIX.length())); DateTime checkpoint = DateTime.parse(metadata.getName().substring(DIFF_FILE_PREFIX.length()));
jpaTm().transact(() -> SqlReplayCheckpoint.set(checkpoint)); jpaTm().transact(() -> SqlReplayCheckpoint.set(checkpoint));

View file

@ -19,6 +19,7 @@ import static com.google.common.truth.Truth.assertThat;
import static google.registry.backup.RestoreCommitLogsActionTest.createCheckpoint; import static google.registry.backup.RestoreCommitLogsActionTest.createCheckpoint;
import static google.registry.backup.RestoreCommitLogsActionTest.saveDiffFile; import static google.registry.backup.RestoreCommitLogsActionTest.saveDiffFile;
import static google.registry.backup.RestoreCommitLogsActionTest.saveDiffFileNotToRestore; import static google.registry.backup.RestoreCommitLogsActionTest.saveDiffFileNotToRestore;
import static google.registry.model.ImmutableObjectSubject.assertAboutImmutableObjects;
import static google.registry.model.common.DatabaseMigrationStateSchedule.DEFAULT_TRANSITION_MAP; import static google.registry.model.common.DatabaseMigrationStateSchedule.DEFAULT_TRANSITION_MAP;
import static google.registry.model.common.EntityGroupRoot.getCrossTldKey; import static google.registry.model.common.EntityGroupRoot.getCrossTldKey;
import static google.registry.model.ofy.CommitLogBucket.getBucketKey; import static google.registry.model.ofy.CommitLogBucket.getBucketKey;
@ -55,6 +56,7 @@ import google.registry.model.index.ForeignKeyIndex;
import google.registry.model.ofy.CommitLogBucket; import google.registry.model.ofy.CommitLogBucket;
import google.registry.model.ofy.CommitLogManifest; import google.registry.model.ofy.CommitLogManifest;
import google.registry.model.ofy.CommitLogMutation; import google.registry.model.ofy.CommitLogMutation;
import google.registry.model.ofy.Ofy;
import google.registry.model.rde.RdeMode; import google.registry.model.rde.RdeMode;
import google.registry.model.rde.RdeNamingUtils; import google.registry.model.rde.RdeNamingUtils;
import google.registry.model.rde.RdeRevision; import google.registry.model.rde.RdeRevision;
@ -72,6 +74,7 @@ import google.registry.testing.AppEngineExtension;
import google.registry.testing.DatabaseHelper; import google.registry.testing.DatabaseHelper;
import google.registry.testing.FakeClock; import google.registry.testing.FakeClock;
import google.registry.testing.FakeResponse; import google.registry.testing.FakeResponse;
import google.registry.testing.InjectExtension;
import google.registry.testing.TestObject; import google.registry.testing.TestObject;
import google.registry.util.RequestStatusChecker; import google.registry.util.RequestStatusChecker;
import java.io.IOException; import java.io.IOException;
@ -114,6 +117,8 @@ public class ReplayCommitLogsToSqlActionTest {
TestObject.class) TestObject.class)
.build(); .build();
@RegisterExtension public final InjectExtension inject = new InjectExtension();
/** Local GCS service. */ /** Local GCS service. */
private final GcsUtils gcsUtils = new GcsUtils(LocalStorageHelper.getOptions()); private final GcsUtils gcsUtils = new GcsUtils(LocalStorageHelper.getOptions());
@ -128,6 +133,7 @@ public class ReplayCommitLogsToSqlActionTest {
@BeforeEach @BeforeEach
void beforeEach() { void beforeEach() {
inject.setStaticField(Ofy.class, "clock", fakeClock);
action.gcsUtils = gcsUtils; action.gcsUtils = gcsUtils;
action.response = response; action.response = response;
action.requestStatusChecker = requestStatusChecker; action.requestStatusChecker = requestStatusChecker;
@ -285,7 +291,7 @@ public class ReplayCommitLogsToSqlActionTest {
} }
@Test @Test
void wtestReplay_mutateExistingEntity() throws Exception { void testReplay_mutateExistingEntity() throws Exception {
DateTime now = fakeClock.nowUtc(); DateTime now = fakeClock.nowUtc();
jpaTm().transact(() -> jpaTm().put(TestObject.create("existing", "a"))); jpaTm().transact(() -> jpaTm().put(TestObject.create("existing", "a")));
Key<CommitLogManifest> manifestKey = CommitLogManifest.createKey(getBucketKey(1), now); Key<CommitLogManifest> manifestKey = CommitLogManifest.createKey(getBucketKey(1), now);
@ -320,6 +326,31 @@ public class ReplayCommitLogsToSqlActionTest {
assertExpectedIds("previous to keep"); assertExpectedIds("previous to keep");
} }
@Test
void testReplay_doesNotChangeUpdateTime() throws Exception {
// Save the contact with an earlier updateTimestamp
ContactResource contactResource = persistActiveContact("contactfoobar");
DateTime persistenceTime = fakeClock.nowUtc();
Key<CommitLogBucket> bucketKey = getBucketKey(1);
Key<CommitLogManifest> manifestKey = CommitLogManifest.createKey(bucketKey, persistenceTime);
CommitLogMutation mutation =
tm().transact(() -> CommitLogMutation.create(manifestKey, contactResource));
jpaTm().transact(() -> SqlReplayCheckpoint.set(persistenceTime.minusMinutes(1).minusMillis(1)));
// Replay the contact-save an hour later; the updateTimestamp should be unchanged
fakeClock.advanceBy(Duration.standardHours(1));
saveDiffFile(
gcsUtils,
createCheckpoint(persistenceTime.minusMinutes(1)),
CommitLogManifest.create(
getBucketKey(1), persistenceTime.minusMinutes(1), ImmutableSet.of()),
mutation);
runAndAssertSuccess(persistenceTime.minusMinutes(1), 1, 1);
assertAboutImmutableObjects()
.that(jpaTm().transact((() -> jpaTm().loadByEntity(contactResource))))
.isEqualExceptFields(contactResource, "revisions");
}
@Test @Test
@SuppressWarnings({"unchecked", "rawtypes"}) @SuppressWarnings({"unchecked", "rawtypes"})
void testReplay_properlyWeighted() throws Exception { void testReplay_properlyWeighted() throws Exception {