aboutsummaryrefslogtreecommitdiffstats
path: root/modules/cron
diff options
context:
space:
mode:
authorLunny Xiao <xiaolunwen@gmail.com>2019-07-16 08:13:03 +0800
committertechknowlogick <techknowlogick@gitea.io>2019-07-15 20:13:03 -0400
commitd2958d9f4633ddbde2202952d665b3d562eb0415 (patch)
tree59f6d1c0ed6c886ba0caa6d96d5a175debf376b7 /modules/cron
parent760c47389696e97131a3d13629a0a5a4576e5283 (diff)
downloadgitea-d2958d9f4633ddbde2202952d665b3d562eb0415.tar.gz
gitea-d2958d9f4633ddbde2202952d665b3d562eb0415.zip
Move status table to cron package (#7370)
Diffstat (limited to 'modules/cron')
-rw-r--r--modules/cron/cron.go56
1 files changed, 42 insertions, 14 deletions
diff --git a/modules/cron/cron.go b/modules/cron/cron.go
index 24457f5013..fe87f86e02 100644
--- a/modules/cron/cron.go
+++ b/modules/cron/cron.go
@@ -1,4 +1,5 @@
// Copyright 2014 The Gogs Authors. All rights reserved.
+// Copyright 2019 The Gitea Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
@@ -7,15 +8,42 @@ package cron
import (
"time"
- "github.com/gogits/cron"
-
"code.gitea.io/gitea/models"
"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/setting"
+ "code.gitea.io/gitea/modules/sync"
+
+ "github.com/gogs/cron"
+)
+
+const (
+ mirrorUpdate = "mirror_update"
+ gitFsck = "git_fsck"
+ checkRepos = "check_repos"
+ archiveCleanup = "archive_cleanup"
+ syncExternalUsers = "sync_external_users"
+ deletedBranchesCleanup = "deleted_branches_cleanup"
)
var c = cron.New()
+// Prevent duplicate running tasks.
+var taskStatusTable = sync.NewStatusTable()
+
+// Func defines a cron function body
+type Func func()
+
+// WithUnique wrap a cron func with an unique running check
+func WithUnique(name string, body Func) Func {
+ return func() {
+ if !taskStatusTable.StartIfNotRunning(name) {
+ return
+ }
+ defer taskStatusTable.Stop(name)
+ body()
+ }
+}
+
// NewContext begins cron tasks
func NewContext() {
var (
@@ -23,69 +51,69 @@ func NewContext() {
err error
)
if setting.Cron.UpdateMirror.Enabled {
- entry, err = c.AddFunc("Update mirrors", setting.Cron.UpdateMirror.Schedule, models.MirrorUpdate)
+ entry, err = c.AddFunc("Update mirrors", setting.Cron.UpdateMirror.Schedule, WithUnique(mirrorUpdate, models.MirrorUpdate))
if err != nil {
log.Fatal("Cron[Update mirrors]: %v", err)
}
if setting.Cron.UpdateMirror.RunAtStart {
entry.Prev = time.Now()
entry.ExecTimes++
- go models.MirrorUpdate()
+ go WithUnique(mirrorUpdate, models.MirrorUpdate)()
}
}
if setting.Cron.RepoHealthCheck.Enabled {
- entry, err = c.AddFunc("Repository health check", setting.Cron.RepoHealthCheck.Schedule, models.GitFsck)
+ entry, err = c.AddFunc("Repository health check", setting.Cron.RepoHealthCheck.Schedule, WithUnique(gitFsck, models.GitFsck))
if err != nil {
log.Fatal("Cron[Repository health check]: %v", err)
}
if setting.Cron.RepoHealthCheck.RunAtStart {
entry.Prev = time.Now()
entry.ExecTimes++
- go models.GitFsck()
+ go WithUnique(gitFsck, models.GitFsck)()
}
}
if setting.Cron.CheckRepoStats.Enabled {
- entry, err = c.AddFunc("Check repository statistics", setting.Cron.CheckRepoStats.Schedule, models.CheckRepoStats)
+ entry, err = c.AddFunc("Check repository statistics", setting.Cron.CheckRepoStats.Schedule, WithUnique(checkRepos, models.CheckRepoStats))
if err != nil {
log.Fatal("Cron[Check repository statistics]: %v", err)
}
if setting.Cron.CheckRepoStats.RunAtStart {
entry.Prev = time.Now()
entry.ExecTimes++
- go models.CheckRepoStats()
+ go WithUnique(checkRepos, models.CheckRepoStats)()
}
}
if setting.Cron.ArchiveCleanup.Enabled {
- entry, err = c.AddFunc("Clean up old repository archives", setting.Cron.ArchiveCleanup.Schedule, models.DeleteOldRepositoryArchives)
+ entry, err = c.AddFunc("Clean up old repository archives", setting.Cron.ArchiveCleanup.Schedule, WithUnique(archiveCleanup, models.DeleteOldRepositoryArchives))
if err != nil {
log.Fatal("Cron[Clean up old repository archives]: %v", err)
}
if setting.Cron.ArchiveCleanup.RunAtStart {
entry.Prev = time.Now()
entry.ExecTimes++
- go models.DeleteOldRepositoryArchives()
+ go WithUnique(archiveCleanup, models.DeleteOldRepositoryArchives)()
}
}
if setting.Cron.SyncExternalUsers.Enabled {
- entry, err = c.AddFunc("Synchronize external users", setting.Cron.SyncExternalUsers.Schedule, models.SyncExternalUsers)
+ entry, err = c.AddFunc("Synchronize external users", setting.Cron.SyncExternalUsers.Schedule, WithUnique(syncExternalUsers, models.SyncExternalUsers))
if err != nil {
log.Fatal("Cron[Synchronize external users]: %v", err)
}
if setting.Cron.SyncExternalUsers.RunAtStart {
entry.Prev = time.Now()
entry.ExecTimes++
- go models.SyncExternalUsers()
+ go WithUnique(syncExternalUsers, models.SyncExternalUsers)()
}
}
if setting.Cron.DeletedBranchesCleanup.Enabled {
- entry, err = c.AddFunc("Remove old deleted branches", setting.Cron.DeletedBranchesCleanup.Schedule, models.RemoveOldDeletedBranches)
+ entry, err = c.AddFunc("Remove old deleted branches", setting.Cron.DeletedBranchesCleanup.Schedule, WithUnique(deletedBranchesCleanup, models.RemoveOldDeletedBranches))
if err != nil {
log.Fatal("Cron[Remove old deleted branches]: %v", err)
}
if setting.Cron.DeletedBranchesCleanup.RunAtStart {
entry.Prev = time.Now()
entry.ExecTimes++
- go models.RemoveOldDeletedBranches()
+ go WithUnique(deletedBranchesCleanup, models.RemoveOldDeletedBranches)()
}
}
c.Start()