changeset 581:d693048e77ae

Schedule cleanup by cron
author Dmitry Neverov <dmitry.neverov@jetbrains.com>
date Thu, 28 Mar 2013 17:42:22 +0400
parents fa40f53ec019
children 23abd5aa1115
files .idea/libraries/quartz_1_6_0.xml lib/quartz-1.6.0.jar mercurial-server-tc/src/META-INF/build-server-plugin-mercurial-tc.xml mercurial-server-tc/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialCleaner.java mercurial-server/mercurial-server.iml mercurial-server/src/META-INF/build-server-plugin-mercurial.xml mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialCleaner.java mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/ServerPluginConfig.java mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/ServerPluginConfigImpl.java mercurial-tests/mercurial-tests.iml mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/ServerPluginConfigBuilder.java
diffstat 11 files changed, 94 insertions(+), 23 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/.idea/libraries/quartz_1_6_0.xml	Thu Mar 28 17:42:22 2013 +0400
@@ -0,0 +1,9 @@
+<component name="libraryTable">
+  <library name="quartz-1.6.0">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/lib/quartz-1.6.0.jar!/" />
+    </CLASSES>
+    <JAVADOC />
+    <SOURCES />
+  </library>
+</component>
\ No newline at end of file
Binary file lib/quartz-1.6.0.jar has changed
--- a/mercurial-server-tc/src/META-INF/build-server-plugin-mercurial-tc.xml	Wed Mar 27 23:50:23 2013 +0100
+++ b/mercurial-server-tc/src/META-INF/build-server-plugin-mercurial-tc.xml	Thu Mar 28 17:42:22 2013 +0400
@@ -4,5 +4,4 @@
 <beans default-autowire="constructor">
     <bean class="jetbrains.buildServer.buildTriggers.vcs.mercurial.MercurialExtensionRegistry"/>
     <bean class="jetbrains.buildServer.buildTriggers.vcs.mercurial.MercurialBranchSupport"/>
-    <bean class="jetbrains.buildServer.buildTriggers.vcs.mercurial.MercurialCleaner"/>
 </beans>
--- a/mercurial-server-tc/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialCleaner.java	Wed Mar 27 23:50:23 2013 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,22 +0,0 @@
-package jetbrains.buildServer.buildTriggers.vcs.mercurial;
-
-import jetbrains.buildServer.serverSide.BuildServerAdapter;
-import jetbrains.buildServer.serverSide.BuildServerListener;
-import jetbrains.buildServer.serverSide.SBuildServer;
-import jetbrains.buildServer.util.EventDispatcher;
-import org.jetbrains.annotations.NotNull;
-
-public class MercurialCleaner implements MercurialServerExtension {
-
-  public MercurialCleaner(@NotNull final SBuildServer server,
-                          @NotNull final EventDispatcher<BuildServerListener> dispatcher,
-                          @NotNull final ServerPluginConfig config,
-                          @NotNull final MirrorManager mirrorManager) {
-    dispatcher.addListener(new BuildServerAdapter() {
-      @Override
-      public void cleanupFinished() {
-        server.getExecutor().submit(new Cleanup(mirrorManager, config));
-      }
-    });
-  }
-}
--- a/mercurial-server/mercurial-server.iml	Wed Mar 27 23:50:23 2013 +0100
+++ b/mercurial-server/mercurial-server.iml	Thu Mar 28 17:42:22 2013 +0400
@@ -21,6 +21,7 @@
     <orderEntry type="module" module-name="mercurial-common" />
     <orderEntry type="library" name="TeamCity Vcs Api" level="project" />
     <orderEntry type="library" name="trove4j" level="project" />
+    <orderEntry type="library" name="quartz-1.6.0" level="project" />
   </component>
 </module>
 
--- a/mercurial-server/src/META-INF/build-server-plugin-mercurial.xml	Wed Mar 27 23:50:23 2013 +0100
+++ b/mercurial-server/src/META-INF/build-server-plugin-mercurial.xml	Thu Mar 28 17:42:22 2013 +0400
@@ -10,4 +10,5 @@
   <bean id="hgVcsRootFactory" class="jetbrains.buildServer.buildTriggers.vcs.mercurial.HgVcsRootFactory" />
   <bean id="testConnection" class="jetbrains.buildServer.buildTriggers.vcs.mercurial.HgTestConnectionSupport" />
   <bean id="commandSettingsFactory" class="jetbrains.buildServer.buildTriggers.vcs.mercurial.ServerCommandSettingsFactory"/>
+  <bean id="cleaner" class="jetbrains.buildServer.buildTriggers.vcs.mercurial.MercurialCleaner"/>
 </beans>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialCleaner.java	Thu Mar 28 17:42:22 2013 +0400
