Add StoreMutableRefs as label for default behavior This enables people to make exceptions if they want to store all refs for all projects except one, which they want to maintain default behavior in, such as: ``` [ref-database "storeAllRefs"] project = * [ref-database "storeMutableRefs"] project = X ``` Change-Id: I2f3504aca354341dc64866df51770fcc2988318d
diff --git a/config.md b/config.md index 0437acf..c60f7a9 100644 --- a/config.md +++ b/config.md
@@ -38,13 +38,17 @@ storeNoRefs described below. Existing configured enforcementRules will work, but not in tandem with the storeAllRefs/storeNoRefs paradigm. +```ref-database.storeMutableRefs``` +: Specifies which projects should have mutable refs stored. An asterisk can be + used to match all projects. Excludes draft comments, immutable refs, and + cache-automerge refs. An asterisk can be used to match all projects. + + Defaults: No rules = All projects store mutable refs. + ```ref-database.storeAllRefs``` : Specifies which projects should have all refs stored, including refs which - are excluded by default. An asterisk can be used to match all projects. - - The default behavior for non-specified projects is to exclude draft comments, - immutable non-meta refs, and cache-automerge refs. When listed under - `storeAllRefs` those refs will be included. + are excluded by default (draft comments, immutable refs, and cache-automerge + refs). See ```ref-database.storeMutableRefs``` for more details. ```ref-database.storeNoRefs``` : Specifies which projects should not be stored in the global-refdb. No refs
diff --git a/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefDbConfiguration.java b/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefDbConfiguration.java index b9c8900..2ae3184 100644 --- a/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefDbConfiguration.java +++ b/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefDbConfiguration.java
@@ -109,6 +109,7 @@ public static final String SECTION = "ref-database"; public static final String ENABLE_KEY = "enabled"; public static final String STORE_ALL_REFS_KEY = "storeAllRefs"; + public static final String STORE_MUTABLE_REFS_KEY = "storeMutableRefs"; public static final String STORE_NO_REFS_KEY = "storeNoRefs"; public static final String SUBSECTION_ENFORCEMENT_RULES = "enforcementRules"; public static final String IGNORED_REFS_PREFIXES = "ignoredRefsPrefixes"; @@ -118,6 +119,7 @@ private final Multimap<EnforcePolicy, String> enforcementRules; private final ImmutableSet<String> ignoredRefsPrefixes; private final ImmutableSet<String> storeAllRefs; + private final ImmutableSet<String> storeMutableRefs; private final ImmutableSet<String> storeNoRefs; private SharedRefDatabase(Supplier<Config> cfg) { @@ -129,6 +131,7 @@ } ignoredRefsPrefixes = ImmutableSet.copyOf(getList(cfg, SECTION, null, IGNORED_REFS_PREFIXES)); storeAllRefs = getSet(cfg, SECTION, STORE_ALL_REFS_KEY, PROJECT); + storeMutableRefs = getSet(cfg, SECTION, STORE_MUTABLE_REFS_KEY, PROJECT); storeNoRefs = getSet(cfg, SECTION, STORE_NO_REFS_KEY, PROJECT); } @@ -173,6 +176,15 @@ } /** + * Returns the set of projects to store mutable refs for in the global-refdb + * + * @return set of projects to store only mutable refs for + */ + public ImmutableSet<String> getStoreMutableRefs() { + return storeMutableRefs; + } + + /** * Returns the set of projects to not store in the global-refdb * * @return set of projects to not store refs for
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 9c1b1cf..3dcaeec 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
@@ -20,16 +20,17 @@ import com.google.common.collect.ImmutableSet; import com.google.gerrit.entities.RefNames; import com.google.inject.Inject; -import java.util.Optional; /** Type of enforcement to implement between the local and shared RefDb. */ public class SharedRefEnforcement { public enum Policy { EXCLUDE, + INCLUDE_MUTABLE, INCLUDE; } private final ImmutableSet<String> storeAllRefs; + private final ImmutableSet<String> storeMutableRefs; private final ImmutableSet<String> storeNoRefs; private final Boolean enableDraftCommentEvents; private final String ALL = "*"; @@ -39,6 +40,7 @@ SharedRefDbConfiguration config, DraftCommentEventsEnabledProvider draftCommentEventsEnabledProvider) { this.storeAllRefs = config.getSharedRefDb().getStoreAllRefs(); + this.storeMutableRefs = config.getSharedRefDb().getStoreMutableRefs(); this.storeNoRefs = config.getSharedRefDb().getStoreNoRefs(); this.enableDraftCommentEvents = draftCommentEventsEnabledProvider.get(); } @@ -46,9 +48,11 @@ @VisibleForTesting public SharedRefEnforcement( ImmutableSet<String> storeAllRefs, + ImmutableSet<String> storeMutableRefs, ImmutableSet<String> storeNoRefs, boolean enableDraftCommentEvents) { this.storeAllRefs = storeAllRefs; + this.storeMutableRefs = storeMutableRefs; this.storeNoRefs = storeNoRefs; this.enableDraftCommentEvents = enableDraftCommentEvents; } @@ -56,6 +60,7 @@ @VisibleForTesting public SharedRefEnforcement() { this.storeAllRefs = ImmutableSet.of(); + this.storeMutableRefs = ImmutableSet.of(); this.storeNoRefs = ImmutableSet.of(); this.enableDraftCommentEvents = false; } @@ -68,8 +73,11 @@ * @return the enforcement policy for this project/ref */ public Policy getPolicy(String projectName, String refName) { - return getConfiguredPolicy(projectName) - .orElse(isRefToBeIgnoredBySharedRefDb(refName) ? Policy.EXCLUDE : Policy.INCLUDE); + Policy configuredPolicy = getPolicy(projectName); + if (configuredPolicy == Policy.INCLUDE_MUTABLE) { + return isRefToBeIgnoredBySharedRefDb(refName) ? Policy.EXCLUDE : Policy.INCLUDE; + } + return configuredPolicy; } /** @@ -80,7 +88,16 @@ * @return the enforcement policy for the project */ public Policy getPolicy(String projectName) { - return getConfiguredPolicy(projectName).orElse(Policy.INCLUDE); + if (storeMutableRefs.contains(ALL) || storeMutableRefs.contains(projectName)) { + return Policy.INCLUDE_MUTABLE; + } + if (storeNoRefs.contains(ALL) || storeNoRefs.contains(projectName)) { + return Policy.EXCLUDE; + } + if (storeAllRefs.contains(ALL) || storeAllRefs.contains(projectName)) { + return Policy.INCLUDE; + } + return Policy.INCLUDE_MUTABLE; } /** @@ -92,16 +109,6 @@ return enableDraftCommentEvents; } - Optional<Policy> getConfiguredPolicy(String projectName) { - if (storeNoRefs.contains(ALL) || storeNoRefs.contains(projectName)) { - return Optional.of(Policy.EXCLUDE); - } - if (storeAllRefs.contains(ALL) || storeAllRefs.contains(projectName)) { - return Optional.of(Policy.INCLUDE); - } - return Optional.empty(); - } - /** * Check if a refName should be ignored by global refdb. These rules apply when not storing all * refs.
diff --git a/src/test/java/com/gerritforge/gerrit/globalrefdb/validation/dfsrefdb/SharedRefEnforcementTest.java b/src/test/java/com/gerritforge/gerrit/globalrefdb/validation/dfsrefdb/SharedRefEnforcementTest.java index 47658d6..4618425 100644 --- a/src/test/java/com/gerritforge/gerrit/globalrefdb/validation/dfsrefdb/SharedRefEnforcementTest.java +++ b/src/test/java/com/gerritforge/gerrit/globalrefdb/validation/dfsrefdb/SharedRefEnforcementTest.java
@@ -100,6 +100,27 @@ } @Test + public void shouldExcludePatchSetRefWhenStoringMutableRefs() { + Config sharedRefDbConfig = new Config(); + sharedRefDbConfig.setStringList( + SharedRefDatabase.SECTION, + SharedRefDatabase.STORE_MUTABLE_REFS_KEY, + SharedRefDatabase.PROJECT, + Arrays.asList(A_TEST_PROJECT_NAME)); + sharedRefDbConfig.setStringList( + SharedRefDatabase.SECTION, + SharedRefDatabase.STORE_ALL_REFS_KEY, + SharedRefDatabase.PROJECT, + Arrays.asList("*")); + + SharedRefEnforcement refEnforcement = newRefEnforcement(sharedRefDbConfig); + Ref changeRef = newRef(A_REF_NAME_OF_A_PATCHSET, AN_OBJECT_ID_1); + + assertThat(refEnforcement.getPolicy(A_TEST_PROJECT_NAME, changeRef.getName())) + .isEqualTo(SharedRefEnforcement.Policy.EXCLUDE); + } + + @Test public void patchSetRefIsExcludedByDefault() { Ref changeRef = newRef(A_REF_NAME_OF_A_PATCHSET, AN_OBJECT_ID_1); assertThat(refEnforcement.getPolicy(A_TEST_PROJECT_NAME, changeRef.getName())) @@ -158,7 +179,7 @@ @Test public void draftCommentsIncludedWhenDraftCommentEventsEnabled() { SharedRefEnforcement refEnforcement = - new SharedRefEnforcement(ImmutableSet.of(), ImmutableSet.of(), true); + new SharedRefEnforcement(ImmutableSet.of(), ImmutableSet.of(), ImmutableSet.of(), true); Ref draftCommentRef = newRef("refs/draft-comments/01/1/1000000", AN_OBJECT_ID_1); assertThat(refEnforcement.getPolicy(A_TEST_PROJECT_NAME, draftCommentRef.getName())) .isEqualTo(Policy.INCLUDE);