Allow to run cleanup on the read-only node (it should clean only the files under...
authordmitry.treskunov <dmitry.treskunov@jetbrains.com>
Fri, 1 Jun 2018 11:10:47 +0000 (13:10 +0200)
committerdmitry.treskunov <dmitry.treskunov@jetbrains.com>
Fri, 1 Jun 2018 11:10:47 +0000 (13:10 +0200)
git-server-tc/src/META-INF/build-server-plugin-git-tc.xml
git-server-tc/src/jetbrains/buildServer/buildTriggers/vcs/git/CleanupCustomizer.java [new file with mode: 0644]
git-server/src/jetbrains/buildServer/buildTriggers/vcs/git/Cleanup.java
git-tests/src/jetbrains/buildServer/buildTriggers/vcs/git/tests/CleanerTest.java

index 6beae6ac2375002c0bd078e4cb6850e87f8e6a7a..ec45976c51eb60b4afed08f56b3aeb6b3e78dd62 100644 (file)
@@ -14,4 +14,5 @@
   <bean class="jetbrains.buildServer.buildTriggers.vcs.git.health.GitGcErrorsHealthPage"/>
   <bean class="jetbrains.buildServer.buildTriggers.vcs.git.GitExternalChangeViewerExtension"/>
   <bean class="jetbrains.buildServer.buildTriggers.vcs.git.GitTrustStoreProviderBuildServer"/>
+  <bean class="jetbrains.buildServer.buildTriggers.vcs.git.CleanupCustomizer"/>
 </beans>
\ No newline at end of file
diff --git a/git-server-tc/src/jetbrains/buildServer/buildTriggers/vcs/git/CleanupCustomizer.java b/git-server-tc/src/jetbrains/buildServer/buildTriggers/vcs/git/CleanupCustomizer.java
new file mode 100644 (file)
index 0000000..60f24d3
--- /dev/null
@@ -0,0 +1,27 @@
+/*
+ * Copyright 2000-2018 JetBrains s.r.o.
+ *
+ * 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 jetbrains.buildServer.buildTriggers.vcs.git;
+
+import jetbrains.buildServer.serverSide.ReadOnlyRestrictor;
+import org.jetbrains.annotations.NotNull;
+
+public class CleanupCustomizer {
+
+  public CleanupCustomizer(@NotNull Cleanup cleanup) {
+    cleanup.setCleanupCallWrapper(cleanupRunner -> ReadOnlyRestrictor.doReadOnlyCommandLine(cleanupRunner::run));
+  }
+}
index cafb4b3687f78ca6a7573c55b1c9b0a209a62ec8..3e5cbc3ad3c56f7ce20e801c2096e96e2ce9d57f 100644 (file)
@@ -42,6 +42,7 @@ import java.util.concurrent.Semaphore;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicReference;
 import java.util.concurrent.locks.Lock;
+import java.util.function.Consumer;
 import java.util.regex.Pattern;
 
 public class Cleanup {
@@ -54,6 +55,8 @@ public class Cleanup {
   private final ServerPluginConfig myConfig;
   private final GcErrors myGcErrors;
   private final AtomicReference<RunGitError> myNativeGitError = new AtomicReference<>();
+  @NotNull
+  private volatile Consumer<Runnable> myCleanupCallWrapper = Runnable::run;
 
   public Cleanup(@NotNull final ServerPluginConfig config,
                  @NotNull final RepositoryManager repositoryManager,
@@ -71,19 +74,25 @@ public class Cleanup {
 
     try {
       LOG.info("Git cleanup started");
-      removeUnusedRepositories();
-      cleanupMonitoringData();
-      if (myConfig.isRunNativeGC()) {
-        runNativeGC();
-      } else if (myConfig.isRunJGitGC()) {
-        runJGitGC();
-      }
+      myCleanupCallWrapper.accept(() -> {
+        removeUnusedRepositories();
+        cleanupMonitoringData();
+        if (myConfig.isRunNativeGC()) {
+          runNativeGC();
+        } else if (myConfig.isRunJGitGC()) {
+          runJGitGC();
+        }
+      });
       LOG.info("Git cleanup finished");
     } finally {
       ourSemaphore.release();
     }
   }
 
+  public void setCleanupCallWrapper(@NotNull Consumer<Runnable> cleanupCallWrapper) {
+    myCleanupCallWrapper = cleanupCallWrapper;
+  }
+
   private void removeUnusedRepositories() {
     List<File> unusedDirs = getUnusedDirs();
     LOG.debug("Remove unused git repository clones started");
index 92cb1411dab5463c9cfae80bc1115c1373fcca5b..a1b642bbdbc7e1b52436b62f94617605de76e1ac 100644 (file)
@@ -34,6 +34,7 @@ import org.testng.annotations.Test;
 import java.io.File;
 import java.io.FileFilter;
 import java.io.IOException;
+import java.util.concurrent.atomic.AtomicBoolean;
 
 import static jetbrains.buildServer.buildTriggers.vcs.git.tests.GitSupportBuilder.gitSupport;
 import static org.assertj.core.api.BDDAssertions.then;
@@ -43,6 +44,7 @@ public class CleanerTest extends BaseTestCase {
 
   private static final TempFiles ourTempFiles = new TempFiles();
   private Cleanup myCleanup;
+  private AtomicBoolean myCleanupCalled;
   private GitVcsSupport mySupport;
   private RepositoryManager myRepositoryManager;
   private ServerPluginConfig myConfig;
@@ -88,6 +90,7 @@ public class CleanerTest extends BaseTestCase {
 
     myCleanup.run();
 
+    assertTrue(myCleanupCalled.get());
     File[] files = baseMirrorsDir.listFiles(new FileFilter() {
       public boolean accept(File f) {
         return f.isDirectory();
@@ -134,6 +137,11 @@ public class CleanerTest extends BaseTestCase {
     mySupport = gitBuilder.build();
     myRepositoryManager = gitBuilder.getRepositoryManager();
     myCleanup = new Cleanup(myConfig, myRepositoryManager, new GcErrors());
+    myCleanupCalled = new AtomicBoolean();
+    myCleanup.setCleanupCallWrapper(cleanup -> {
+      myCleanupCalled.set(true);
+      cleanup.run();
+    });
   }