Merge branch 'stable-3.10' into stable-3.11
* stable-3.10:
Move DisabledSharedRefLogger into the library
Introduce local-refdb locking facility
Remove unneeded @Inject in LockWrapper
Remove unused LockWrapper.Factory
Add sentinel to prevent out of sync with global-refdb
Verify global-refdb formatting using GJF 1.7
Log lock acquisition only after is successful
Log lock releases
Change-Id: I8367b74601f171a869c3341bc7965e47f8243bc5
diff --git a/Jenkinsfile b/Jenkinsfile
index 1b1137b..3217274 100644
--- a/Jenkinsfile
+++ b/Jenkinsfile
@@ -1,2 +1,2 @@
-pluginPipeline(formatCheckId: 'gerritforge:global-refdb-format-59a34d6c50367a468c810e28d733855abc059f13',
+ pluginPipeline(formatCheckId: 'gerritforge:global-refdb-format-59a34d6c50367a468c810e28d733855abc059f13',
buildCheckId: 'gerritforge:global-refdb-59a34d6c50367a468c810e28d733855abc059f13')
diff --git a/src/main/java/com/gerritforge/gerrit/globalrefdb/GlobalRefDbLockException.java b/src/main/java/com/gerritforge/gerrit/globalrefdb/GlobalRefDbLockException.java
index 65b9cf1..29ac90e 100644
--- a/src/main/java/com/gerritforge/gerrit/globalrefdb/GlobalRefDbLockException.java
+++ b/src/main/java/com/gerritforge/gerrit/globalrefdb/GlobalRefDbLockException.java
@@ -14,13 +14,11 @@
package com.gerritforge.gerrit.globalrefdb;
-import com.google.gerrit.git.LockFailureException;
-
/**
* {@code GlobalRefDbLockException} is an exception that can be thrown when interacting with the
* global-refdb to represent the inability to lock or acquire a resource.
*/
-public class GlobalRefDbLockException extends LockFailureException {
+public class GlobalRefDbLockException extends RefDbLockException {
private static final long serialVersionUID = 1L;
/**
@@ -32,6 +30,6 @@
* @param cause the cause of the locking failure
*/
public GlobalRefDbLockException(String project, String refName, Exception cause) {
- super(String.format("Unable to lock ref %s on project %s", refName, project), cause);
+ super(project, refName, cause);
}
}
diff --git a/src/main/java/com/gerritforge/gerrit/globalrefdb/RefDbLockException.java b/src/main/java/com/gerritforge/gerrit/globalrefdb/RefDbLockException.java
new file mode 100644
index 0000000..d4157f7
--- /dev/null
+++ b/src/main/java/com/gerritforge/gerrit/globalrefdb/RefDbLockException.java
@@ -0,0 +1,39 @@
+// Copyright (C) 2025 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.git.LockFailureException;
+
+/** {@code RefDbLockException} is an exception that can be thrown when trying to lock a ref. */
+public class RefDbLockException extends LockFailureException {
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * Constructs a new {@code RefDbLockException} with the specified project, refName and cause.
+ *
+ * @param project the project containing refName
+ * @param refName the specific ref for which the locking failed
+ * @param cause the cause of the locking failure
+ */
+ public RefDbLockException(String project, String refName, Exception cause) {
+ super(String.format("Unable to lock ref %s on project %s", refName, project), cause);
+ }
+
+ public RefDbLockException(String project, String refName, String message) {
+ super(
+ String.format("Unable to lock ref %s on project %s: %s", refName, project, message),
+ (Throwable) null);
+ }
+}
diff --git a/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/BatchRefUpdateValidator.java b/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/BatchRefUpdateValidator.java
index 8357825..4a28687 100644
--- a/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/BatchRefUpdateValidator.java
+++ b/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/BatchRefUpdateValidator.java
@@ -58,7 +58,6 @@
* @param refEnforcement Specific ref enforcements for this project. Either a {@link
* CustomSharedRefEnforcementByProject} when custom policies are provided via configuration *
* file or a {@link DefaultSharedRefEnforcement} for defaults.
- * @param lockWrapperFactory factory providing a {@link LockWrapper}
* @param projectsFilter filter to match whether the project being updated should be validated
* against global refdb
* @param projectName the name of the project being updated.
@@ -71,7 +70,6 @@
SharedRefDatabaseWrapper sharedRefDb,
ValidationMetrics validationMetrics,
SharedRefEnforcement refEnforcement,
- LockWrapper.Factory lockWrapperFactory,
ProjectsFilter projectsFilter,
@Assisted String projectName,
@Assisted RefDatabase refDb,
@@ -80,7 +78,6 @@
sharedRefDb,
validationMetrics,
refEnforcement,
- lockWrapperFactory,
projectsFilter,
projectName,
refDb,
diff --git a/src/test/java/com/gerritforge/gerrit/globalrefdb/validation/DisabledSharedRefLogger.java b/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/DisabledSharedRefLogger.java
similarity index 87%
rename from src/test/java/com/gerritforge/gerrit/globalrefdb/validation/DisabledSharedRefLogger.java
rename to src/main/java/com/gerritforge/gerrit/globalrefdb/validation/DisabledSharedRefLogger.java
index d6dd338..7ac7f01 100644
--- a/src/test/java/com/gerritforge/gerrit/globalrefdb/validation/DisabledSharedRefLogger.java
+++ b/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/DisabledSharedRefLogger.java
@@ -16,9 +16,7 @@
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.Ref;
-import org.junit.Ignore;
-@Ignore
public class DisabledSharedRefLogger implements SharedRefLogger {
@Override
@@ -28,10 +26,10 @@
public void logProjectDelete(String project) {}
@Override
- public void logLockAcquisition(String project, String refName) {}
+ public void logLockAcquisition(String project, String refName, Scope scope) {}
@Override
- public void logLockRelease(String project, String refName) {}
+ public void logLockRelease(String project, String refName, Scope scope) {}
@Override
public <T> void logRefUpdate(String project, String refName, T currRef, T newRefValue) {}
diff --git a/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/LockWrapper.java b/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/LockWrapper.java
index a1312b0..02b2ec0 100644
--- a/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/LockWrapper.java
+++ b/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/LockWrapper.java
@@ -14,23 +14,13 @@
package com.gerritforge.gerrit.globalrefdb.validation;
-import com.google.inject.Inject;
-import com.google.inject.assistedinject.Assisted;
-
/** Wrapper around an {@link AutoCloseable} lock to allow logging of resource releasing. */
public class LockWrapper implements AutoCloseable {
- /** {@code LockWrapper} Factory for Guice assisted injection. */
- public interface Factory {
- LockWrapper create(
- @Assisted("project") String project,
- @Assisted("refName") String refName,
- @Assisted AutoCloseable lock);
- }
-
private final String project;
private final String refName;
private final AutoCloseable lock;
private final SharedRefLogger sharedRefLogger;
+ private final SharedRefLogger.Scope scope;
/**
* Constructs a {@code LockWrapper} object for a specific refName of a project, which wraps a held
@@ -41,16 +31,18 @@
* @param refName the refName the lock has been acquired for
* @param lock the acquired lock
*/
- @Inject
public LockWrapper(
SharedRefLogger sharedRefLogger,
- @Assisted("project") String project,
- @Assisted("refName") String refName,
- @Assisted AutoCloseable lock) {
+ String project,
+ String refName,
+ AutoCloseable lock,
+ SharedRefLogger.Scope scope) {
this.lock = lock;
this.sharedRefLogger = sharedRefLogger;
this.project = project;
this.refName = refName;
+ this.scope = scope;
+ sharedRefLogger.logLockAcquisition(project, refName, scope);
}
/**
@@ -61,6 +53,6 @@
@Override
public void close() throws Exception {
lock.close();
- sharedRefLogger.logLockRelease(project, refName);
+ sharedRefLogger.logLockRelease(project, refName, scope);
}
}
diff --git a/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/Log4jSharedRefLogger.java b/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/Log4jSharedRefLogger.java
index 04ffeed..691d8b1 100644
--- a/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/Log4jSharedRefLogger.java
+++ b/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/Log4jSharedRefLogger.java
@@ -168,8 +168,8 @@
* <p>Logs Json serialization of {@link SharedRefLogEntry.LockAcquire}
*/
@Override
- public void logLockAcquisition(String project, String refName) {
- sharedRefDBLog.info(gson.toJson(new SharedRefLogEntry.LockAcquire(project, refName)));
+ public void logLockAcquisition(String project, String refName, Scope scope) {
+ sharedRefDBLog.info(gson.toJson(new SharedRefLogEntry.LockAcquire(project, refName, scope)));
}
/**
@@ -178,8 +178,8 @@
* <p>Logs Json serialization of {@link SharedRefLogEntry.LockRelease}
*/
@Override
- public void logLockRelease(String project, String refName) {
- sharedRefDBLog.info(gson.toJson(new SharedRefLogEntry.LockRelease(project, refName)));
+ public void logLockRelease(String project, String refName, Scope scope) {
+ sharedRefDBLog.info(gson.toJson(new SharedRefLogEntry.LockRelease(project, refName, scope)));
}
@VisibleForTesting
diff --git a/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/NoOpRefLocker.java b/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/NoOpRefLocker.java
new file mode 100644
index 0000000..b8682b4
--- /dev/null
+++ b/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/NoOpRefLocker.java
@@ -0,0 +1,30 @@
+// Copyright (C) 2025 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.validation;
+
+import com.gerritforge.gerrit.globalrefdb.RefDbLockException;
+import com.google.gerrit.entities.Project;
+import com.google.inject.Singleton;
+
+@Singleton
+class NoOpRefLocker implements RefLocker {
+
+ public static final NoOpRefLocker INSTANCE = new NoOpRefLocker();
+
+ @Override
+ public AutoCloseable lockRef(Project.NameKey project, String refName) throws RefDbLockException {
+ return () -> {};
+ }
+}
diff --git a/src/test/java/com/gerritforge/gerrit/globalrefdb/validation/DummyLockWrapper.java b/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/RefLocker.java
similarity index 63%
rename from src/test/java/com/gerritforge/gerrit/globalrefdb/validation/DummyLockWrapper.java
rename to src/main/java/com/gerritforge/gerrit/globalrefdb/validation/RefLocker.java
index 84d6912..c0f1578 100644
--- a/src/test/java/com/gerritforge/gerrit/globalrefdb/validation/DummyLockWrapper.java
+++ b/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/RefLocker.java
@@ -1,4 +1,4 @@
-// Copyright (C) 2020 The Android Open Source Project
+// Copyright (C) 2025 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.
@@ -14,13 +14,11 @@
package com.gerritforge.gerrit.globalrefdb.validation;
-import org.junit.Ignore;
+import com.gerritforge.gerrit.globalrefdb.RefDbLockException;
+import com.google.gerrit.entities.Project;
+import com.google.inject.ImplementedBy;
-@Ignore
-public class DummyLockWrapper implements LockWrapper.Factory {
-
- @Override
- public LockWrapper create(String project, String refName, AutoCloseable lock) {
- return new LockWrapper(new DisabledSharedRefLogger(), project, refName, lock);
- }
+@ImplementedBy(NoOpRefLocker.class)
+public interface RefLocker {
+ AutoCloseable lockRef(Project.NameKey project, String refName) throws RefDbLockException;
}
diff --git a/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/RefUpdateValidator.java b/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/RefUpdateValidator.java
index e996553..895a7f4 100644
--- a/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/RefUpdateValidator.java
+++ b/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/RefUpdateValidator.java
@@ -16,6 +16,7 @@
import com.gerritforge.gerrit.globalrefdb.GlobalRefDbLockException;
import com.gerritforge.gerrit.globalrefdb.GlobalRefDbSystemError;
+import com.gerritforge.gerrit.globalrefdb.RefDbLockException;
import com.gerritforge.gerrit.globalrefdb.validation.dfsrefdb.CustomSharedRefEnforcementByProject;
import com.gerritforge.gerrit.globalrefdb.validation.dfsrefdb.DefaultSharedRefEnforcement;
import com.gerritforge.gerrit.globalrefdb.validation.dfsrefdb.OutOfSyncException;
@@ -46,7 +47,6 @@
protected final ValidationMetrics validationMetrics;
protected final String projectName;
- private final LockWrapper.Factory lockWrapperFactory;
protected final RefDatabase refDb;
protected final SharedRefEnforcement refEnforcement;
protected final ProjectsFilter projectsFilter;
@@ -92,7 +92,6 @@
* @param refEnforcement Specific ref enforcements for this project. Either a {@link
* CustomSharedRefEnforcementByProject} when custom policies are provided via configuration
* file or a {@link DefaultSharedRefEnforcement} for defaults.
- * @param lockWrapperFactory factory providing a {@link LockWrapper}
* @param projectsFilter filter to match whether the project being updated should be validated
* against global refdb
* @param projectName the name of the project being updated.
@@ -105,14 +104,12 @@
SharedRefDatabaseWrapper sharedRefDb,
ValidationMetrics validationMetrics,
SharedRefEnforcement refEnforcement,
- LockWrapper.Factory lockWrapperFactory,
ProjectsFilter projectsFilter,
@Assisted String projectName,
@Assisted RefDatabase refDb,
@Assisted ImmutableSet<String> ignoredRefs) {
this.sharedRefDb = sharedRefDb;
this.validationMetrics = validationMetrics;
- this.lockWrapperFactory = lockWrapperFactory;
this.refDb = refDb;
this.ignoredRefs = ignoredRefs;
this.projectName = projectName;
@@ -205,6 +202,9 @@
e.getMessage());
}
return result;
+ } catch (RefDbLockException e) {
+ logger.atWarning().withCause(e).log("Unable to lock %s:%s", projectName, refUpdate.getName());
+ return Result.LOCK_FAILURE;
} catch (OutOfSyncException e) {
logger.atWarning().withCause(e).log(
"Local node is out of sync with ref-db: %s", e.getMessage());
@@ -271,19 +271,18 @@
return refUpdateSnapshot;
}
- locks.addResourceIfNotExist(
- String.format("%s-%s", projectName, refName),
- () ->
- lockWrapperFactory.create(
- projectName, refName, sharedRefDb.lockRef(Project.nameKey(projectName), refName)));
+ String sharedLockKey = String.format("%s:%s", projectName, refName);
+ String localLockKey = String.format("%s:local", sharedLockKey);
+ Project.NameKey projectKey = Project.nameKey(projectName);
+ locks.addResourceIfNotExist(localLockKey, () -> sharedRefDb.lockLocalRef(projectKey, refName));
+ locks.addResourceIfNotExist(sharedLockKey, () -> sharedRefDb.lockRef(projectKey, refName));
RefUpdateSnapshot latestRefUpdateSnapshot = getLatestLocalRef(refUpdateSnapshot);
- if (sharedRefDb.isUpToDate(Project.nameKey(projectName), latestRefUpdateSnapshot.getRef())) {
+ if (sharedRefDb.isUpToDate(projectKey, latestRefUpdateSnapshot.getRef())) {
return latestRefUpdateSnapshot;
}
- if (isNullRef(latestRefUpdateSnapshot.getRef())
- || sharedRefDb.exists(Project.nameKey(projectName), refName)) {
+ if (isNullRef(latestRefUpdateSnapshot.getRef()) || sharedRefDb.exists(projectKey, refName)) {
validationMetrics.incrementSplitBrainPrevention();
softFailBasedOnEnforcement(
@@ -351,8 +350,8 @@
}
public void addResourceIfNotExist(
- String key, ExceptionThrowingSupplier<T, GlobalRefDbLockException> resourceFactory)
- throws GlobalRefDbLockException {
+ String key, ExceptionThrowingSupplier<T, RefDbLockException> resourceFactory)
+ throws RefDbLockException {
if (!elements.containsKey(key)) {
elements.put(key, resourceFactory.create());
}
diff --git a/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefDatabaseWrapper.java b/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefDatabaseWrapper.java
index b973602..fd5d546 100644
--- a/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefDatabaseWrapper.java
+++ b/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefDatabaseWrapper.java
@@ -18,6 +18,7 @@
import com.gerritforge.gerrit.globalrefdb.GlobalRefDatabase;
import com.gerritforge.gerrit.globalrefdb.GlobalRefDbLockException;
import com.gerritforge.gerrit.globalrefdb.GlobalRefDbSystemError;
+import com.gerritforge.gerrit.globalrefdb.RefDbLockException;
import com.gerritforge.gerrit.globalrefdb.validation.dfsrefdb.NoopSharedRefDatabase;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.flogger.FluentLogger;
@@ -45,6 +46,7 @@
private final SharedRefLogger sharedRefLogger;
private final SharedRefDBMetrics metrics;
+ private final RefLocker localRefDbLocker;
/**
* Constructs a {@code SharedRefDatabaseWrapper} wrapping an optional {@link GlobalRefDatabase},
@@ -53,17 +55,20 @@
* @param sharedRefLogger logger of shared ref-db operations.
*/
@Inject
- public SharedRefDatabaseWrapper(SharedRefLogger sharedRefLogger, SharedRefDBMetrics metrics) {
+ public SharedRefDatabaseWrapper(
+ SharedRefLogger sharedRefLogger, SharedRefDBMetrics metrics, RefLocker localRefDbLocker) {
this.sharedRefLogger = sharedRefLogger;
this.metrics = metrics;
+ this.localRefDbLocker = localRefDbLocker;
}
@VisibleForTesting
public SharedRefDatabaseWrapper(
DynamicItem<GlobalRefDatabase> sharedRefDbDynamicItem,
SharedRefLogger sharedRefLogger,
- SharedRefDBMetrics metrics) {
- this(sharedRefLogger, metrics);
+ SharedRefDBMetrics metrics,
+ RefLocker localRefDbLocker) {
+ this(sharedRefLogger, metrics, localRefDbLocker);
this.sharedRefDbDynamicItem = sharedRefDbDynamicItem;
}
@@ -122,12 +127,25 @@
public AutoCloseable lockRef(Project.NameKey project, String refName)
throws GlobalRefDbLockException {
try (Context context = metrics.startLockRefExecutionTime()) {
- AutoCloseable locker = sharedRefDb().lockRef(project, refName);
- sharedRefLogger.logLockAcquisition(project.get(), refName);
- return locker;
+ return new LockWrapper(
+ sharedRefLogger,
+ project.get(),
+ refName,
+ sharedRefDb().lockRef(project, refName),
+ SharedRefLogger.Scope.GLOBAL);
}
}
+ public AutoCloseable lockLocalRef(Project.NameKey project, String refName)
+ throws RefDbLockException {
+ return new LockWrapper(
+ sharedRefLogger,
+ project.get(),
+ refName,
+ localRefDbLocker.lockRef(project, refName),
+ SharedRefLogger.Scope.LOCAL);
+ }
+
@Override
public boolean exists(Project.NameKey project, String refName) {
try (Context context = metrics.startExistsExecutionTime()) {
diff --git a/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefLogEntry.java b/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefLogEntry.java
index 4b8132f..817b274 100644
--- a/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefLogEntry.java
+++ b/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefLogEntry.java
@@ -79,22 +79,26 @@
public static class LockAcquire extends SharedRefLogEntry {
public String refName;
+ public SharedRefLogger.Scope scope;
- LockAcquire(String projectName, String refName) {
+ LockAcquire(String projectName, String refName, SharedRefLogger.Scope scope) {
this.type = Type.LOCK_ACQUIRE;
this.projectName = projectName;
this.refName = refName;
+ this.scope = scope;
}
}
public static class LockRelease extends SharedRefLogEntry {
public String refName;
+ public SharedRefLogger.Scope scope;
- LockRelease(String projectName, String refName) {
+ LockRelease(String projectName, String refName, SharedRefLogger.Scope scope) {
this.type = Type.LOCK_RELEASE;
this.projectName = projectName;
this.refName = refName;
+ this.scope = scope;
}
}
}
diff --git a/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefLogger.java b/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefLogger.java
index f61f253..96db4e4 100644
--- a/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefLogger.java
+++ b/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefLogger.java
@@ -21,6 +21,11 @@
@ImplementedBy(Log4jSharedRefLogger.class)
public interface SharedRefLogger {
+ enum Scope {
+ GLOBAL,
+ LOCAL
+ }
+
/**
* Log the update of currRef in project project to ref newRefValue
*
@@ -63,14 +68,16 @@
*
* @param project the project containing the ref
* @param refName the name of the ref the lock is acquired for
+ * @param scope scope of the lock
*/
- void logLockAcquisition(String project, String refName);
+ void logLockAcquisition(String project, String refName, Scope scope);
/**
* Log the releasing of a previously acquired lock for the 'refName' of 'project'
*
* @param project the project containing the ref
* @param refName the name of the ref the lock is being releaed for
+ * @param scope scope of the lock
*/
- void logLockRelease(String project, String refName);
+ void logLockRelease(String project, String refName, Scope scope);
}
diff --git a/src/test/java/com/gerritforge/gerrit/globalrefdb/validation/BatchRefUpdateValidatorTest.java b/src/test/java/com/gerritforge/gerrit/globalrefdb/validation/BatchRefUpdateValidatorTest.java
index 85f95ec..bb50f74 100644
--- a/src/test/java/com/gerritforge/gerrit/globalrefdb/validation/BatchRefUpdateValidatorTest.java
+++ b/src/test/java/com/gerritforge/gerrit/globalrefdb/validation/BatchRefUpdateValidatorTest.java
@@ -267,7 +267,6 @@
new ValidationMetrics(
new DisabledMetricMaker(), new SharedRefDbConfiguration(new Config(), "testplugin")),
sharedRefEnforcement,
- new DummyLockWrapper(),
projectsFilter,
RefFixture.A_TEST_PROJECT_NAME,
diskRepo.getRefDatabase(),
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 47964cf..5b9a9dd 100644
--- a/src/test/java/com/gerritforge/gerrit/globalrefdb/validation/Log4jSharedRefLoggerTest.java
+++ b/src/test/java/com/gerritforge/gerrit/globalrefdb/validation/Log4jSharedRefLoggerTest.java
@@ -120,7 +120,7 @@
@Test
public void shouldLogLockAcquisition() {
String refName = "refs/foo/bar";
- log4jSharedRefLogger.logLockAcquisition(project.get(), refName);
+ log4jSharedRefLogger.logLockAcquisition(project.get(), refName, SharedRefLogger.Scope.GLOBAL);
SharedRefLogEntry.LockAcquire gotLogEntry =
gson.fromJson(logWriter.toString(), SharedRefLogEntry.LockAcquire.class);
@@ -133,7 +133,7 @@
@Test
public void shouldLogLockRelease() {
String refName = "refs/foo/bar";
- log4jSharedRefLogger.logLockRelease(project.get(), refName);
+ log4jSharedRefLogger.logLockRelease(project.get(), refName, SharedRefLogger.Scope.GLOBAL);
SharedRefLogEntry.LockAcquire gotLogEntry =
gson.fromJson(logWriter.toString(), SharedRefLogEntry.LockAcquire.class);
diff --git a/src/test/java/com/gerritforge/gerrit/globalrefdb/validation/RefUpdateValidatorTest.java b/src/test/java/com/gerritforge/gerrit/globalrefdb/validation/RefUpdateValidatorTest.java
index f26f749..435db8f 100644
--- a/src/test/java/com/gerritforge/gerrit/globalrefdb/validation/RefUpdateValidatorTest.java
+++ b/src/test/java/com/gerritforge/gerrit/globalrefdb/validation/RefUpdateValidatorTest.java
@@ -18,12 +18,14 @@
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.lenient;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import com.gerritforge.gerrit.globalrefdb.GlobalRefDbSystemError;
+import com.gerritforge.gerrit.globalrefdb.RefDbLockException;
import com.gerritforge.gerrit.globalrefdb.validation.RefUpdateValidator.OneParameterFunction;
import com.gerritforge.gerrit.globalrefdb.validation.dfsrefdb.DefaultSharedRefEnforcement;
import com.gerritforge.gerrit.globalrefdb.validation.dfsrefdb.RefFixture;
@@ -94,7 +96,7 @@
@Test
public void validationShouldSucceedWhenSharedRefDbIsNoop() throws Exception {
SharedRefDatabaseWrapper noopSharedRefDbWrapper =
- new SharedRefDatabaseWrapper(sharedRefLogger, sharedRefDBMetrics);
+ new SharedRefDatabaseWrapper(sharedRefLogger, sharedRefDBMetrics, NoOpRefLocker.INSTANCE);
Result result =
newRefUpdateValidator(noopSharedRefDbWrapper)
@@ -179,6 +181,18 @@
}
@Test
+ public void validationShouldFailWhenLocalRefDbIsLocked() throws Exception {
+ doThrow(RefDbLockException.class)
+ .when(sharedRefDb)
+ .lockLocalRef(A_TEST_PROJECT_NAME_KEY, refName);
+
+ Result result =
+ refUpdateValidator.executeRefUpdate(refUpdate, () -> Result.NEW, this::defaultRollback);
+
+ assertThat(result).isEqualTo(Result.LOCK_FAILURE);
+ }
+
+ @Test
public void shouldRollbackWhenLocalRefDbIsUpToDateButFinalCompareAndPutIsFailing()
throws Exception {
lenient()
@@ -228,7 +242,6 @@
.when(sharedRefDb)
.isUpToDate(any(Project.NameKey.class), any(Ref.class));
doReturn(true).when(sharedRefDb).isUpToDate(A_TEST_PROJECT_NAME_KEY, localRef);
-
when(sharedRefDb.compareAndPut(any(Project.NameKey.class), any(Ref.class), any(ObjectId.class)))
.thenThrow(GlobalRefDbSystemError.class);
when(rollbackFunction.invoke(any())).thenReturn(Result.LOCK_FAILURE);
@@ -280,7 +293,6 @@
refDbWrapper,
validationMetrics,
defaultRefEnforcement,
- new DummyLockWrapper(),
projectsFilter,
A_TEST_PROJECT_NAME,
localRefDb,
diff --git a/src/test/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefDatabaseWrapperTest.java b/src/test/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefDatabaseWrapperTest.java
index 5240f2c..ce1fcea 100644
--- a/src/test/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefDatabaseWrapperTest.java
+++ b/src/test/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefDatabaseWrapperTest.java
@@ -48,7 +48,8 @@
when(metrics.startExistsExecutionTime()).thenReturn(context);
when(metrics.startIsUpToDateExecutionTime()).thenReturn(context);
when(metrics.startRemoveExecutionTime()).thenReturn(context);
- objectUnderTest = new SharedRefDatabaseWrapper(sharedRefLogger, metrics);
+ objectUnderTest =
+ new SharedRefDatabaseWrapper(sharedRefLogger, metrics, NoOpRefLocker.INSTANCE);
}
@Test
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 26761f1..e463cb5 100644
--- a/src/test/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefDbBatchRefUpdateTest.java
+++ b/src/test/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefDbBatchRefUpdateTest.java
@@ -182,7 +182,6 @@
sharedRefDb,
validationMetrics,
new DefaultSharedRefEnforcement(),
- new DummyLockWrapper(),
projectsFilter,
projectName,
refDb,
diff --git a/src/test/java/com/gerritforge/gerrit/globalrefdb/validation/ValidationModuleTest.java b/src/test/java/com/gerritforge/gerrit/globalrefdb/validation/ValidationModuleTest.java
index b1af798..3283994 100644
--- a/src/test/java/com/gerritforge/gerrit/globalrefdb/validation/ValidationModuleTest.java
+++ b/src/test/java/com/gerritforge/gerrit/globalrefdb/validation/ValidationModuleTest.java
@@ -91,7 +91,6 @@
bind(SharedRefDatabaseWrapper.class).in(Scopes.SINGLETON);
bind(SharedRefLogger.class).to(Log4jSharedRefLogger.class);
- factory(LockWrapper.Factory.class);
factory(SharedRefDbRepository.Factory.class);
factory(SharedRefDbRefDatabase.Factory.class);