Decrease size of serialized ParsingQueueTask
The RevisionCreatedListener.Event contained a whole lot of data that
we don't need. The footprint of one ParsingQueueTask with the Event
was ~22k which is unnecessarily large.
Storing the vital information in the dto PatchsetCreationData instead
significantly decreases the storage footprint of a ParsingQueueTask.
Solves: Jira GER-1715
Change-Id: Ia463c34d9235f8208d376d78f0c68d1dba595bd8
diff --git a/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/mapping/EiffelEventMapper.java b/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/mapping/EiffelEventMapper.java
index e1cd13c..09af40f 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/mapping/EiffelEventMapper.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/mapping/EiffelEventMapper.java
@@ -20,7 +20,6 @@
import com.google.gerrit.entities.RefNames;
import com.google.gerrit.extensions.common.AccountInfo;
import com.google.gerrit.extensions.common.GitPerson;
-import com.google.gerrit.extensions.events.RevisionCreatedListener;
import com.google.gerrit.server.IdentifiedUser;
import com.google.gerrit.server.account.AccountResolver;
import com.google.gerrit.server.account.AccountResolver.UnresolvableAccountException;
@@ -34,6 +33,7 @@
import com.googlesource.gerrit.plugins.eventseiffel.eiffel.dto.EiffelCompositionDefinedEventInfo;
import com.googlesource.gerrit.plugins.eventseiffel.eiffel.dto.EiffelSourceChangeCreatedEventInfo;
import com.googlesource.gerrit.plugins.eventseiffel.eiffel.dto.EiffelSourceChangeSubmittedEventInfo;
+import com.googlesource.gerrit.plugins.eventseiffel.parsing.PatchsetCreationData;
import java.io.IOException;
import java.util.List;
import java.util.Optional;
@@ -68,20 +68,20 @@
}
public EiffelSourceChangeCreatedEventInfo toScc(
- RevisionCreatedListener.Event event, List<UUID> parentEventIds)
+ PatchsetCreationData data, List<UUID> parentEventIds)
throws ConfigInvalidException, IOException {
- PersonInfo author = toPersonInfo(event.getRevision().commit.author);
+ PersonInfo author = toPersonInfo(data.author);
return eventFactoryProvider
.get()
.createScc(
author.name,
author.email,
author.username,
- event.getChange().project,
- event.getChange().branch,
- event.getRevision().commit.commit,
- event.getChange()._number,
- event.getWhen().getTime(),
+ data.project,
+ data.branch,
+ data.commitId,
+ data.changeNumber,
+ data.createdAt,
parentEventIds);
}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/EiffelEventParser.java b/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/EiffelEventParser.java
index faa1fed..3285993 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/EiffelEventParser.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/EiffelEventParser.java
@@ -14,19 +14,19 @@
package com.googlesource.gerrit.plugins.eventseiffel.parsing;
import com.google.gerrit.extensions.common.AccountInfo;
-import com.google.gerrit.extensions.events.RevisionCreatedListener.Event;
import com.googlesource.gerrit.plugins.eventseiffel.eiffel.SourceChangeEventKey;
public interface EiffelEventParser {
/**
- * Creates SCC events for all commits reachable from the commit that triggered the {@link Event}
- * event.
+ * Creates SCC events for all commits reachable from the commit that triggered the patchset
+ * creation described by the {@link PatchsetCreationData} data.
*
- * @param event - Describes a revision from which to create SCC events.
+ * @param data - Describes a patchset creation from which to create SCC events.
* @throws EventParsingException- When event-creation fails.
*/
- void createAndScheduleSccFromEvent(Event event) throws EventParsingException;
+ void createAndScheduleSccFromPatchsetCreation(PatchsetCreationData data)
+ throws EventParsingException;
/**
* Creates SCC events for all commits reachable from branchRef. I.e. create SCCs for already
diff --git a/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/EiffelEventParserImpl.java b/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/EiffelEventParserImpl.java
index 9a089d4..5489a74 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/EiffelEventParserImpl.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/EiffelEventParserImpl.java
@@ -28,8 +28,6 @@
import com.google.gerrit.entities.RefNames;
import com.google.gerrit.exceptions.NoSuchEntityException;
import com.google.gerrit.extensions.common.AccountInfo;
-import com.google.gerrit.extensions.common.CommitInfo;
-import com.google.gerrit.extensions.events.RevisionCreatedListener.Event;
import com.google.gerrit.server.git.GitRepositoryManager;
import com.google.inject.Inject;
import com.googlesource.gerrit.plugins.eventseiffel.EiffelEventHub;
@@ -85,29 +83,27 @@
* @see com.googlesource.gerrit.plugins.eventseiffel.parsing.EiffelEventParser#createAndScheduleSccFromEvent(com.google.gerrit.extensions.events.RevisionCreatedListener.Event)
*/
@Override
- public void createAndScheduleSccFromEvent(Event event) throws EventParsingException {
- CommitInfo commit = event.getRevision().commit;
+ public void createAndScheduleSccFromPatchsetCreation(PatchsetCreationData data)
+ throws EventParsingException {
SourceChangeEventKey scc =
- SourceChangeEventKey.sccKey(
- event.getChange().project, event.getChange().branch, commit.commit);
+ SourceChangeEventKey.sccKey(data.project, data.branch, data.commitId);
try {
if (eventHub.getExistingId(scc).isPresent()) {
logger.atWarning().log(
- "Event %s already pushed for %d/%d",
- scc, event.getChange()._number, event.getRevision()._number);
+ "Event %s already pushed for %d/%d", scc, data.changeNumber, data.patchsetNumber);
return;
}
List<UUID> parentUuids = Lists.newArrayList();
- for (CommitInfo parent : commit.parents) {
- Optional<UUID> parentUuid = eventHub.getExistingId(scc.copy(parent.commit));
+ for (String parentId : data.parentCommitIds) {
+ Optional<UUID> parentUuid = eventHub.getExistingId(scc.copy(parentId));
if (parentUuid.isPresent()) {
parentUuids.add(parentUuid.get());
}
}
/* Eiffel events have been scheduled or published for all parents. */
- if (parentUuids.size() == commit.parents.size()) {
- pushToHub(mapper.toScc(event, parentUuids));
+ if (parentUuids.size() == data.parentCommitIds.size()) {
+ pushToHub(mapper.toScc(data, parentUuids));
} else {
createAndScheduleMissingSccs(scc);
}
@@ -119,9 +115,9 @@
throw new EventParsingException(
e,
"Event creation failed for: %s, %s, %s to SCC.",
- event.getChange().project,
- event.getChange().branch,
- event.getRevision().commit.commit);
+ data.project,
+ data.branch,
+ data.commitId);
}
}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/EiffelEventParsingQueue.java b/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/EiffelEventParsingQueue.java
index 01d5233..7fd9f25 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/EiffelEventParsingQueue.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/EiffelEventParsingQueue.java
@@ -182,9 +182,9 @@
try {
switch (task.type) {
case SCC:
- if (task.patchsetCreatedEvent != null) {
+ if (task.patchsetCreationData != null) {
append = ", from event, ";
- eventParser.createAndScheduleSccFromEvent(task.patchsetCreatedEvent);
+ eventParser.createAndScheduleSccFromPatchsetCreation(task.patchsetCreationData);
} else if (task.commitId != null) {
eventParser.createAndScheduleSccFromCommit(
task.repoName, task.branchRefOrTag, task.commitId);
diff --git a/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/ParsingQueueTask.java b/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/ParsingQueueTask.java
index 245c4b3..b35ff1b 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/ParsingQueueTask.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/ParsingQueueTask.java
@@ -46,7 +46,7 @@
private Long _updateTime = null;
private Boolean _force = null;
private String _previousTip = null;
- private RevisionCreatedListener.Event _patchsetCreatedEvent;
+ private PatchsetCreationData _patchsetCreationData;
private Builder(EiffelEventType type, String repoName, String branchRefOrTag) {
this._type = type;
@@ -55,7 +55,7 @@
}
private Builder(RevisionCreatedListener.Event event) {
- this._patchsetCreatedEvent = event;
+ this._patchsetCreationData = new PatchsetCreationData(event);
}
public Builder commit(String commitId) {
@@ -84,8 +84,8 @@
}
public ParsingQueueTask build() {
- if (this._patchsetCreatedEvent != null) {
- return new ParsingQueueTask(_patchsetCreatedEvent);
+ if (this._patchsetCreationData != null) {
+ return new ParsingQueueTask(_patchsetCreationData);
}
return new ParsingQueueTask(
this._type,
@@ -107,7 +107,7 @@
final Long updateTime;
final Boolean force;
final String previousTip;
- final RevisionCreatedListener.Event patchsetCreatedEvent;
+ final PatchsetCreationData patchsetCreationData;
private ParsingQueueTask(
EiffelEventType type,
@@ -129,19 +129,19 @@
this.updateTime = updateTime;
this.previousTip = previousTip;
this.force = force;
- this.patchsetCreatedEvent = null;
+ this.patchsetCreationData = null;
}
- private ParsingQueueTask(RevisionCreatedListener.Event patchsetCreatedEvent) {
+ private ParsingQueueTask(PatchsetCreationData data) {
this.type = EiffelEventType.SCC;
- this.repoName = patchsetCreatedEvent.getChange().project;
- this.branchRefOrTag = patchsetCreatedEvent.getChange().branch;
- this.commitId = patchsetCreatedEvent.getRevision().commit.commit;
+ this.repoName = data.project;
+ this.branchRefOrTag = data.branch;
+ this.commitId = data.commitId;
this.updater = null;
this.updateTime = null;
this.previousTip = null;
this.force = null;
- this.patchsetCreatedEvent = patchsetCreatedEvent;
+ this.patchsetCreationData = data;
}
@Override
diff --git a/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/PatchsetCreationData.java b/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/PatchsetCreationData.java
new file mode 100644
index 0000000..c0ebb7e
--- /dev/null
+++ b/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/PatchsetCreationData.java
@@ -0,0 +1,44 @@
+// Copyright (C) 2022 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+package com.googlesource.gerrit.plugins.eventseiffel.parsing;
+
+import com.google.gerrit.extensions.common.GitPerson;
+import com.google.gerrit.extensions.events.RevisionCreatedListener;
+import java.util.List;
+import java.util.stream.Collectors;
+
+public class PatchsetCreationData {
+ public final GitPerson author;
+ public final String project;
+ public final String branch;
+ public final String commitId;
+ public final List<String> parentCommitIds;
+ public final int changeNumber;
+ public final int patchsetNumber;
+ public final long createdAt;
+
+ public PatchsetCreationData(RevisionCreatedListener.Event event) {
+ this.author = event.getRevision().commit.author;
+ this.project = event.getChange().project;
+ this.branch = event.getChange().branch;
+ this.commitId = event.getRevision().commit.commit;
+ this.parentCommitIds =
+ event.getRevision().commit.parents.stream()
+ .map(ci -> ci.commit)
+ .collect(Collectors.toList());
+ this.changeNumber = event.getChange()._number;
+ this.patchsetNumber = event.getRevision()._number;
+ this.createdAt = event.getWhen().getTime();
+ }
+}
diff --git a/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/mapping/EventMappingIT.java b/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/mapping/EventMappingIT.java
index ee2b553..94301f7 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/mapping/EventMappingIT.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/mapping/EventMappingIT.java
@@ -48,6 +48,7 @@
import com.googlesource.gerrit.plugins.eventseiffel.eiffel.dto.EiffelPersonInfo;
import com.googlesource.gerrit.plugins.eventseiffel.eiffel.dto.EiffelSourceChangeCreatedEventInfo;
import com.googlesource.gerrit.plugins.eventseiffel.eiffel.dto.EiffelSourceChangeSubmittedEventInfo;
+import com.googlesource.gerrit.plugins.eventseiffel.parsing.PatchsetCreationData;
import java.net.URLEncoder;
import java.sql.Timestamp;
import java.time.Instant;
@@ -82,8 +83,9 @@
}
@Test
- public void sccFromRevisionCreatedEvent() throws Exception {
- EiffelSourceChangeCreatedEventInfo event = mapper.toScc(new TestEvent(), PARENT_UUIDS);
+ public void sccFromPatchsetCreationData() throws Exception {
+ EiffelSourceChangeCreatedEventInfo event =
+ mapper.toScc(new PatchsetCreationData(new TestEvent()), PARENT_UUIDS);
assertPersonInfo(event.data.author, AUTHOR_NAME, AUTHOR_EMAIL, null);
assertGitIdentifier(event.data.gitIdentifier, REPO_NAME, BRANCH, COMMIT_SHA1);
assertChangeInfo(event.data.change, String.valueOf(CHANGE_NUMBER), REPO_NAME, COMMIT_SHA1);
@@ -342,6 +344,7 @@
author.email = AUTHOR_EMAIL;
author.name = AUTHOR_NAME;
cInfo.author = author;
+ cInfo.parents = List.of();
RevisionInfo rInfo = new RevisionInfo();
rInfo.commit = cInfo;
return rInfo;
diff --git a/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/ParsingQueuePersistenceIT.java b/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/ParsingQueuePersistenceIT.java
index 0923634..8c9ed72 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/ParsingQueuePersistenceIT.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/ParsingQueuePersistenceIT.java
@@ -21,7 +21,6 @@
import com.google.gerrit.acceptance.UseLocalDisk;
import com.google.gerrit.entities.Project;
import com.google.gerrit.extensions.common.AccountInfo;
-import com.google.gerrit.extensions.events.RevisionCreatedListener.Event;
import com.google.gerrit.server.git.ProjectRunnable;
import com.google.inject.AbstractModule;
import com.google.inject.Provider;
@@ -190,7 +189,7 @@
public NoOpEventParser() {}
@Override
- public void createAndScheduleSccFromEvent(Event event) {}
+ public void createAndScheduleSccFromPatchsetCreation(PatchsetCreationData data) {}
@Override
public void createAndScheduleSccFromBranch(String repoName, String branchRef) {}