# HG changeset patch # User Dmitry Neverov # Date 1364478142 -14400 # Node ID d693048e77ae5074707c8d4daffda68968531b99 # Parent fa40f53ec0192399c26481e1afa467a0b58aab80 Schedule cleanup by cron diff -r fa40f53ec019 -r d693048e77ae .idea/libraries/quartz_1_6_0.xml --- /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 @@ + + + + + + + + + \ No newline at end of file diff -r fa40f53ec019 -r d693048e77ae lib/quartz-1.6.0.jar Binary file lib/quartz-1.6.0.jar has changed diff -r fa40f53ec019 -r d693048e77ae mercurial-server-tc/src/META-INF/build-server-plugin-mercurial-tc.xml --- 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 @@ - diff -r fa40f53ec019 -r d693048e77ae mercurial-server-tc/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialCleaner.java --- 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 dispatcher, - @NotNull final ServerPluginConfig config, - @NotNull final MirrorManager mirrorManager) { - dispatcher.addListener(new BuildServerAdapter() { - @Override - public void cleanupFinished() { - server.getExecutor().submit(new Cleanup(mirrorManager, config)); - } - }); - } -} diff -r fa40f53ec019 -r d693048e77ae mercurial-server/mercurial-server.iml --- 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 @@ + diff -r fa40f53ec019 -r d693048e77ae mercurial-server/src/META-INF/build-server-plugin-mercurial.xml --- 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 @@ + diff -r fa40f53ec019 -r d693048e77ae mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialCleaner.java --- /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; + } + } + } +} diff -r fa40f53ec019 -r d693048e77ae mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/ServerPluginConfig.java --- 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(); } diff -r fa40f53ec019 -r d693048e77ae mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/ServerPluginConfigImpl.java --- 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; + } + } } diff -r fa40f53ec019 -r d693048e77ae mercurial-tests/mercurial-tests.iml --- 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 @@ + diff -r fa40f53ec019 -r d693048e77ae mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/ServerPluginConfigBuilder.java --- 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; + } }; }