@@ -0,0 +1,54 @@
+package jetbrains.buildServer.buildTriggers.vcs.mercurial;
+
+import jetbrains.buildServer.serverSide.executors.ExecutorServices;
+import org.jetbrains.annotations.NotNull;
+import org.quartz.CronExpression;
+
+import java.util.Date;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
+
+
+public class MercurialCleaner {
+
+  private final MirrorManager myMirrorManager;
+  private final ServerPluginConfig myConfig;
+  private final ScheduledExecutorService myExecutor;
+
+  public MercurialCleaner(@NotNull final ServerPluginConfig config,
+                          @NotNull final MirrorManager mirrorManager,
+                          @NotNull final ExecutorServices executors) {
+    myMirrorManager = mirrorManager;
+    myConfig = config;
+    myExecutor = executors.getNormalExecutorService();
+    myExecutor.submit(new RunCleanup());
+  }
+
+
+  private class RunCleanup implements Runnable {
+    private volatile boolean myFirstRun = true;
+
+    public void run() {
+      if (myFirstRun) {
+        myFirstRun = false;
+      } else {
+        new Cleanup(myMirrorManager, myConfig).run();
+      }
+      schedule();
+    }
+
+    private void schedule() {
+      CronExpression cron = myConfig.getCleanupCronExpression();
+      if (cron != null) {
+        Date now = new Date();
+        Date next = cron.getNextValidTimeAfter(now);
+        myExecutor.schedule(this, next.getTime() - now.getTime(), TimeUnit.MILLISECONDS);
+      } else {
+        //schedule ourselves to check if the cron expression specified
+        myExecutor.schedule(this, 10, TimeUnit.MINUTES);
+        //do not run cleanup next time, just schedule
+        myFirstRun = true;
+      }
+    }
+  }
+}
--- a/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/ServerPluginConfig.java	Wed Mar 27 23:50:23 2013 +0100
+++ b/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/ServerPluginConfig.java	Thu Mar 28 17:42:22 2013 +0400
@@ -1,6 +1,7 @@
 package jetbrains.buildServer.buildTriggers.vcs.mercurial;
 
 import org.jetbrains.annotations.Nullable;
+import org.quartz.CronExpression;
 
 import java.util.Set;
 
@@ -27,4 +28,7 @@
   public int getLogOutputLimit();
 
   public long getMirrorExpirationTimeoutMillis();
+
+  @Nullable
+  public CronExpression getCleanupCronExpression();
 }
--- a/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/ServerPluginConfigImpl.java	Wed Mar 27 23:50:23 2013 +0100
+++ b/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/ServerPluginConfigImpl.java	Thu Mar 28 17:42:22 2013 +0400
@@ -6,8 +6,12 @@
 import jetbrains.buildServer.util.Dates;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
+import org.quartz.CronExpression;
 
 import java.io.File;
+import java.text.ParseException;
+
+import static com.intellij.openapi.util.text.StringUtil.isEmpty;
 
 /**
  * @author dmitry.neverov
@@ -67,4 +71,17 @@
     int days = TeamCityProperties.getInteger("teamcity.hg.mirrorExpirationTimeoutDays", 7);
     return days * Dates.ONE_DAY;
   }
+
+  @Nullable
+  public CronExpression getCleanupCronExpression() {
+    String cron = TeamCityProperties.getProperty("teamcity.hg.cleanupCron");
+    if (isEmpty(cron))
+      return null;
+    try {
+      return new CronExpression(cron);
+    } catch (ParseException e) {
+      LOG.warn("Wrong cron expression " + cron, e);
+      return null;
+    }
+  }
 }
--- a/mercurial-tests/mercurial-tests.iml	Wed Mar 27 23:50:23 2013 +0100
+++ b/mercurial-tests/mercurial-tests.iml	Thu Mar 28 17:42:22 2013 +0400
@@ -20,6 +20,7 @@
     <orderEntry type="library" name="TeamCityAPI-agent" level="project" />
     <orderEntry type="library" name="TeamCity Vcs Api" level="project" />
     <orderEntry type="module" module-name="mercurial-server-tc" />
+    <orderEntry type="library" name="quartz-1.6.0" level="project" />
   </component>
 </module>
 
--- a/mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/ServerPluginConfigBuilder.java	Wed Mar 27 23:50:23 2013 +0100
+++ b/mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/ServerPluginConfigBuilder.java	Thu Mar 28 17:42:22 2013 +0400
@@ -1,6 +1,8 @@
 package jetbrains.buildServer.buildTriggers.vcs.mercurial;
 
 import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+import org.quartz.CronExpression;
 
 import java.io.File;
 
@@ -62,6 +64,11 @@
       public long getMirrorExpirationTimeoutMillis() {
         return myMirrorExpirationTimeout;
       }
+
+      @Nullable
+      public CronExpression getCleanupCronExpression() {
+        return null;
+      }
     };
   }