diff options
author | Kaushik Lingarkar <[email protected]> | 2025-08-14 10:21:49 -0700 |
---|---|---|
committer | Gerrit Code Review <[email protected]> | 2025-08-14 10:21:49 -0700 |
commit | 363cc19d14a5a115fda9a944e10666e7ad7c4da2 (patch) | |
tree | ccc48cf43f6300af514ce6deb47ac3cd94550616 | |
parent | 88485ecf5b84cf92f2e56a24835a2745b519a7eb (diff) | |
parent | 0383fe371a1e83893f4cd83225f81d69fc3f3223 (diff) |
Merge "SequenceSetCommand: Enforce strictly increasing sequence" into stable-3.10upstream/stable-3.10
3 files changed, 34 insertions, 15 deletions
diff --git a/java/com/google/gerrit/server/notedb/RepoSequence.java b/java/com/google/gerrit/server/notedb/RepoSequence.java index 5580cbc7bb..36a508da78 100644 --- a/java/com/google/gerrit/server/notedb/RepoSequence.java +++ b/java/com/google/gerrit/server/notedb/RepoSequence.java @@ -372,6 +372,7 @@ public class RepoSequence implements Sequence { @Override public void storeNew(int value) { + checkIsIncremental(value); counterLock.lock(); try (RefUpdateContext ctx = RefUpdateContext.open(REPO_SEQ)) { try (Repository repo = repoManager.openRepository(projectName); diff --git a/java/com/google/gerrit/sshd/commands/SequenceSetCommand.java b/java/com/google/gerrit/sshd/commands/SequenceSetCommand.java index 3ec34bc817..6685d78cd1 100644 --- a/java/com/google/gerrit/sshd/commands/SequenceSetCommand.java +++ b/java/com/google/gerrit/sshd/commands/SequenceSetCommand.java @@ -17,6 +17,7 @@ package com.google.gerrit.sshd.commands; import com.google.gerrit.common.data.GlobalCapability; import com.google.gerrit.extensions.annotations.RequiresCapability; import com.google.gerrit.server.Sequences; +import com.google.gerrit.server.notedb.RepoSequence; import com.google.gerrit.sshd.CommandMetaData; import com.google.gerrit.sshd.SshCommand; import com.google.inject.Inject; @@ -36,21 +37,25 @@ final class SequenceSetCommand extends SshCommand { @Override public void run() throws Exception { - switch (name) { - case "changes": - sequences.setChangeIdValue(value); - break; - case "accounts": - sequences.setAccountIdValue(value); - break; - case "groups": - sequences.setGroupIdValue(value); - break; - default: - throw die("Unknown sequence name: " + name); + try { + switch (name) { + case "changes": + sequences.setChangeIdValue(value); + break; + case "accounts": + sequences.setAccountIdValue(value); + break; + case "groups": + sequences.setGroupIdValue(value); + break; + default: + throw die("Unknown sequence name: " + name); + } + stdout.print("The value for the " + name + " sequence was set to " + value + "."); + stdout.print('\n'); + stdout.flush(); + } catch (RepoSequence.NonIncrementingSequenceException e) { + throw new UnloggedFailure(e.getMessage()); } - stdout.print("The value for the " + name + " sequence was set to " + value + "."); - stdout.print('\n'); - stdout.flush(); } } diff --git a/javatests/com/google/gerrit/server/notedb/RepoSequenceTest.java b/javatests/com/google/gerrit/server/notedb/RepoSequenceTest.java index 7d83408abc..9878347734 100644 --- a/javatests/com/google/gerrit/server/notedb/RepoSequenceTest.java +++ b/javatests/com/google/gerrit/server/notedb/RepoSequenceTest.java @@ -372,6 +372,19 @@ public class RepoSequenceTest { } @Test + public void failOnNonIncrementingSequenceWithStoreNew() throws Exception { + RepoSequence s = newSequence("id", 10, 1); + assertThat(s.next()).isEqualTo(10); + RepoSequence.NonIncrementingSequenceException thrown = + assertThrows(RepoSequence.NonIncrementingSequenceException.class, () -> s.storeNew(5)); + assertThat(thrown) + .hasMessageThat() + .contains( + "For refs/sequences/id, expected new value 5 to be greater than last stored value 11"); + assertThat(s.current()).isEqualTo(11); + } + + @Test public void failOnNonIncrementingSequence() throws Exception { RepoSequence s = newSequence("id", 10, 1); assertThat(s.next()).isEqualTo(10); |