Merge branch 'stable-3.8' into stable-3.9 * stable-3.8: Add sentinel to prevent out of sync with global-refdb Verify global-refdb formatting using GJF 1.7 Change-Id: I4765b5c4acf6977a9e7748b4e624624cf667c055
diff --git a/src/main/java/com/gerritforge/gerrit/globalrefdb/DraftCommentEventsEnabledProvider.java b/src/main/java/com/gerritforge/gerrit/globalrefdb/DraftCommentEventsEnabledProvider.java new file mode 100644 index 0000000..527d105 --- /dev/null +++ b/src/main/java/com/gerritforge/gerrit/globalrefdb/DraftCommentEventsEnabledProvider.java
@@ -0,0 +1,35 @@ +// Copyright (C) 2024 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.gerritforge.gerrit.globalrefdb; + +import com.google.gerrit.server.config.GerritServerConfig; +import com.google.inject.Inject; +import com.google.inject.Singleton; +import org.eclipse.jgit.lib.Config; + +/** Provides {@link Boolean} indicating whether the streaming of draft comment events is enabled. */ +@Singleton +public class DraftCommentEventsEnabledProvider { + private final Config config; + + @Inject + public DraftCommentEventsEnabledProvider(@GerritServerConfig Config config) { + this.config = config; + } + + public Boolean get() { + return config.getBoolean("event", "stream-events", "enableDraftCommentEvents", false); + } +}
diff --git a/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/dfsrefdb/CustomSharedRefEnforcementByProject.java b/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/dfsrefdb/CustomSharedRefEnforcementByProject.java index 84f6a64..394aa58 100644 --- a/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/dfsrefdb/CustomSharedRefEnforcementByProject.java +++ b/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/dfsrefdb/CustomSharedRefEnforcementByProject.java
@@ -16,6 +16,7 @@ import static com.google.common.base.Suppliers.memoize; +import com.gerritforge.gerrit.globalrefdb.DraftCommentEventsEnabledProvider; import com.gerritforge.gerrit.globalrefdb.validation.SharedRefDbConfiguration; import com.google.common.base.MoreObjects; import com.google.common.base.Splitter; @@ -34,6 +35,7 @@ private static final String ALL = ".*"; private final Supplier<Map<String, Map<String, EnforcePolicy>>> predefEnforcements; + private final Boolean draftCommentEventsEnabled; /** * Constructs a {@code CustomSharedRefEnforcementByProject} with the values specified in the @@ -42,8 +44,11 @@ * @param config the libModule configuration */ @Inject - public CustomSharedRefEnforcementByProject(SharedRefDbConfiguration config) { + public CustomSharedRefEnforcementByProject( + SharedRefDbConfiguration config, + DraftCommentEventsEnabledProvider draftCommentEventsEnabledProvider) { this.predefEnforcements = memoize(() -> parseDryRunEnforcementsToMap(config)); + this.draftCommentEventsEnabled = draftCommentEventsEnabledProvider.get(); } private static Map<String, Map<String, EnforcePolicy>> parseDryRunEnforcementsToMap( @@ -128,4 +133,9 @@ projectName, predefEnforcements.get().getOrDefault(ALL, ImmutableMap.of())); return policiesForProject.getOrDefault(ALL, EnforcePolicy.REQUIRED); } + + @Override + public Boolean isDraftCommentEventsEnabled() { + return draftCommentEventsEnabled; + } }
diff --git a/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/dfsrefdb/DefaultSharedRefEnforcement.java b/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/dfsrefdb/DefaultSharedRefEnforcement.java index ecff62f..eabd83b 100644 --- a/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/dfsrefdb/DefaultSharedRefEnforcement.java +++ b/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/dfsrefdb/DefaultSharedRefEnforcement.java
@@ -14,6 +14,10 @@ package com.gerritforge.gerrit.globalrefdb.validation.dfsrefdb; +import com.gerritforge.gerrit.globalrefdb.DraftCommentEventsEnabledProvider; +import com.google.common.annotations.VisibleForTesting; +import com.google.inject.Inject; + /** * Default implementation of {@link SharedRefEnforcement}. This class provides the default * project/ref enforcement rules when no more specific rules have been configured for the libModule @@ -21,6 +25,24 @@ */ public class DefaultSharedRefEnforcement implements SharedRefEnforcement { + private final Boolean enableDraftCommentEvents; + + @Inject + public DefaultSharedRefEnforcement( + DraftCommentEventsEnabledProvider draftCommentEventsEnabledProvider) { + this.enableDraftCommentEvents = draftCommentEventsEnabledProvider.get(); + } + + @VisibleForTesting + public DefaultSharedRefEnforcement(boolean enableDraftCommentEvents) { + this.enableDraftCommentEvents = enableDraftCommentEvents; + } + + @VisibleForTesting + public DefaultSharedRefEnforcement() { + this.enableDraftCommentEvents = false; + } + /** * Returns {@link EnforcePolicy#IGNORED} for refs to be ignored {@link * SharedRefEnforcement#isRefToBeIgnoredBySharedRefDb(String)}, {@link EnforcePolicy#REQUIRED} @@ -45,4 +67,9 @@ public EnforcePolicy getPolicy(String projectName) { return EnforcePolicy.REQUIRED; } + + @Override + public Boolean isDraftCommentEventsEnabled() { + return enableDraftCommentEvents; + } }
diff --git a/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/dfsrefdb/SharedRefEnforcement.java b/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/dfsrefdb/SharedRefEnforcement.java index 4e8b2f7..405d33a 100644 --- a/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/dfsrefdb/SharedRefEnforcement.java +++ b/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/dfsrefdb/SharedRefEnforcement.java
@@ -41,11 +41,19 @@ public EnforcePolicy getPolicy(String projectName); /** + * Get whether the streaming of draft comments events is enabled. + * + * @return true when enabled, false otherwise + */ + public Boolean isDraftCommentEventsEnabled(); + + /** * Check if a refName should be ignored by global refdb. The Default behaviour is to ignore: * * <ul> - * <li>refs/draft-comments :user-specific temporary storage that does not need to be seen by - * other users/sites + * <li>refs/draft-comments :user-specific temporary storage that does need to be seen by other + * users/sites only when their streaming is enabled via + * event.stream-events.enableDraftCommentEvents. * <li>refs/changes/<non-meta>: those refs are immutable * <li>refs/cache-automerge: these refs would be never replicated anyway * </ul> @@ -55,7 +63,7 @@ */ default boolean isRefToBeIgnoredBySharedRefDb(String refName) { return refName == null - || refName.startsWith("refs/draft-comments") + || (refName.startsWith("refs/draft-comments") && !isDraftCommentEventsEnabled()) || (refName.startsWith("refs/changes") && !refName.endsWith("/meta") && !refName.endsWith(RefNames.ROBOT_COMMENTS_SUFFIX))
diff --git a/src/test/java/com/gerritforge/gerrit/globalrefdb/validation/Log4jSharedRefLoggerTest.java b/src/test/java/com/gerritforge/gerrit/globalrefdb/validation/Log4jSharedRefLoggerTest.java index 346edd7..47964cf 100644 --- a/src/test/java/com/gerritforge/gerrit/globalrefdb/validation/Log4jSharedRefLoggerTest.java +++ b/src/test/java/com/gerritforge/gerrit/globalrefdb/validation/Log4jSharedRefLoggerTest.java
@@ -20,8 +20,8 @@ import com.google.gerrit.acceptance.PushOneCommit; import com.google.gerrit.entities.RefNames; import com.google.gerrit.json.OutputFormat; +import com.google.gerrit.server.Sequence; import com.google.gerrit.server.config.SitePaths; -import com.google.gerrit.server.notedb.Sequences; import com.google.gerrit.server.util.SystemLog; import com.google.gson.Gson; import java.io.IOException; @@ -101,7 +101,7 @@ @Test public void shouldLogBlobRefs() throws Exception { Repository allUsersRepo = repoManager.openRepository(allUsers); - String blobRefName = RefNames.REFS_SEQUENCES + Sequences.NAME_ACCOUNTS; + String blobRefName = RefNames.REFS_SEQUENCES + Sequence.NAME_ACCOUNTS; Ref currRef = allUsersRepo.exactRef(blobRefName); log4jSharedRefLogger.logRefUpdate(allUsers.get(), currRef, currRef.getObjectId());
diff --git a/src/test/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefDbBatchRefUpdateTest.java b/src/test/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefDbBatchRefUpdateTest.java index cfa1be5..6596e8d 100644 --- a/src/test/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefDbBatchRefUpdateTest.java +++ b/src/test/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefDbBatchRefUpdateTest.java
@@ -23,7 +23,7 @@ import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyZeroInteractions; +import static org.mockito.Mockito.verifyNoInteractions; import static org.mockito.Mockito.when; import com.gerritforge.gerrit.globalrefdb.validation.dfsrefdb.DefaultSharedRefEnforcement; @@ -49,7 +49,7 @@ import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; -@RunWith(MockitoJUnitRunner.class) +@RunWith(MockitoJUnitRunner.Silent.class) public class SharedRefDbBatchRefUpdateTest implements RefFixture { @Mock SharedRefDatabaseWrapper sharedRefDb; @@ -114,7 +114,7 @@ sharedRefDbRefUpdate = getSharedRefDbBatchRefUpdateWithDefaultPolicyEnforcement(); - verifyZeroInteractions(validationMetrics); + verifyNoInteractions(validationMetrics); } @Ignore("This test will be enabled in stable-3.10")
diff --git a/src/test/java/com/gerritforge/gerrit/globalrefdb/validation/dfsrefdb/CustomSharedRefEnforcementByProjectTest.java b/src/test/java/com/gerritforge/gerrit/globalrefdb/validation/dfsrefdb/CustomSharedRefEnforcementByProjectTest.java index 118d8e8..a21ff3e 100644 --- a/src/test/java/com/gerritforge/gerrit/globalrefdb/validation/dfsrefdb/CustomSharedRefEnforcementByProjectTest.java +++ b/src/test/java/com/gerritforge/gerrit/globalrefdb/validation/dfsrefdb/CustomSharedRefEnforcementByProjectTest.java
@@ -16,6 +16,7 @@ import static com.google.common.truth.Truth.assertThat; +import com.gerritforge.gerrit.globalrefdb.DraftCommentEventsEnabledProvider; import com.gerritforge.gerrit.globalrefdb.validation.SharedRefDbConfiguration; import com.gerritforge.gerrit.globalrefdb.validation.SharedRefDbConfiguration.SharedRefDatabase; import com.gerritforge.gerrit.globalrefdb.validation.dfsrefdb.SharedRefEnforcement.EnforcePolicy; @@ -141,7 +142,8 @@ private SharedRefEnforcement newCustomRefEnforcement(Config sharedRefDbConfig) { return new CustomSharedRefEnforcementByProject( - new SharedRefDbConfiguration(sharedRefDbConfig, "testplugin")); + new SharedRefDbConfiguration(sharedRefDbConfig, "testplugin"), + new DraftCommentEventsEnabledProvider(new Config())); } @Override
diff --git a/src/test/java/com/gerritforge/gerrit/globalrefdb/validation/dfsrefdb/DefaultSharedRefEnforcementTest.java b/src/test/java/com/gerritforge/gerrit/globalrefdb/validation/dfsrefdb/DefaultSharedRefEnforcementTest.java index d8f5ff7..f26846c 100644 --- a/src/test/java/com/gerritforge/gerrit/globalrefdb/validation/dfsrefdb/DefaultSharedRefEnforcementTest.java +++ b/src/test/java/com/gerritforge/gerrit/globalrefdb/validation/dfsrefdb/DefaultSharedRefEnforcementTest.java
@@ -82,6 +82,15 @@ .isEqualTo(EnforcePolicy.REQUIRED); } + @Test + public void draftCommentsShouldBeRequiredWhenDraftCommentEventsEnabled() { + SharedRefEnforcement refEnforcement = new DefaultSharedRefEnforcement(true); + + Ref draftCommentRef = newRef("refs/draft-comments/01/1/1000000", AN_OBJECT_ID_1); + assertThat(refEnforcement.getPolicy(A_TEST_PROJECT_NAME, draftCommentRef.getName())) + .isEqualTo(EnforcePolicy.REQUIRED); + } + @Override public String testBranch() { return "fooBranch";