Leverage GlobalRefDatabase interface
Use the external definition of the GlobalRefDatabase
provided by the GerritForge's library instead of one defined
internally.
Using a well-defined external interface allows to use
other non-Zookeeper based implementation of the global ref-db.
Change-Id: I753e1fc3be78f2b34c55187a605bdc0d9edafbf4
diff --git a/BUILD b/BUILD
index 0e88858..0615d17 100644
--- a/BUILD
+++ b/BUILD
@@ -22,6 +22,7 @@
"@curator-recipes//jar",
"@kafka-client//jar",
"@zookeeper//jar",
+ "@global-refdb//jar",
"//plugins/replication",
],
)
@@ -54,5 +55,6 @@
"@curator-test//jar",
"@curator-client//jar",
"@zookeeper//jar",
+ "@global-refdb//jar",
],
)
diff --git a/external_plugin_deps.bzl b/external_plugin_deps.bzl
index eb53541..f97cfd3 100644
--- a/external_plugin_deps.bzl
+++ b/external_plugin_deps.bzl
@@ -50,3 +50,9 @@
artifact = "org.apache.zookeeper:zookeeper:3.4.14",
sha1 = "c114c1e1c8172a7cd3f6ae39209a635f7a06c1a1",
)
+
+ maven_jar(
+ name = "global-refdb",
+ artifact = "com.gerritforge:global-refdb:0.1.1",
+ sha1 = "d6ab59906db7b20a52c8994502780b2a6ab23872",
+ )
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/Module.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/Module.java
index 89c2253..9a8c4c4 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/Module.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/Module.java
@@ -14,6 +14,7 @@
package com.googlesource.gerrit.plugins.multisite;
+import com.gerritforge.gerrit.globalrefdb.GlobalRefDatabase;
import com.google.gerrit.extensions.registration.DynamicItem;
import com.google.gerrit.lifecycle.LifecycleModule;
import com.google.gerrit.server.config.SitePaths;
@@ -33,7 +34,6 @@
import com.googlesource.gerrit.plugins.multisite.forwarder.router.RouterModule;
import com.googlesource.gerrit.plugins.multisite.index.IndexModule;
import com.googlesource.gerrit.plugins.multisite.validation.dfsrefdb.NoopSharedRefDatabase;
-import com.googlesource.gerrit.plugins.multisite.validation.dfsrefdb.SharedRefDatabase;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
@@ -64,8 +64,8 @@
throw new CreationException(validationErrors);
}
- DynamicItem.itemOf(binder(), SharedRefDatabase.class);
- DynamicItem.bind(binder(), SharedRefDatabase.class)
+ DynamicItem.itemOf(binder(), GlobalRefDatabase.class);
+ DynamicItem.bind(binder(), GlobalRefDatabase.class)
.to(NoopSharedRefDatabase.class)
.in(Scopes.SINGLETON);
log.info("Shared ref-db engine: none");
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/SharedRefDatabaseWrapper.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/SharedRefDatabaseWrapper.java
index eda8d7c..9d55e43 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/SharedRefDatabaseWrapper.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/SharedRefDatabaseWrapper.java
@@ -14,19 +14,20 @@
package com.googlesource.gerrit.plugins.multisite;
+import com.gerritforge.gerrit.globalrefdb.GlobalRefDatabase;
+import com.gerritforge.gerrit.globalrefdb.GlobalRefDbLockException;
+import com.gerritforge.gerrit.globalrefdb.GlobalRefDbSystemError;
import com.google.common.annotations.VisibleForTesting;
import com.google.gerrit.extensions.registration.DynamicItem;
+import com.google.gerrit.reviewdb.client.Project;
import com.google.inject.Inject;
-import com.googlesource.gerrit.plugins.multisite.validation.dfsrefdb.SharedLockException;
-import com.googlesource.gerrit.plugins.multisite.validation.dfsrefdb.SharedRefDatabase;
-import java.io.IOException;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.Ref;
-public class SharedRefDatabaseWrapper implements SharedRefDatabase {
+public class SharedRefDatabaseWrapper implements GlobalRefDatabase {
@Inject(optional = true)
- private DynamicItem<SharedRefDatabase> sharedRefDbDynamicItem;
+ private DynamicItem<GlobalRefDatabase> sharedRefDbDynamicItem;
private final SharedRefLogger sharedRefLogger;
@@ -37,45 +38,46 @@
@VisibleForTesting
public SharedRefDatabaseWrapper(
- DynamicItem<SharedRefDatabase> sharedRefDbDynamicItem, SharedRefLogger sharedRefLogger) {
+ DynamicItem<GlobalRefDatabase> sharedRefDbDynamicItem, SharedRefLogger sharedRefLogger) {
this.sharedRefLogger = sharedRefLogger;
this.sharedRefDbDynamicItem = sharedRefDbDynamicItem;
}
@Override
- public boolean isUpToDate(String project, Ref ref) throws SharedLockException {
+ public boolean isUpToDate(Project.NameKey project, Ref ref) throws GlobalRefDbLockException {
return sharedRefDb().isUpToDate(project, ref);
}
@Override
- public boolean compareAndPut(String project, Ref currRef, ObjectId newRefValue)
- throws IOException {
+ public boolean compareAndPut(Project.NameKey project, Ref currRef, ObjectId newRefValue)
+ throws GlobalRefDbSystemError {
boolean succeeded = sharedRefDb().compareAndPut(project, currRef, newRefValue);
if (succeeded) {
- sharedRefLogger.logRefUpdate(project, currRef, newRefValue);
+ sharedRefLogger.logRefUpdate(project.get(), currRef, newRefValue);
}
return succeeded;
}
@Override
- public AutoCloseable lockRef(String project, String refName) throws SharedLockException {
+ public AutoCloseable lockRef(Project.NameKey project, String refName)
+ throws GlobalRefDbLockException {
AutoCloseable locker = sharedRefDb().lockRef(project, refName);
- sharedRefLogger.logLockAcquisition(project, refName);
+ sharedRefLogger.logLockAcquisition(project.get(), refName);
return locker;
}
@Override
- public boolean exists(String project, String refName) {
+ public boolean exists(Project.NameKey project, String refName) {
return sharedRefDb().exists(project, refName);
}
@Override
- public void removeProject(String project) throws IOException {
- sharedRefDb().removeProject(project);
- sharedRefLogger.logProjectDelete(project);
+ public void remove(Project.NameKey project) throws GlobalRefDbSystemError {
+ sharedRefDb().remove(project);
+ sharedRefLogger.logProjectDelete(project.get());
}
- private SharedRefDatabase sharedRefDb() {
+ private GlobalRefDatabase sharedRefDb() {
return sharedRefDbDynamicItem.get();
}
}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/BatchRefUpdateValidator.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/BatchRefUpdateValidator.java
index 4e6bef5..932f0c4 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/BatchRefUpdateValidator.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/BatchRefUpdateValidator.java
@@ -19,7 +19,6 @@
import com.google.inject.assistedinject.Assisted;
import com.googlesource.gerrit.plugins.multisite.LockWrapper;
import com.googlesource.gerrit.plugins.multisite.SharedRefDatabaseWrapper;
-import com.googlesource.gerrit.plugins.multisite.validation.dfsrefdb.SharedRefDatabase;
import com.googlesource.gerrit.plugins.multisite.validation.dfsrefdb.SharedRefEnforcement;
import com.googlesource.gerrit.plugins.multisite.validation.dfsrefdb.SharedRefEnforcement.EnforcePolicy;
import java.io.IOException;
@@ -29,6 +28,8 @@
import java.util.stream.Stream;
import org.eclipse.jgit.lib.BatchRefUpdate;
import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.ObjectIdRef;
+import org.eclipse.jgit.lib.Ref;
import org.eclipse.jgit.lib.RefDatabase;
import org.eclipse.jgit.transport.ReceiveCommand;
@@ -124,7 +125,7 @@
try {
switch (command.getType()) {
case CREATE:
- return new RefPair(SharedRefDatabase.nullRef(command.getRefName()), getNewRef(command));
+ return new RefPair(nullRef(command.getRefName()), getNewRef(command));
case UPDATE:
case UPDATE_NONFASTFORWARD:
@@ -155,4 +156,8 @@
}
return latestRefsToUpdate;
}
+
+ private static final Ref nullRef(String refName) {
+ return new ObjectIdRef.Unpeeled(Ref.Storage.NETWORK, refName, ObjectId.zeroId());
+ }
}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/MultisiteReplicationPushFilter.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/MultisiteReplicationPushFilter.java
index 5f25607..42f7194 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/MultisiteReplicationPushFilter.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/MultisiteReplicationPushFilter.java
@@ -14,16 +14,18 @@
package com.googlesource.gerrit.plugins.multisite.validation;
+import com.gerritforge.gerrit.globalrefdb.GlobalRefDbLockException;
+import com.google.gerrit.reviewdb.client.Project;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import com.googlesource.gerrit.plugins.multisite.SharedRefDatabaseWrapper;
-import com.googlesource.gerrit.plugins.multisite.validation.dfsrefdb.SharedLockException;
-import com.googlesource.gerrit.plugins.multisite.validation.dfsrefdb.SharedRefDatabase;
import com.googlesource.gerrit.plugins.replication.ReplicationPushFilter;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
+import org.eclipse.jgit.lib.ObjectIdRef;
+import org.eclipse.jgit.lib.Ref;
import org.eclipse.jgit.transport.RemoteRefUpdate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -52,13 +54,15 @@
String ref = refUpdate.getSrcRef();
try {
if (sharedRefDb.isUpToDate(
- projectName, SharedRefDatabase.newRef(ref, refUpdate.getNewObjectId()))) {
+ new Project.NameKey(projectName),
+ new ObjectIdRef.Unpeeled(
+ Ref.Storage.NETWORK, ref, refUpdate.getNewObjectId()))) {
return true;
}
repLog.warn(
"{} is not up-to-date with the shared-refdb and thus will NOT BE replicated",
refUpdate);
- } catch (SharedLockException e) {
+ } catch (GlobalRefDbLockException e) {
repLog.warn(
"{} is locked on shared-refdb and thus will NOT BE replicated", refUpdate);
}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/ProjectDeletedSharedDbCleanup.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/ProjectDeletedSharedDbCleanup.java
index 78e1cea..9c93793 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/ProjectDeletedSharedDbCleanup.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/ProjectDeletedSharedDbCleanup.java
@@ -14,11 +14,12 @@
package com.googlesource.gerrit.plugins.multisite.validation;
+import com.gerritforge.gerrit.globalrefdb.GlobalRefDbSystemError;
import com.google.common.flogger.FluentLogger;
import com.google.gerrit.extensions.events.ProjectDeletedListener;
+import com.google.gerrit.reviewdb.client.Project;
import com.google.inject.Inject;
import com.googlesource.gerrit.plugins.multisite.SharedRefDatabaseWrapper;
-import java.io.IOException;
public class ProjectDeletedSharedDbCleanup implements ProjectDeletedListener {
private static final FluentLogger logger = FluentLogger.forEnclosingClass();
@@ -41,8 +42,8 @@
"Deleting project '%s'. Will perform a cleanup in Shared-Ref database.", projectName);
try {
- sharedDb.removeProject(projectName);
- } catch (IOException e) {
+ sharedDb.remove(new Project.NameKey(projectName));
+ } catch (GlobalRefDbSystemError e) {
validationMetrics.incrementSplitBrain();
logger.atSevere().withCause(e).log(
"Project '%s' deleted from GIT but it was not able to cleanup"
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/RefUpdateValidator.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/RefUpdateValidator.java
index 82d4ff0..a63c00b 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/RefUpdateValidator.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/RefUpdateValidator.java
@@ -14,10 +14,10 @@
package com.googlesource.gerrit.plugins.multisite.validation;
-import static com.googlesource.gerrit.plugins.multisite.validation.dfsrefdb.SharedRefDatabase.nullRef;
-
+import com.gerritforge.gerrit.globalrefdb.GlobalRefDbSystemError;
import com.google.common.base.MoreObjects;
import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.reviewdb.client.Project;
import com.google.inject.Inject;
import com.google.inject.assistedinject.Assisted;
import com.googlesource.gerrit.plugins.multisite.LockWrapper;
@@ -25,12 +25,12 @@
import com.googlesource.gerrit.plugins.multisite.validation.dfsrefdb.OutOfSyncException;
import com.googlesource.gerrit.plugins.multisite.validation.dfsrefdb.SharedDbSplitBrainException;
import com.googlesource.gerrit.plugins.multisite.validation.dfsrefdb.SharedLockException;
-import com.googlesource.gerrit.plugins.multisite.validation.dfsrefdb.SharedRefDatabase;
import com.googlesource.gerrit.plugins.multisite.validation.dfsrefdb.SharedRefEnforcement;
import com.googlesource.gerrit.plugins.multisite.validation.dfsrefdb.SharedRefEnforcement.EnforcePolicy;
import java.io.IOException;
import java.util.HashMap;
import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.ObjectIdRef;
import org.eclipse.jgit.lib.Ref;
import org.eclipse.jgit.lib.RefDatabase;
import org.eclipse.jgit.lib.RefUpdate;
@@ -144,8 +144,10 @@
projectName, refPair.getName(), refPair.putValue);
boolean succeeded;
try {
- succeeded = sharedRefDb.compareAndPut(projectName, refPair.compareRef, refPair.putValue);
- } catch (IOException e) {
+ succeeded =
+ sharedRefDb.compareAndPut(
+ new Project.NameKey(projectName), refPair.compareRef, refPair.putValue);
+ } catch (GlobalRefDbSystemError e) {
throw new SharedDbSplitBrainException(errorMessage, e);
}
@@ -166,14 +168,17 @@
String.format("%s-%s", projectName, refName),
() ->
lockWrapperFactory.create(
- projectName, refName, sharedRefDb.lockRef(projectName, refName)));
+ projectName,
+ refName,
+ sharedRefDb.lockRef(new Project.NameKey(projectName), refName)));
RefPair latestRefPair = getLatestLocalRef(refPair);
- if (sharedRefDb.isUpToDate(projectName, latestRefPair.compareRef)) {
+ if (sharedRefDb.isUpToDate(new Project.NameKey(projectName), latestRefPair.compareRef)) {
return latestRefPair;
}
- if (isNullRef(latestRefPair.compareRef) || sharedRefDb.exists(projectName, refName)) {
+ if (isNullRef(latestRefPair.compareRef)
+ || sharedRefDb.exists(new Project.NameKey(projectName), refName)) {
validationMetrics.incrementSplitBrainPrevention();
softFailBasedOnEnforcement(
@@ -193,6 +198,10 @@
latestRef == null ? nullRef(refPair.getName()) : latestRef, refPair.putValue);
}
+ private Ref nullRef(String name) {
+ return new ObjectIdRef.Unpeeled(Ref.Storage.NETWORK, name, ObjectId.zeroId());
+ }
+
protected boolean isSuccessful(RefUpdate.Result result) {
switch (result) {
case NEW:
@@ -219,7 +228,7 @@
}
protected Ref getCurrentRef(String refName) throws IOException {
- return MoreObjects.firstNonNull(refDb.getRef(refName), SharedRefDatabase.nullRef(refName));
+ return MoreObjects.firstNonNull(refDb.getRef(refName), nullRef(refName));
}
public static class CloseableSet<T extends AutoCloseable> implements AutoCloseable {
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/NoopSharedRefDatabase.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/NoopSharedRefDatabase.java
index e40688f..886eecf 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/NoopSharedRefDatabase.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/NoopSharedRefDatabase.java
@@ -14,30 +14,36 @@
package com.googlesource.gerrit.plugins.multisite.validation.dfsrefdb;
+import com.gerritforge.gerrit.globalrefdb.GlobalRefDatabase;
+import com.gerritforge.gerrit.globalrefdb.GlobalRefDbLockException;
+import com.gerritforge.gerrit.globalrefdb.GlobalRefDbSystemError;
+import com.google.gerrit.reviewdb.client.Project.NameKey;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.Ref;
-public class NoopSharedRefDatabase implements SharedRefDatabase {
- @Override
- public boolean isUpToDate(String project, Ref ref) {
- return true;
- }
+public class NoopSharedRefDatabase implements GlobalRefDatabase {
@Override
- public boolean compareAndPut(String project, Ref currRef, ObjectId newRefValue) {
- return true;
- }
-
- @Override
- public AutoCloseable lockRef(String project, String refName) {
- return () -> {};
- }
-
- @Override
- public boolean exists(String project, String refName) {
+ public boolean isUpToDate(NameKey project, Ref ref) throws GlobalRefDbLockException {
return false;
}
@Override
- public void removeProject(String project) {}
+ public boolean compareAndPut(NameKey project, Ref currRef, ObjectId newRefValue)
+ throws GlobalRefDbSystemError {
+ return false;
+ }
+
+ @Override
+ public AutoCloseable lockRef(NameKey project, String refName) throws GlobalRefDbLockException {
+ return () -> {};
+ }
+
+ @Override
+ public boolean exists(NameKey project, String refName) {
+ return false;
+ }
+
+ @Override
+ public void remove(NameKey project) throws GlobalRefDbSystemError {}
}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/SharedRefDatabase.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/SharedRefDatabase.java
deleted file mode 100644
index a93efcf..0000000
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/SharedRefDatabase.java
+++ /dev/null
@@ -1,145 +0,0 @@
-// Copyright (C) 2019 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.googlesource.gerrit.plugins.multisite.validation.dfsrefdb;
-
-import java.io.IOException;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.ObjectIdRef;
-import org.eclipse.jgit.lib.Ref;
-
-public interface SharedRefDatabase {
-
- /** A null ref that isn't associated to any name. */
- Ref NULL_REF = nullRef(null);
-
- /**
- * Create a new in-memory ref name associated with an NULL object id.
- *
- * @param refName ref name
- * @return the new NULL ref object
- */
- static Ref nullRef(String refName) {
- return new Ref() {
-
- @Override
- public String getName() {
- return refName;
- }
-
- @Override
- public boolean isSymbolic() {
- return false;
- }
-
- @Override
- public Ref getLeaf() {
- return null;
- }
-
- @Override
- public Ref getTarget() {
- return null;
- }
-
- @Override
- public ObjectId getObjectId() {
- return ObjectId.zeroId();
- }
-
- @Override
- public ObjectId getPeeledObjectId() {
- return ObjectId.zeroId();
- }
-
- @Override
- public boolean isPeeled() {
- return false;
- }
-
- @Override
- public Storage getStorage() {
- return Storage.NEW;
- }
- };
- }
-
- /**
- * Create a new in-memory Ref name associated with an objectId.
- *
- * @param refName ref name
- * @param objectId object id
- */
- static Ref newRef(String refName, ObjectId objectId) {
- return new ObjectIdRef.Unpeeled(Ref.Storage.NETWORK, refName, objectId);
- }
-
- /**
- * Verify in shared db if Ref is the most recent
- *
- * @param project project name of the ref
- * @param ref to be checked against shared-ref db
- * @return true if it is; false otherwise
- * @throws SharedLockException if there was a problem locking the resource
- */
- boolean isUpToDate(String project, Ref ref) throws SharedLockException;
-
- /**
- * Compare a reference, and put if it matches.
- *
- * <p>Two reference match if and only if they satisfy the following:
- *
- * <ul>
- * <li>If one reference is a symbolic ref, the other one should be a symbolic ref.
- * <li>If both are symbolic refs, the target names should be same.
- * <li>If both are object ID refs, the object IDs should be same.
- * </ul>
- *
- * @param project project name of the ref
- * @param currRef old value to compare to. If the reference is expected to not exist the old value
- * has a storage of {@link org.eclipse.jgit.lib.Ref.Storage#NEW} and an ObjectId value of
- * {@code null}.
- * @param newRefValue new reference to store.
- * @return true if the put was successful; false otherwise.
- * @throws java.io.IOException the reference cannot be put due to a system error.
- */
- boolean compareAndPut(String project, Ref currRef, ObjectId newRefValue) throws IOException;
-
- /**
- * Lock a reference for writing.
- *
- * @param project project name
- * @param refName ref to lock
- * @return lock object
- * @throws SharedLockException if the lock cannot be obtained
- */
- AutoCloseable lockRef(String project, String refName) throws SharedLockException;
-
- /**
- * Verify if the DB contains a value for the specific project and ref name
- *
- * @param project
- * @param refName
- * @return true if the ref exists on the project
- */
- boolean exists(String project, String refName);
-
- /**
- * Clean project path from SharedRefDatabase
- *
- * @param project project name
- * @throws IOException
- */
- void removeProject(String project) throws IOException;
-}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/zookeeper/ZkSharedRefDatabase.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/zookeeper/ZkSharedRefDatabase.java
index 1179045..1da1ceb 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/zookeeper/ZkSharedRefDatabase.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/zookeeper/ZkSharedRefDatabase.java
@@ -16,12 +16,13 @@
import static java.util.concurrent.TimeUnit.MILLISECONDS;
+import com.gerritforge.gerrit.globalrefdb.GlobalRefDatabase;
+import com.gerritforge.gerrit.globalrefdb.GlobalRefDbLockException;
+import com.gerritforge.gerrit.globalrefdb.GlobalRefDbSystemError;
import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.reviewdb.client.Project;
import com.google.inject.Inject;
import com.googlesource.gerrit.plugins.multisite.validation.ZkConnectionConfig;
-import com.googlesource.gerrit.plugins.multisite.validation.dfsrefdb.SharedLockException;
-import com.googlesource.gerrit.plugins.multisite.validation.dfsrefdb.SharedRefDatabase;
-import java.io.IOException;
import java.nio.charset.StandardCharsets;
import org.apache.curator.RetryPolicy;
import org.apache.curator.framework.CuratorFramework;
@@ -32,7 +33,7 @@
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.Ref;
-public class ZkSharedRefDatabase implements SharedRefDatabase {
+public class ZkSharedRefDatabase implements GlobalRefDatabase {
private static final FluentLogger logger = FluentLogger.forEnclosingClass();
private final CuratorFramework client;
@@ -48,7 +49,7 @@
}
@Override
- public boolean isUpToDate(String project, Ref ref) throws SharedLockException {
+ public boolean isUpToDate(Project.NameKey project, Ref ref) throws GlobalRefDbLockException {
if (!exists(project, ref.getName())) {
return true;
}
@@ -75,21 +76,22 @@
return isUpToDate;
} catch (Exception e) {
- throw new SharedLockException(project, ref.getName(), e);
+ throw new GlobalRefDbLockException(project.get(), ref.getName(), e);
}
}
@Override
- public void removeProject(String project) throws IOException {
+ public void remove(Project.NameKey project) throws GlobalRefDbSystemError {
try {
client.delete().deletingChildrenIfNeeded().forPath("/" + project);
} catch (Exception e) {
- throw new IOException(String.format("Not able to delete project '%s'", project), e);
+ throw new GlobalRefDbSystemError(
+ String.format("Not able to delete project '%s'", project), e);
}
}
@Override
- public boolean exists(String project, String refName) throws ZookeeperRuntimeException {
+ public boolean exists(Project.NameKey project, String refName) throws GlobalRefDbSystemError {
try {
return client.checkExists().forPath(pathFor(project, refName)) != null;
} catch (Exception e) {
@@ -98,25 +100,26 @@
}
@Override
- public Locker lockRef(String project, String refName) throws SharedLockException {
+ public Locker lockRef(Project.NameKey project, String refName) throws GlobalRefDbLockException {
InterProcessMutex refPathMutex =
new InterProcessMutex(client, "/locks" + pathFor(project, refName));
try {
return new Locker(refPathMutex, transactionLockTimeOut, MILLISECONDS);
} catch (Exception e) {
- throw new SharedLockException(project, refName, e);
+ throw new GlobalRefDbLockException(project.get(), refName, e);
}
}
@Override
- public boolean compareAndPut(String projectName, Ref oldRef, ObjectId newRefValue)
- throws IOException {
+ public boolean compareAndPut(Project.NameKey projectName, Ref oldRef, ObjectId newRefValue)
+ throws GlobalRefDbSystemError {
final DistributedAtomicValue distributedRefValue =
new DistributedAtomicValue(client, pathFor(projectName, oldRef), retryPolicy);
try {
- if (oldRef == NULL_REF) {
+ if ((oldRef.getObjectId() == null || oldRef.getObjectId().equals(ObjectId.zeroId()))
+ && !distributedRefValue.get().succeeded()) {
return distributedRefValue.initialize(writeObjectId(newRefValue));
}
final ObjectId newValue = newRefValue == null ? ObjectId.zeroId() : newRefValue;
@@ -132,20 +135,20 @@
} catch (Exception e) {
logger.atWarning().withCause(e).log(
"Error trying to perform CAS at path %s", pathFor(projectName, oldRef));
- throw new IOException(
+ throw new GlobalRefDbSystemError(
String.format("Error trying to perform CAS at path %s", pathFor(projectName, oldRef)), e);
}
}
- private boolean refNotInZk(String projectName, Ref oldRef) throws Exception {
+ private boolean refNotInZk(Project.NameKey projectName, Ref oldRef) throws Exception {
return client.checkExists().forPath(pathFor(projectName, oldRef)) == null;
}
- static String pathFor(String projectName, Ref oldRef) {
+ static String pathFor(Project.NameKey projectName, Ref oldRef) {
return pathFor(projectName, oldRef.getName());
}
- static String pathFor(String projectName, String refName) {
+ static String pathFor(Project.NameKey projectName, String refName) {
return "/" + projectName + "/" + refName;
}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/zookeeper/ZkValidationModule.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/zookeeper/ZkValidationModule.java
index 60b148d..f0bdbdb 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/zookeeper/ZkValidationModule.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/zookeeper/ZkValidationModule.java
@@ -14,13 +14,13 @@
package com.googlesource.gerrit.plugins.multisite.validation.dfsrefdb.zookeeper;
+import com.gerritforge.gerrit.globalrefdb.GlobalRefDatabase;
import com.google.gerrit.extensions.registration.DynamicItem;
import com.google.inject.AbstractModule;
import com.google.inject.Inject;
import com.google.inject.Scopes;
import com.googlesource.gerrit.plugins.multisite.ZookeeperConfig;
import com.googlesource.gerrit.plugins.multisite.validation.ZkConnectionConfig;
-import com.googlesource.gerrit.plugins.multisite.validation.dfsrefdb.SharedRefDatabase;
import org.apache.curator.framework.CuratorFramework;
public class ZkValidationModule extends AbstractModule {
@@ -34,7 +34,7 @@
@Override
protected void configure() {
- DynamicItem.bind(binder(), SharedRefDatabase.class)
+ DynamicItem.bind(binder(), GlobalRefDatabase.class)
.to(ZkSharedRefDatabase.class)
.in(Scopes.SINGLETON);
bind(CuratorFramework.class).toInstance(cfg.buildCurator());
diff --git a/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/BatchRefUpdateValidatorTest.java b/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/BatchRefUpdateValidatorTest.java
index 5c18e4f..f5f532f 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/BatchRefUpdateValidatorTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/BatchRefUpdateValidatorTest.java
@@ -18,11 +18,12 @@
import static junit.framework.TestCase.assertFalse;
import static org.eclipse.jgit.transport.ReceiveCommand.Type.UPDATE;
+import com.gerritforge.gerrit.globalrefdb.GlobalRefDatabase;
import com.google.gerrit.extensions.registration.DynamicItem;
import com.google.gerrit.metrics.DisabledMetricMaker;
+import com.google.gerrit.reviewdb.client.Project;
import com.googlesource.gerrit.plugins.multisite.SharedRefDatabaseWrapper;
import com.googlesource.gerrit.plugins.multisite.validation.dfsrefdb.DefaultSharedRefEnforcement;
-import com.googlesource.gerrit.plugins.multisite.validation.dfsrefdb.SharedRefDatabase;
import com.googlesource.gerrit.plugins.multisite.validation.dfsrefdb.SharedRefEnforcement;
import com.googlesource.gerrit.plugins.multisite.validation.dfsrefdb.zookeeper.RefFixture;
import com.googlesource.gerrit.plugins.multisite.validation.dfsrefdb.zookeeper.ZkSharedRefDatabase;
@@ -83,7 +84,7 @@
zkSharedRefDatabase =
new SharedRefDatabaseWrapper(
DynamicItem.itemOf(
- SharedRefDatabase.class,
+ GlobalRefDatabase.class,
new ZkSharedRefDatabase(
zookeeperContainer.getCurator(),
new ZkConnectionConfig(
@@ -104,13 +105,14 @@
BatchRefUpdateValidator.executeBatchUpdateWithValidation(
batchRefUpdate, () -> execute(batchRefUpdate));
- assertFalse(zkSharedRefDatabase.exists(A_TEST_PROJECT_NAME, AN_IMMUTABLE_REF));
+ assertFalse(zkSharedRefDatabase.exists(A_TEST_PROJECT_NAME_KEY, AN_IMMUTABLE_REF));
}
@Test
public void compareAndPutShouldSucceedIfTheObjectionHasNotTheExpectedValueWithDesiredEnforcement()
throws Exception {
String projectName = "All-Users";
+ Project.NameKey projectNameKey = new Project.NameKey("All-Users");
String externalIds = "refs/meta/external-ids";
List<ReceiveCommand> cmds = Arrays.asList(new ReceiveCommand(A, B, externalIds, UPDATE));
@@ -118,13 +120,13 @@
BatchRefUpdate batchRefUpdate = newBatchUpdate(cmds);
BatchRefUpdateValidator batchRefUpdateValidator = newDefaultValidator(projectName);
- Ref zkExistingRef = SharedRefDatabase.newRef(externalIds, B.getId());
- zookeeperContainer.createRefInZk(projectName, zkExistingRef);
+ Ref zkExistingRef = newRef(externalIds, B.getId());
+ zookeeperContainer.createRefInZk(projectNameKey, zkExistingRef);
batchRefUpdateValidator.executeBatchUpdateWithValidation(
batchRefUpdate, () -> execute(batchRefUpdate));
- assertThat(zookeeperContainer.readRefValueFromZk(projectName, zkExistingRef)).isEqualTo(B);
+ assertThat(zookeeperContainer.readRefValueFromZk(projectNameKey, zkExistingRef)).isEqualTo(B);
}
@Test
@@ -138,7 +140,7 @@
BatchRefUpdateValidator.executeBatchUpdateWithValidation(
batchRefUpdate, () -> execute(batchRefUpdate));
- assertFalse(zkSharedRefDatabase.exists(A_TEST_PROJECT_NAME, DRAFT_COMMENT));
+ assertFalse(zkSharedRefDatabase.exists(A_TEST_PROJECT_NAME_KEY, DRAFT_COMMENT));
}
private BatchRefUpdateValidator newDefaultValidator(String projectName) {
diff --git a/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/MultiSiteBatchRefUpdateTest.java b/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/MultiSiteBatchRefUpdateTest.java
index 730e558..e89e50e 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/MultiSiteBatchRefUpdateTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/MultiSiteBatchRefUpdateTest.java
@@ -110,13 +110,13 @@
setMockRequiredReturnValues();
// When compareAndPut against sharedDb succeeds
- doReturn(true).when(sharedRefDb).isUpToDate(A_TEST_PROJECT_NAME, oldRef);
+ doReturn(true).when(sharedRefDb).isUpToDate(A_TEST_PROJECT_NAME_KEY, oldRef);
doReturn(true)
.when(sharedRefDb)
- .compareAndPut(eq(A_TEST_PROJECT_NAME), refEquals(oldRef), eq(newRef.getObjectId()));
+ .compareAndPut(eq(A_TEST_PROJECT_NAME_KEY), refEquals(oldRef), eq(newRef.getObjectId()));
multiSiteRefUpdate.execute(revWalk, progressMonitor, Collections.emptyList());
verify(sharedRefDb)
- .compareAndPut(eq(A_TEST_PROJECT_NAME), refEquals(oldRef), eq(newRef.getObjectId()));
+ .compareAndPut(eq(A_TEST_PROJECT_NAME_KEY), refEquals(oldRef), eq(newRef.getObjectId()));
}
private Ref refEquals(Ref oldRef) {
@@ -126,8 +126,8 @@
@Test
public void executeAndFailsWithExceptions() throws IOException {
setMockRequiredReturnValues();
- doReturn(true).when(sharedRefDb).exists(A_TEST_PROJECT_NAME, A_TEST_REF_NAME);
- doReturn(false).when(sharedRefDb).isUpToDate(A_TEST_PROJECT_NAME, oldRef);
+ doReturn(true).when(sharedRefDb).exists(A_TEST_PROJECT_NAME_KEY, A_TEST_REF_NAME);
+ doReturn(false).when(sharedRefDb).isUpToDate(A_TEST_PROJECT_NAME_KEY, oldRef);
try {
multiSiteRefUpdate.execute(revWalk, progressMonitor, Collections.emptyList());
fail("Expecting an IOException to be thrown");
diff --git a/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/MultiSiteRefUpdateTest.java b/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/MultiSiteRefUpdateTest.java
index a9d8e76..433a462 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/MultiSiteRefUpdateTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/MultiSiteRefUpdateTest.java
@@ -65,10 +65,10 @@
@Test
public void newUpdateShouldValidateAndSucceed() throws Exception {
- doReturn(true).when(sharedRefDb).isUpToDate(A_TEST_PROJECT_NAME, oldRef);
+ doReturn(true).when(sharedRefDb).isUpToDate(A_TEST_PROJECT_NAME_KEY, oldRef);
doReturn(true)
.when(sharedRefDb)
- .compareAndPut(A_TEST_PROJECT_NAME, oldRef, newRef.getObjectId());
+ .compareAndPut(A_TEST_PROJECT_NAME_KEY, oldRef, newRef.getObjectId());
RefUpdate refUpdate = RefUpdateStub.forSuccessfulUpdate(oldRef, newRef.getObjectId());
@@ -82,7 +82,7 @@
@Test(expected = Exception.class)
public void newUpdateShouldValidateAndFailWithIOException() throws Exception {
- doReturn(false).when(sharedRefDb).isUpToDate(A_TEST_PROJECT_NAME, oldRef);
+ doReturn(false).when(sharedRefDb).isUpToDate(A_TEST_PROJECT_NAME_KEY, oldRef);
RefUpdate refUpdate = RefUpdateStub.forSuccessfulUpdate(oldRef, newRef.getObjectId());
@@ -94,7 +94,7 @@
@Test
public void newUpdateShouldIncreaseRefUpdateFailureCountWhenFailing() throws IOException {
- doReturn(false).when(sharedRefDb).isUpToDate(A_TEST_PROJECT_NAME, oldRef);
+ doReturn(false).when(sharedRefDb).isUpToDate(A_TEST_PROJECT_NAME_KEY, oldRef);
RefUpdate refUpdate = RefUpdateStub.forSuccessfulUpdate(oldRef, newRef.getObjectId());
@@ -113,10 +113,10 @@
public void newUpdateShouldNotIncreaseSplitBrainPreventedCounterIfFailingSharedDbPostUpdate()
throws IOException {
- doReturn(true).when(sharedRefDb).isUpToDate(A_TEST_PROJECT_NAME, oldRef);
+ doReturn(true).when(sharedRefDb).isUpToDate(A_TEST_PROJECT_NAME_KEY, oldRef);
doReturn(false)
.when(sharedRefDb)
- .compareAndPut(A_TEST_PROJECT_NAME, oldRef, newRef.getObjectId());
+ .compareAndPut(A_TEST_PROJECT_NAME_KEY, oldRef, newRef.getObjectId());
RefUpdate refUpdate = RefUpdateStub.forSuccessfulUpdate(oldRef, newRef.getObjectId());
@@ -135,10 +135,10 @@
public void newUpdateShouldtIncreaseSplitBrainCounterIfFailingSharedDbPostUpdate()
throws IOException {
- doReturn(true).when(sharedRefDb).isUpToDate(A_TEST_PROJECT_NAME, oldRef);
+ doReturn(true).when(sharedRefDb).isUpToDate(A_TEST_PROJECT_NAME_KEY, oldRef);
doReturn(false)
.when(sharedRefDb)
- .compareAndPut(A_TEST_PROJECT_NAME, oldRef, newRef.getObjectId());
+ .compareAndPut(A_TEST_PROJECT_NAME_KEY, oldRef, newRef.getObjectId());
RefUpdate refUpdate = RefUpdateStub.forSuccessfulUpdate(oldRef, newRef.getObjectId());
@@ -155,9 +155,11 @@
@Test
public void deleteShouldValidateAndSucceed() throws IOException {
- doReturn(true).when(sharedRefDb).isUpToDate(A_TEST_PROJECT_NAME, oldRef);
+ doReturn(true).when(sharedRefDb).isUpToDate(A_TEST_PROJECT_NAME_KEY, oldRef);
- doReturn(true).when(sharedRefDb).compareAndPut(A_TEST_PROJECT_NAME, oldRef, ObjectId.zeroId());
+ doReturn(true)
+ .when(sharedRefDb)
+ .compareAndPut(A_TEST_PROJECT_NAME_KEY, oldRef, ObjectId.zeroId());
RefUpdate refUpdate = RefUpdateStub.forSuccessfulDelete(oldRef);
@@ -171,7 +173,7 @@
@Test
public void deleteShouldIncreaseRefUpdateFailureCountWhenFailing() throws IOException {
- doReturn(false).when(sharedRefDb).isUpToDate(A_TEST_PROJECT_NAME, oldRef);
+ doReturn(false).when(sharedRefDb).isUpToDate(A_TEST_PROJECT_NAME_KEY, oldRef);
RefUpdate refUpdate = RefUpdateStub.forSuccessfulDelete(oldRef);
diff --git a/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/RefUpdateValidatorTest.java b/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/RefUpdateValidatorTest.java
index f0677b8..db4138a 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/RefUpdateValidatorTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/RefUpdateValidatorTest.java
@@ -16,20 +16,18 @@
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.lenient;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
+import com.google.gerrit.reviewdb.client.Project;
import com.googlesource.gerrit.plugins.multisite.SharedRefDatabaseWrapper;
import com.googlesource.gerrit.plugins.multisite.validation.dfsrefdb.DefaultSharedRefEnforcement;
import com.googlesource.gerrit.plugins.multisite.validation.dfsrefdb.OutOfSyncException;
import com.googlesource.gerrit.plugins.multisite.validation.dfsrefdb.SharedDbSplitBrainException;
-import com.googlesource.gerrit.plugins.multisite.validation.dfsrefdb.SharedRefDatabase;
import com.googlesource.gerrit.plugins.multisite.validation.dfsrefdb.zookeeper.RefFixture;
import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.ObjectIdRef;
import org.eclipse.jgit.lib.Ref;
import org.eclipse.jgit.lib.RefDatabase;
import org.eclipse.jgit.lib.RefUpdate;
@@ -86,15 +84,18 @@
@Test
public void validationShouldSucceedWhenLocalRefDbIsUpToDate() throws Exception {
- lenient().doReturn(false).when(sharedRefDb).isUpToDate(anyString(), any(Ref.class));
- doReturn(true).when(sharedRefDb).isUpToDate(A_TEST_PROJECT_NAME, localRef);
lenient()
.doReturn(false)
.when(sharedRefDb)
- .compareAndPut(anyString(), any(Ref.class), any(ObjectId.class));
+ .isUpToDate(any(Project.NameKey.class), any(Ref.class));
+ doReturn(true).when(sharedRefDb).isUpToDate(A_TEST_PROJECT_NAME_KEY, localRef);
+ lenient()
+ .doReturn(false)
+ .when(sharedRefDb)
+ .compareAndPut(any(Project.NameKey.class), any(Ref.class), any(ObjectId.class));
doReturn(true)
.when(sharedRefDb)
- .compareAndPut(A_TEST_PROJECT_NAME, localRef, newUpdateRef.getObjectId());
+ .compareAndPut(A_TEST_PROJECT_NAME_KEY, localRef, newUpdateRef.getObjectId());
Result result = refUpdateValidator.executeRefUpdate(refUpdate, () -> RefUpdate.Result.NEW);
@@ -104,14 +105,14 @@
@Test
public void sharedRefDbShouldBeUpdatedWithRefDeleted() throws Exception {
doReturn(ObjectId.zeroId()).when(refUpdate).getNewObjectId();
- doReturn(true).when(sharedRefDb).isUpToDate(anyString(), any(Ref.class));
+ doReturn(true).when(sharedRefDb).isUpToDate(any(Project.NameKey.class), any(Ref.class));
lenient()
.doReturn(false)
.when(sharedRefDb)
- .compareAndPut(anyString(), any(Ref.class), any(ObjectId.class));
+ .compareAndPut(any(Project.NameKey.class), any(Ref.class), any(ObjectId.class));
doReturn(true)
.when(sharedRefDb)
- .compareAndPut(A_TEST_PROJECT_NAME, localRef, ObjectId.zeroId());
+ .compareAndPut(A_TEST_PROJECT_NAME_KEY, localRef, ObjectId.zeroId());
doReturn(localRef).doReturn(null).when(localRefDb).getRef(refName);
Result result = refUpdateValidator.executeRefUpdate(refUpdate, () -> RefUpdate.Result.FORCED);
@@ -121,16 +122,16 @@
@Test
public void sharedRefDbShouldBeUpdatedWithNewRefCreated() throws Exception {
- Ref localNullRef = SharedRefDatabase.nullRef(refName);
+ Ref localNullRef = nullRef(refName);
- doReturn(true).when(sharedRefDb).isUpToDate(anyString(), any(Ref.class));
+ doReturn(true).when(sharedRefDb).isUpToDate(any(Project.NameKey.class), any(Ref.class));
lenient()
.doReturn(false)
.when(sharedRefDb)
- .compareAndPut(anyString(), any(Ref.class), any(ObjectId.class));
+ .compareAndPut(any(Project.NameKey.class), any(Ref.class), any(ObjectId.class));
doReturn(true)
.when(sharedRefDb)
- .compareAndPut(A_TEST_PROJECT_NAME, localNullRef, newUpdateRef.getObjectId());
+ .compareAndPut(A_TEST_PROJECT_NAME_KEY, localNullRef, newUpdateRef.getObjectId());
doReturn(localNullRef).doReturn(newUpdateRef).when(localRefDb).getRef(refName);
Result result = refUpdateValidator.executeRefUpdate(refUpdate, () -> RefUpdate.Result.NEW);
@@ -140,9 +141,12 @@
@Test(expected = OutOfSyncException.class)
public void validationShouldFailWhenLocalRefDbIsNotUpToDate() throws Exception {
- lenient().doReturn(true).when(sharedRefDb).isUpToDate(anyString(), any(Ref.class));
- doReturn(true).when(sharedRefDb).exists(A_TEST_PROJECT_NAME, refName);
- doReturn(false).when(sharedRefDb).isUpToDate(A_TEST_PROJECT_NAME, localRef);
+ lenient()
+ .doReturn(true)
+ .when(sharedRefDb)
+ .isUpToDate(any(Project.NameKey.class), any(Ref.class));
+ doReturn(true).when(sharedRefDb).exists(A_TEST_PROJECT_NAME_KEY, refName);
+ doReturn(false).when(sharedRefDb).isUpToDate(A_TEST_PROJECT_NAME_KEY, localRef);
refUpdateValidator.executeRefUpdate(refUpdate, () -> RefUpdate.Result.NEW);
}
@@ -150,32 +154,35 @@
@Test(expected = SharedDbSplitBrainException.class)
public void shouldTrowSplitBrainWhenLocalRefDbIsUpToDateButFinalCompareAndPutIsFailing()
throws Exception {
- lenient().doReturn(false).when(sharedRefDb).isUpToDate(anyString(), any(Ref.class));
- doReturn(true).when(sharedRefDb).isUpToDate(A_TEST_PROJECT_NAME, localRef);
+ lenient()
+ .doReturn(false)
+ .when(sharedRefDb)
+ .isUpToDate(any(Project.NameKey.class), any(Ref.class));
+ doReturn(true).when(sharedRefDb).isUpToDate(A_TEST_PROJECT_NAME_KEY, localRef);
lenient()
.doReturn(true)
.when(sharedRefDb)
- .compareAndPut(anyString(), any(Ref.class), any(ObjectId.class));
+ .compareAndPut(any(Project.NameKey.class), any(Ref.class), any(ObjectId.class));
doReturn(false)
.when(sharedRefDb)
- .compareAndPut(A_TEST_PROJECT_NAME, localRef, newUpdateRef.getObjectId());
+ .compareAndPut(A_TEST_PROJECT_NAME_KEY, localRef, newUpdateRef.getObjectId());
refUpdateValidator.executeRefUpdate(refUpdate, () -> RefUpdate.Result.NEW);
}
@Test
public void shouldNotUpdateSharedRefDbWhenFinalCompareAndPutIsFailing() throws Exception {
- lenient().doReturn(false).when(sharedRefDb).isUpToDate(anyString(), any(Ref.class));
- doReturn(true).when(sharedRefDb).isUpToDate(A_TEST_PROJECT_NAME, localRef);
+ lenient()
+ .doReturn(false)
+ .when(sharedRefDb)
+ .isUpToDate(any(Project.NameKey.class), any(Ref.class));
+ doReturn(true).when(sharedRefDb).isUpToDate(A_TEST_PROJECT_NAME_KEY, localRef);
Result result =
refUpdateValidator.executeRefUpdate(refUpdate, () -> RefUpdate.Result.LOCK_FAILURE);
- verify(sharedRefDb, never()).compareAndPut(anyString(), any(Ref.class), any(ObjectId.class));
+ verify(sharedRefDb, never())
+ .compareAndPut(any(Project.NameKey.class), any(Ref.class), any(ObjectId.class));
assertThat(result).isEqualTo(RefUpdate.Result.LOCK_FAILURE);
}
-
- private Ref newRef(String refName, ObjectId objectId) {
- return new ObjectIdRef.Unpeeled(Ref.Storage.NETWORK, refName, objectId);
- }
}
diff --git a/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/MultisiteReplicationPushFilterTest.java b/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/MultisiteReplicationPushFilterTest.java
index caf0d69..526f5ab 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/MultisiteReplicationPushFilterTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/MultisiteReplicationPushFilterTest.java
@@ -19,7 +19,12 @@
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doReturn;
+import com.gerritforge.gerrit.globalrefdb.GlobalRefDatabase;
+import com.gerritforge.gerrit.globalrefdb.GlobalRefDbLockException;
+import com.gerritforge.gerrit.globalrefdb.GlobalRefDbSystemError;
import com.google.gerrit.extensions.registration.DynamicItem;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.Project.NameKey;
import com.googlesource.gerrit.plugins.multisite.SharedRefDatabaseWrapper;
import com.googlesource.gerrit.plugins.multisite.validation.DisabledSharedRefLogger;
import com.googlesource.gerrit.plugins.multisite.validation.MultisiteReplicationPushFilter;
@@ -43,12 +48,13 @@
@Mock SharedRefDatabaseWrapper sharedRefDatabaseMock;
String project = "fooProject";
+ NameKey projectName = new Project.NameKey(project);
@Test
public void shouldReturnAllRefUpdatesWhenAllUpToDate() throws Exception {
List<RemoteRefUpdate> refUpdates =
Arrays.asList(refUpdate("refs/heads/foo"), refUpdate("refs/heads/bar"));
- doReturn(true).when(sharedRefDatabaseMock).isUpToDate(eq(project), any());
+ doReturn(true).when(sharedRefDatabaseMock).isUpToDate(eq(projectName), any());
MultisiteReplicationPushFilter pushFilter =
new MultisiteReplicationPushFilter(sharedRefDatabaseMock);
@@ -92,35 +98,37 @@
Set<String> rejectedSet = new HashSet<>();
rejectedSet.addAll(Arrays.asList(rejectedRefs));
- SharedRefDatabase sharedRefDatabase =
- new SharedRefDatabase() {
+ GlobalRefDatabase sharedRefDatabase =
+ new GlobalRefDatabase() {
@Override
- public void removeProject(String project) throws IOException {}
-
- @Override
- public AutoCloseable lockRef(String project, String refName) throws SharedLockException {
- return null;
- }
-
- @Override
- public boolean isUpToDate(String project, Ref ref) throws SharedLockException {
+ public boolean isUpToDate(Project.NameKey project, Ref ref)
+ throws GlobalRefDbLockException {
return !rejectedSet.contains(ref.getName());
}
@Override
- public boolean exists(String project, String refName) {
+ public boolean exists(Project.NameKey project, String refName) {
return true;
}
@Override
- public boolean compareAndPut(String project, Ref currRef, ObjectId newRefValue)
- throws IOException {
+ public boolean compareAndPut(NameKey project, Ref currRef, ObjectId newRefValue)
+ throws GlobalRefDbSystemError {
return false;
}
+
+ @Override
+ public AutoCloseable lockRef(NameKey project, String refName)
+ throws GlobalRefDbLockException {
+ return null;
+ }
+
+ @Override
+ public void remove(NameKey project) throws GlobalRefDbSystemError {}
};
return new SharedRefDatabaseWrapper(
- DynamicItem.itemOf(SharedRefDatabase.class, sharedRefDatabase),
+ DynamicItem.itemOf(GlobalRefDatabase.class, sharedRefDatabase),
new DisabledSharedRefLogger());
}
diff --git a/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/RefSharedDatabaseTest.java b/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/RefSharedDatabaseTest.java
index 57ab5e0..0867010 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/RefSharedDatabaseTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/RefSharedDatabaseTest.java
@@ -18,6 +18,7 @@
import com.googlesource.gerrit.plugins.multisite.validation.dfsrefdb.zookeeper.RefFixture;
import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.ObjectIdRef;
import org.eclipse.jgit.lib.Ref;
import org.eclipse.jgit.lib.Ref.Storage;
import org.junit.Rule;
@@ -38,7 +39,7 @@
ObjectId objectId = AN_OBJECT_ID_1;
String refName = aBranchRef();
- Ref aNewRef = SharedRefDatabase.newRef(refName, objectId);
+ Ref aNewRef = new ObjectIdRef.Unpeeled(Ref.Storage.NETWORK, refName, objectId);
assertThat(aNewRef.getName()).isEqualTo(refName);
assertThat(aNewRef.getObjectId()).isEqualTo(objectId);
diff --git a/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/zookeeper/CustomSharedRefEnforcementByProjectTest.java b/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/zookeeper/CustomSharedRefEnforcementByProjectTest.java
index d63436c..16ac0a7 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/zookeeper/CustomSharedRefEnforcementByProjectTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/zookeeper/CustomSharedRefEnforcementByProjectTest.java
@@ -15,7 +15,6 @@
package com.googlesource.gerrit.plugins.multisite.validation.dfsrefdb.zookeeper;
import static com.google.common.truth.Truth.assertThat;
-import static com.googlesource.gerrit.plugins.multisite.validation.dfsrefdb.SharedRefDatabase.newRef;
import com.googlesource.gerrit.plugins.multisite.Configuration;
import com.googlesource.gerrit.plugins.multisite.Configuration.SharedRefDatabase;
diff --git a/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/zookeeper/DefaultSharedRefEnforcementTest.java b/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/zookeeper/DefaultSharedRefEnforcementTest.java
index 83fcf52..35072ff 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/zookeeper/DefaultSharedRefEnforcementTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/zookeeper/DefaultSharedRefEnforcementTest.java
@@ -15,7 +15,6 @@
package com.googlesource.gerrit.plugins.multisite.validation.dfsrefdb.zookeeper;
import static com.google.common.truth.Truth.assertThat;
-import static com.googlesource.gerrit.plugins.multisite.validation.dfsrefdb.SharedRefDatabase.newRef;
import com.googlesource.gerrit.plugins.multisite.validation.dfsrefdb.DefaultSharedRefEnforcement;
import com.googlesource.gerrit.plugins.multisite.validation.dfsrefdb.SharedRefEnforcement;
diff --git a/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/zookeeper/RefFixture.java b/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/zookeeper/RefFixture.java
index 72ea236..609c940 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/zookeeper/RefFixture.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/zookeeper/RefFixture.java
@@ -17,6 +17,8 @@
import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.reviewdb.client.RefNames;
import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.ObjectIdRef;
+import org.eclipse.jgit.lib.Ref;
import org.junit.Ignore;
@Ignore
@@ -41,4 +43,12 @@
default String testBranch() {
return "aTestBranch";
}
+
+ default Ref newRef(String refName, ObjectId objectId) {
+ return new ObjectIdRef.Unpeeled(Ref.Storage.NETWORK, refName, objectId);
+ }
+
+ default Ref nullRef(String refName) {
+ return newRef(refName, ObjectId.zeroId());
+ }
}
diff --git a/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/zookeeper/ZkSharedRefDatabaseIT.java b/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/zookeeper/ZkSharedRefDatabaseIT.java
index e2bdfbc..5ca214a 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/zookeeper/ZkSharedRefDatabaseIT.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/zookeeper/ZkSharedRefDatabaseIT.java
@@ -18,6 +18,7 @@
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
+import com.gerritforge.gerrit.globalrefdb.GlobalRefDatabase;
import com.google.gerrit.acceptance.AbstractDaemonTest;
import com.google.gerrit.extensions.registration.DynamicItem;
import com.google.gerrit.metrics.DisabledMetricMaker;
@@ -29,7 +30,6 @@
import com.googlesource.gerrit.plugins.multisite.validation.ValidationMetrics;
import com.googlesource.gerrit.plugins.multisite.validation.ZkConnectionConfig;
import com.googlesource.gerrit.plugins.multisite.validation.dfsrefdb.DefaultSharedRefEnforcement;
-import com.googlesource.gerrit.plugins.multisite.validation.dfsrefdb.SharedRefDatabase;
import com.googlesource.gerrit.plugins.multisite.validation.dfsrefdb.SharedRefEnforcement;
import org.apache.curator.retry.RetryNTimes;
import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
@@ -65,7 +65,7 @@
zkSharedRefDatabase =
new SharedRefDatabaseWrapper(
DynamicItem.itemOf(
- SharedRefDatabase.class,
+ GlobalRefDatabase.class,
new ZkSharedRefDatabase(
zookeeperContainer.getCurator(),
new ZkConnectionConfig(
@@ -174,7 +174,7 @@
}
private boolean existsDataInZkForCommand(ReceiveCommand firstCommand) throws Exception {
- return zkSharedRefDatabase.exists(A_TEST_PROJECT_NAME, firstCommand.getRefName());
+ return zkSharedRefDatabase.exists(A_TEST_PROJECT_NAME_KEY, firstCommand.getRefName());
}
private MultiSiteBatchRefUpdate newBatchRefUpdate(
diff --git a/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/zookeeper/ZkSharedRefDatabaseTest.java b/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/zookeeper/ZkSharedRefDatabaseTest.java
index bff41f1..18087e6 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/zookeeper/ZkSharedRefDatabaseTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/zookeeper/ZkSharedRefDatabaseTest.java
@@ -17,16 +17,17 @@
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.mock;
+import com.gerritforge.gerrit.globalrefdb.GlobalRefDatabase;
import com.google.gerrit.extensions.api.changes.NotifyHandling;
import com.google.gerrit.extensions.events.ProjectDeletedListener;
import com.google.gerrit.extensions.registration.DynamicItem;
+import com.google.gerrit.reviewdb.client.Project.NameKey;
import com.googlesource.gerrit.plugins.multisite.SharedRefDatabaseWrapper;
import com.googlesource.gerrit.plugins.multisite.validation.DisabledSharedRefLogger;
import com.googlesource.gerrit.plugins.multisite.validation.ProjectDeletedSharedDbCleanup;
import com.googlesource.gerrit.plugins.multisite.validation.ValidationMetrics;
import com.googlesource.gerrit.plugins.multisite.validation.ZkConnectionConfig;
import com.googlesource.gerrit.plugins.multisite.validation.dfsrefdb.DefaultSharedRefEnforcement;
-import com.googlesource.gerrit.plugins.multisite.validation.dfsrefdb.SharedRefDatabase;
import com.googlesource.gerrit.plugins.multisite.validation.dfsrefdb.SharedRefEnforcement;
import org.apache.curator.retry.RetryNTimes;
import org.eclipse.jgit.lib.ObjectId;
@@ -57,7 +58,7 @@
zkSharedRefDatabase =
new SharedRefDatabaseWrapper(
DynamicItem.itemOf(
- SharedRefDatabase.class,
+ GlobalRefDatabase.class,
new ZkSharedRefDatabase(
zookeeperContainer.getCurator(),
new ZkConnectionConfig(
@@ -77,11 +78,11 @@
public void shouldCompareAndPutSuccessfully() throws Exception {
Ref oldRef = refOf(AN_OBJECT_ID_1);
Ref newRef = refOf(AN_OBJECT_ID_2);
- String projectName = A_TEST_PROJECT_NAME;
+ NameKey projectNameKey = A_TEST_PROJECT_NAME_KEY;
- zookeeperContainer.createRefInZk(projectName, oldRef);
+ zookeeperContainer.createRefInZk(projectNameKey, oldRef);
- assertThat(zkSharedRefDatabase.compareAndPut(projectName, oldRef, newRef.getObjectId()))
+ assertThat(zkSharedRefDatabase.compareAndPut(projectNameKey, oldRef, newRef.getObjectId()))
.isTrue();
}
@@ -89,59 +90,55 @@
public void shouldFetchLatestObjectIdInZk() throws Exception {
Ref oldRef = refOf(AN_OBJECT_ID_1);
Ref newRef = refOf(AN_OBJECT_ID_2);
- String projectName = A_TEST_PROJECT_NAME;
+ NameKey projectNameKey = A_TEST_PROJECT_NAME_KEY;
- zookeeperContainer.createRefInZk(projectName, oldRef);
+ zookeeperContainer.createRefInZk(projectNameKey, oldRef);
- assertThat(zkSharedRefDatabase.compareAndPut(projectName, oldRef, newRef.getObjectId()))
+ assertThat(zkSharedRefDatabase.compareAndPut(projectNameKey, oldRef, newRef.getObjectId()))
.isTrue();
- assertThat(zkSharedRefDatabase.isUpToDate(projectName, newRef)).isTrue();
- assertThat(zkSharedRefDatabase.isUpToDate(projectName, oldRef)).isFalse();
+ assertThat(zkSharedRefDatabase.isUpToDate(projectNameKey, newRef)).isTrue();
+ assertThat(zkSharedRefDatabase.isUpToDate(projectNameKey, oldRef)).isFalse();
}
@Test
public void shouldCompareAndPutWithNullOldRefSuccessfully() throws Exception {
Ref oldRef = refOf(null);
Ref newRef = refOf(AN_OBJECT_ID_2);
- String projectName = A_TEST_PROJECT_NAME;
+ NameKey projectNameKey = A_TEST_PROJECT_NAME_KEY;
- zookeeperContainer.createRefInZk(projectName, oldRef);
+ zookeeperContainer.createRefInZk(projectNameKey, oldRef);
- assertThat(zkSharedRefDatabase.compareAndPut(projectName, oldRef, newRef.getObjectId()))
+ assertThat(zkSharedRefDatabase.compareAndPut(projectNameKey, oldRef, newRef.getObjectId()))
.isTrue();
}
@Test
public void compareAndPutShouldFailIfTheObjectionHasNotTheExpectedValue() throws Exception {
- String projectName = A_TEST_PROJECT_NAME;
+ NameKey projectNameKey = A_TEST_PROJECT_NAME_KEY;
Ref oldRef = refOf(AN_OBJECT_ID_1);
Ref expectedRef = refOf(AN_OBJECT_ID_2);
- zookeeperContainer.createRefInZk(projectName, oldRef);
+ zookeeperContainer.createRefInZk(projectNameKey, oldRef);
- assertThat(zkSharedRefDatabase.compareAndPut(projectName, expectedRef, AN_OBJECT_ID_3))
+ assertThat(zkSharedRefDatabase.compareAndPut(projectNameKey, expectedRef, AN_OBJECT_ID_3))
.isFalse();
}
- private Ref refOf(ObjectId objectId) {
- return SharedRefDatabase.newRef(aBranchRef(), objectId);
- }
-
@Test
public void removeProjectShouldRemoveTheWholePathInZk() throws Exception {
- String projectName = A_TEST_PROJECT_NAME;
+ NameKey projectNameKey = A_TEST_PROJECT_NAME_KEY;
Ref someRef = refOf(AN_OBJECT_ID_1);
- zookeeperContainer.createRefInZk(projectName, someRef);
+ zookeeperContainer.createRefInZk(projectNameKey, someRef);
- assertThat(zookeeperContainer.readRefValueFromZk(projectName, someRef))
+ assertThat(zookeeperContainer.readRefValueFromZk(projectNameKey, someRef))
.isEqualTo(AN_OBJECT_ID_1);
assertThat(getNumChildrenForPath("/")).isEqualTo(1);
- zkSharedRefDatabase.removeProject(projectName);
+ zkSharedRefDatabase.remove(projectNameKey);
assertThat(getNumChildrenForPath("/")).isEqualTo(0);
}
@@ -149,6 +146,7 @@
@Test
public void aDeleteProjectEventShouldCleanupProjectFromZk() throws Exception {
String projectName = A_TEST_PROJECT_NAME;
+ NameKey projectNameKey = A_TEST_PROJECT_NAME_KEY;
Ref someRef = refOf(AN_OBJECT_ID_1);
ProjectDeletedSharedDbCleanup projectDeletedSharedDbCleanup =
new ProjectDeletedSharedDbCleanup(zkSharedRefDatabase, mockValidationMetrics);
@@ -166,7 +164,7 @@
}
};
- zookeeperContainer.createRefInZk(projectName, someRef);
+ zookeeperContainer.createRefInZk(projectNameKey, someRef);
assertThat(getNumChildrenForPath("/")).isEqualTo(1);
@@ -187,4 +185,8 @@
.forPath(String.format(path))
.getNumChildren();
}
+
+ private Ref refOf(ObjectId objectId) {
+ return newRef(aBranchRef(), objectId);
+ }
}
diff --git a/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/zookeeper/ZookeeperTestContainerSupport.java b/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/zookeeper/ZookeeperTestContainerSupport.java
index f7db92f..57e2d34 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/zookeeper/ZookeeperTestContainerSupport.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/zookeeper/ZookeeperTestContainerSupport.java
@@ -19,6 +19,7 @@
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
+import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.server.config.PluginConfigFactory;
import com.googlesource.gerrit.plugins.multisite.ZookeeperConfig;
import org.apache.curator.framework.CuratorFramework;
@@ -79,12 +80,12 @@
this.container.stop();
}
- public ObjectId readRefValueFromZk(String projectName, Ref ref) throws Exception {
+ public ObjectId readRefValueFromZk(Project.NameKey projectName, Ref ref) throws Exception {
final byte[] bytes = curator.getData().forPath(pathFor(projectName, ref));
return ZkSharedRefDatabase.readObjectId(bytes);
}
- public void createRefInZk(String projectName, Ref ref) throws Exception {
+ public void createRefInZk(Project.NameKey projectName, Ref ref) throws Exception {
curator
.create()
.creatingParentContainersIfNeeded()