From ebd3a1e78dc372e5fa067a3e398185a05cfae3c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hugo=20Ar=C3=A8s?= Date: Mon, 5 Mar 2018 10:42:26 -0500 Subject: [PATCH 1/4] Fix ConcurrentModificationException when posting reviews This problem is caused by PostReview (singleton) keeping a reference to a non-singleton class: PostReview (singleton) -> CommentAdded (non-singleton) -> EventUtil (non-singleton) -> ChangeJson (non-singleton) -> AccountLoader (non-singleton) This means concurrent PostReview requests use the same account loader instance. Hence it can happen that after creating the Iterable in AccountLoader.fill() another thread invokes AccountLoader.put(AccountInfo) and thus modifies the list which was used to create the Iterable. Change EventUtil to keep a reference on ChangeJson.Factory and create an instance of ChangeJson every time it needs one. Make EventUtil and CommentAdded singletons since they no longer have non-singleton object references. Bug: Issue 8478 Change-Id: Ie05858956b209148c017a6af06a7605a163a897e --- .../com/google/gerrit/pgm/util/BatchProgramModule.java | 2 ++ .../gerrit/server/extensions/events/CommentAdded.java | 2 ++ .../gerrit/server/extensions/events/EventUtil.java | 10 ++++++---- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/BatchProgramModule.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/BatchProgramModule.java index 5317edffd9..ba8a8507fa 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/BatchProgramModule.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/BatchProgramModule.java @@ -52,6 +52,7 @@ import com.google.gerrit.server.config.DisableReverseDnsLookupProvider; import com.google.gerrit.server.config.GerritServerConfig; import com.google.gerrit.server.config.GitReceivePackGroups; import com.google.gerrit.server.config.GitUploadPackGroups; +import com.google.gerrit.server.extensions.events.EventUtil; import com.google.gerrit.server.git.MergeUtil; import com.google.gerrit.server.git.ReceiveCommitsExecutorModule; import com.google.gerrit.server.git.SearchingChangeCacheImpl; @@ -164,6 +165,7 @@ public class BatchProgramModule extends FactoryModule { factory(ProjectState.Factory.class); bind(ChangeJson.Factory.class).toProvider(Providers.of(null)); + bind(EventUtil.class).toProvider(Providers.of(null)); bind(AccountVisibility.class).toProvider(AccountVisibilityProvider.class).in(SINGLETON); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/CommentAdded.java b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/CommentAdded.java index e76a032a74..bfbdc7f789 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/CommentAdded.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/CommentAdded.java @@ -28,12 +28,14 @@ import com.google.gerrit.server.GpgException; import com.google.gerrit.server.patch.PatchListNotAvailableException; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; +import com.google.inject.Singleton; import java.io.IOException; import java.sql.Timestamp; import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +@Singleton public class CommentAdded { private static final Logger log = LoggerFactory.getLogger(CommentAdded.class); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/EventUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/EventUtil.java index f367e23219..163bf326e8 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/EventUtil.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/EventUtil.java @@ -34,6 +34,7 @@ import com.google.gerrit.server.query.change.ChangeData; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; +import com.google.inject.Singleton; import java.io.IOException; import java.sql.Timestamp; import java.util.EnumSet; @@ -42,6 +43,7 @@ import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +@Singleton public class EventUtil { private static final Logger log = LoggerFactory.getLogger(EventUtil.class); @@ -64,7 +66,7 @@ public class EventUtil { private final ChangeData.Factory changeDataFactory; private final Provider db; - private final ChangeJson changeJson; + private final ChangeJson.Factory changeJsonFactory; @Inject EventUtil( @@ -73,11 +75,11 @@ public class EventUtil { Provider db) { this.changeDataFactory = changeDataFactory; this.db = db; - this.changeJson = changeJsonFactory.create(CHANGE_OPTIONS); + this.changeJsonFactory = changeJsonFactory; } public ChangeInfo changeInfo(Change change) throws OrmException { - return changeJson.format(change); + return changeJsonFactory.create(CHANGE_OPTIONS).format(change); } public RevisionInfo revisionInfo(Project project, PatchSet ps) @@ -89,7 +91,7 @@ public class EventUtil { throws OrmException, PatchListNotAvailableException, GpgException, IOException { ChangeData cd = changeDataFactory.create(db.get(), project, ps.getId().getParentKey()); ChangeControl ctl = cd.changeControl(); - return changeJson.getRevisionInfo(ctl, ps); + return changeJsonFactory.create(CHANGE_OPTIONS).getRevisionInfo(ctl, ps); } public AccountInfo accountInfo(Account a) { From 2fbc573a46d73ee02137d17abcdd9159f5397a83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hugo=20Ar=C3=A8s?= Date: Mon, 5 Mar 2018 20:41:40 -0500 Subject: [PATCH 2/4] Make event firing classes singleton Since Ie05858956, EventUtil class is a singleton so all the event firing classes can be singleton. Change-Id: Iab72656566b45e63e56809a0b26c61fe42fc9865 --- .../java/com/google/gerrit/pgm/util/BatchProgramModule.java | 4 ++++ .../gerrit/server/extensions/events/AgreementSignup.java | 2 ++ .../gerrit/server/extensions/events/AssigneeChanged.java | 2 ++ .../gerrit/server/extensions/events/ChangeAbandoned.java | 2 ++ .../google/gerrit/server/extensions/events/ChangeMerged.java | 2 ++ .../gerrit/server/extensions/events/ChangeRestored.java | 2 ++ .../gerrit/server/extensions/events/ChangeReverted.java | 2 ++ .../gerrit/server/extensions/events/DraftPublished.java | 2 ++ .../gerrit/server/extensions/events/GitReferenceUpdated.java | 2 ++ .../gerrit/server/extensions/events/HashtagsEdited.java | 2 ++ .../google/gerrit/server/extensions/events/PluginEvent.java | 2 ++ .../google/gerrit/server/extensions/events/ReviewerAdded.java | 2 ++ .../gerrit/server/extensions/events/ReviewerDeleted.java | 2 ++ .../gerrit/server/extensions/events/RevisionCreated.java | 2 ++ .../google/gerrit/server/extensions/events/TopicEdited.java | 2 ++ .../google/gerrit/server/extensions/events/VoteDeleted.java | 2 ++ 16 files changed, 34 insertions(+) diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/BatchProgramModule.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/BatchProgramModule.java index ba8a8507fa..05adf484bf 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/BatchProgramModule.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/BatchProgramModule.java @@ -53,6 +53,8 @@ import com.google.gerrit.server.config.GerritServerConfig; import com.google.gerrit.server.config.GitReceivePackGroups; import com.google.gerrit.server.config.GitUploadPackGroups; import com.google.gerrit.server.extensions.events.EventUtil; +import com.google.gerrit.server.extensions.events.GitReferenceUpdated; +import com.google.gerrit.server.extensions.events.RevisionCreated; import com.google.gerrit.server.git.MergeUtil; import com.google.gerrit.server.git.ReceiveCommitsExecutorModule; import com.google.gerrit.server.git.SearchingChangeCacheImpl; @@ -166,6 +168,8 @@ public class BatchProgramModule extends FactoryModule { bind(ChangeJson.Factory.class).toProvider(Providers.of(null)); bind(EventUtil.class).toProvider(Providers.of(null)); + bind(GitReferenceUpdated.class).toProvider(Providers.of(null)); + bind(RevisionCreated.class).toProvider(Providers.of(null)); bind(AccountVisibility.class).toProvider(AccountVisibilityProvider.class).in(SINGLETON); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/AgreementSignup.java b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/AgreementSignup.java index 669690af28..45f1159eca 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/AgreementSignup.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/AgreementSignup.java @@ -19,7 +19,9 @@ import com.google.gerrit.extensions.events.AgreementSignupListener; import com.google.gerrit.extensions.registration.DynamicSet; import com.google.gerrit.reviewdb.client.Account; import com.google.inject.Inject; +import com.google.inject.Singleton; +@Singleton public class AgreementSignup { private final DynamicSet listeners; private final EventUtil util; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/AssigneeChanged.java b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/AssigneeChanged.java index 2583744a30..8f8f13ed22 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/AssigneeChanged.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/AssigneeChanged.java @@ -23,10 +23,12 @@ import com.google.gerrit.reviewdb.client.Account; import com.google.gerrit.reviewdb.client.Change; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; +import com.google.inject.Singleton; import java.sql.Timestamp; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +@Singleton public class AssigneeChanged { private static final Logger log = LoggerFactory.getLogger(AssigneeChanged.class); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/ChangeAbandoned.java b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/ChangeAbandoned.java index f9fc60a1da..36574f9ec3 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/ChangeAbandoned.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/ChangeAbandoned.java @@ -27,11 +27,13 @@ import com.google.gerrit.server.GpgException; import com.google.gerrit.server.patch.PatchListNotAvailableException; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; +import com.google.inject.Singleton; import java.io.IOException; import java.sql.Timestamp; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +@Singleton public class ChangeAbandoned { private static final Logger log = LoggerFactory.getLogger(ChangeAbandoned.class); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/ChangeMerged.java b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/ChangeMerged.java index feaa54a12c..d9694069e3 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/ChangeMerged.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/ChangeMerged.java @@ -27,11 +27,13 @@ import com.google.gerrit.server.GpgException; import com.google.gerrit.server.patch.PatchListNotAvailableException; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; +import com.google.inject.Singleton; import java.io.IOException; import java.sql.Timestamp; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +@Singleton public class ChangeMerged { private static final Logger log = LoggerFactory.getLogger(ChangeMerged.class); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/ChangeRestored.java b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/ChangeRestored.java index 03a6f1f03b..323bd3417c 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/ChangeRestored.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/ChangeRestored.java @@ -27,11 +27,13 @@ import com.google.gerrit.server.GpgException; import com.google.gerrit.server.patch.PatchListNotAvailableException; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; +import com.google.inject.Singleton; import java.io.IOException; import java.sql.Timestamp; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +@Singleton public class ChangeRestored { private static final Logger log = LoggerFactory.getLogger(ChangeRestored.class); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/ChangeReverted.java b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/ChangeReverted.java index e57cbdd0cf..1e91ab3cc4 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/ChangeReverted.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/ChangeReverted.java @@ -21,10 +21,12 @@ import com.google.gerrit.extensions.registration.DynamicSet; import com.google.gerrit.reviewdb.client.Change; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; +import com.google.inject.Singleton; import java.sql.Timestamp; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +@Singleton public class ChangeReverted { private static final Logger log = LoggerFactory.getLogger(ChangeReverted.class); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/DraftPublished.java b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/DraftPublished.java index b5db0daf4e..32a15316d9 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/DraftPublished.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/DraftPublished.java @@ -27,11 +27,13 @@ import com.google.gerrit.server.GpgException; import com.google.gerrit.server.patch.PatchListNotAvailableException; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; +import com.google.inject.Singleton; import java.io.IOException; import java.sql.Timestamp; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +@Singleton public class DraftPublished { private static final Logger log = LoggerFactory.getLogger(DraftPublished.class); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/GitReferenceUpdated.java b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/GitReferenceUpdated.java index 2b65965c0b..be14827e4a 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/GitReferenceUpdated.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/GitReferenceUpdated.java @@ -21,11 +21,13 @@ import com.google.gerrit.extensions.registration.DynamicSet; import com.google.gerrit.reviewdb.client.Account; import com.google.gerrit.reviewdb.client.Project; import com.google.inject.Inject; +import com.google.inject.Singleton; import org.eclipse.jgit.lib.BatchRefUpdate; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.RefUpdate; import org.eclipse.jgit.transport.ReceiveCommand; +@Singleton public class GitReferenceUpdated { public static final GitReferenceUpdated DISABLED = new GitReferenceUpdated() { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/HashtagsEdited.java b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/HashtagsEdited.java index b086beba75..1c4b43cf91 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/HashtagsEdited.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/HashtagsEdited.java @@ -24,12 +24,14 @@ import com.google.gerrit.reviewdb.client.Account; import com.google.gerrit.reviewdb.client.Change; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; +import com.google.inject.Singleton; import java.sql.Timestamp; import java.util.Collection; import java.util.Set; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +@Singleton public class HashtagsEdited { private static final Logger log = LoggerFactory.getLogger(HashtagsEdited.class); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/PluginEvent.java b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/PluginEvent.java index bd643e2020..8680ab1528 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/PluginEvent.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/PluginEvent.java @@ -17,7 +17,9 @@ package com.google.gerrit.server.extensions.events; import com.google.gerrit.extensions.events.PluginEventListener; import com.google.gerrit.extensions.registration.DynamicSet; import com.google.inject.Inject; +import com.google.inject.Singleton; +@Singleton public class PluginEvent { private final DynamicSet listeners; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/ReviewerAdded.java b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/ReviewerAdded.java index e4f85720c8..b7297811fa 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/ReviewerAdded.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/ReviewerAdded.java @@ -28,12 +28,14 @@ import com.google.gerrit.server.GpgException; import com.google.gerrit.server.patch.PatchListNotAvailableException; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; +import com.google.inject.Singleton; import java.io.IOException; import java.sql.Timestamp; import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +@Singleton public class ReviewerAdded { private static final Logger log = LoggerFactory.getLogger(ReviewerAdded.class); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/ReviewerDeleted.java b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/ReviewerDeleted.java index 033efe29ea..8edfb1e300 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/ReviewerDeleted.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/ReviewerDeleted.java @@ -28,12 +28,14 @@ import com.google.gerrit.server.GpgException; import com.google.gerrit.server.patch.PatchListNotAvailableException; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; +import com.google.inject.Singleton; import java.io.IOException; import java.sql.Timestamp; import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +@Singleton public class ReviewerDeleted { private static final Logger log = LoggerFactory.getLogger(ReviewerDeleted.class); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/RevisionCreated.java b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/RevisionCreated.java index 8a781d0856..6f171e3988 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/RevisionCreated.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/RevisionCreated.java @@ -27,11 +27,13 @@ import com.google.gerrit.server.GpgException; import com.google.gerrit.server.patch.PatchListNotAvailableException; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; +import com.google.inject.Singleton; import java.io.IOException; import java.sql.Timestamp; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +@Singleton public class RevisionCreated { private static final Logger log = LoggerFactory.getLogger(RevisionCreated.class); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/TopicEdited.java b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/TopicEdited.java index d7e7245864..7275ced355 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/TopicEdited.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/TopicEdited.java @@ -23,10 +23,12 @@ import com.google.gerrit.reviewdb.client.Account; import com.google.gerrit.reviewdb.client.Change; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; +import com.google.inject.Singleton; import java.sql.Timestamp; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +@Singleton public class TopicEdited { private static final Logger log = LoggerFactory.getLogger(TopicEdited.class); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/VoteDeleted.java b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/VoteDeleted.java index 71a603c7a2..0f9c943c08 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/VoteDeleted.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/VoteDeleted.java @@ -28,12 +28,14 @@ import com.google.gerrit.server.GpgException; import com.google.gerrit.server.patch.PatchListNotAvailableException; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; +import com.google.inject.Singleton; import java.io.IOException; import java.sql.Timestamp; import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +@Singleton public class VoteDeleted { private static final Logger log = LoggerFactory.getLogger(VoteDeleted.class); From 231f3dcccbf73430b9d0a3efc04e9de8a52cc314 Mon Sep 17 00:00:00 2001 From: David Pursehouse Date: Tue, 6 Mar 2018 12:32:21 +0900 Subject: [PATCH 3/4] Document that Python 2 is required by the build Change-Id: Ic03c3377950a9582779d3f0991eb270c4b00876b --- Documentation/dev-bazel.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Documentation/dev-bazel.txt b/Documentation/dev-bazel.txt index 60a56dd346..a613103b2c 100644 --- a/Documentation/dev-bazel.txt +++ b/Documentation/dev-bazel.txt @@ -3,7 +3,7 @@ [[installation]] == Installation -You need to use Java 8 and Node.js for building gerrit. +You need to use Python 2, Java 8, and Node.js for building gerrit. You can install Bazel from the bazel.io: https://www.bazel.io/versions/master/docs/install.html From eb2f987ddbca9202111137d33c367b8622f66b23 Mon Sep 17 00:00:00 2001 From: David Pursehouse Date: Tue, 6 Mar 2018 15:54:13 +0900 Subject: [PATCH 4/4] BatchProgramModule: Don't bind event classes to null Instead, bind them to the DISABLED instance. Change-Id: I599caac02ae98800fba641c1e4f6088a9c894c48 --- .../gerrit/pgm/util/BatchProgramModule.java | 4 ++-- .../extensions/events/RevisionCreated.java | 16 ++++++++++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/BatchProgramModule.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/BatchProgramModule.java index 05adf484bf..f17b3ed226 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/BatchProgramModule.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/BatchProgramModule.java @@ -168,8 +168,8 @@ public class BatchProgramModule extends FactoryModule { bind(ChangeJson.Factory.class).toProvider(Providers.of(null)); bind(EventUtil.class).toProvider(Providers.of(null)); - bind(GitReferenceUpdated.class).toProvider(Providers.of(null)); - bind(RevisionCreated.class).toProvider(Providers.of(null)); + bind(GitReferenceUpdated.class).toInstance(GitReferenceUpdated.DISABLED); + bind(RevisionCreated.class).toInstance(RevisionCreated.DISABLED); bind(AccountVisibility.class).toProvider(AccountVisibilityProvider.class).in(SINGLETON); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/RevisionCreated.java b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/RevisionCreated.java index 6f171e3988..20d0bf4e27 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/RevisionCreated.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/RevisionCreated.java @@ -37,6 +37,17 @@ import org.slf4j.LoggerFactory; public class RevisionCreated { private static final Logger log = LoggerFactory.getLogger(RevisionCreated.class); + public static final RevisionCreated DISABLED = + new RevisionCreated() { + @Override + public void fire( + Change change, + PatchSet patchSet, + Account uploader, + Timestamp when, + NotifyHandling notify) {} + }; + private final DynamicSet listeners; private final EventUtil util; @@ -46,6 +57,11 @@ public class RevisionCreated { this.util = util; } + private RevisionCreated() { + this.listeners = null; + this.util = null; + } + public void fire( Change change, PatchSet patchSet, Account uploader, Timestamp when, NotifyHandling notify) { if (!listeners.iterator().hasNext()) {