2014-04-13 09:30:09 +08:00
// Copyright 2014 The Gogs Authors. All rights reserved.
2019-07-16 08:13:03 +08:00
// Copyright 2019 The Gitea Authors. All rights reserved.
2014-04-13 09:30:09 +08:00
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
package cron
import (
2019-12-15 17:51:28 +08:00
"context"
2014-06-14 01:01:52 +08:00
"time"
2016-11-11 00:24:48 +08:00
"code.gitea.io/gitea/models"
2019-12-15 17:51:28 +08:00
"code.gitea.io/gitea/modules/graceful"
2016-11-11 00:24:48 +08:00
"code.gitea.io/gitea/modules/log"
2019-10-14 14:10:42 +08:00
"code.gitea.io/gitea/modules/migrations"
2020-01-21 04:01:19 +08:00
repo_module "code.gitea.io/gitea/modules/repository"
2016-11-11 00:24:48 +08:00
"code.gitea.io/gitea/modules/setting"
2019-07-16 08:13:03 +08:00
"code.gitea.io/gitea/modules/sync"
2019-10-01 21:40:17 +08:00
mirror_service "code.gitea.io/gitea/services/mirror"
2019-07-16 08:13:03 +08:00
"github.com/gogs/cron"
)
const (
2019-10-14 14:10:42 +08:00
mirrorUpdate = "mirror_update"
gitFsck = "git_fsck"
checkRepos = "check_repos"
archiveCleanup = "archive_cleanup"
syncExternalUsers = "sync_external_users"
deletedBranchesCleanup = "deleted_branches_cleanup"
updateMigrationPosterID = "update_migration_post_id"
2016-02-21 04:58:09 +08:00
)
2014-06-14 01:01:52 +08:00
2016-02-21 04:58:09 +08:00
var c = cron . New ( )
2019-07-16 08:13:03 +08:00
// 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
2019-12-15 17:51:28 +08:00
func WithUnique ( name string , body func ( context . Context ) ) Func {
2019-07-16 08:13:03 +08:00
return func ( ) {
if ! taskStatusTable . StartIfNotRunning ( name ) {
return
}
defer taskStatusTable . Stop ( name )
2019-12-15 17:51:28 +08:00
graceful . GetManager ( ) . RunWithShutdownContext ( body )
2019-07-16 08:13:03 +08:00
}
}
2016-11-25 16:19:24 +08:00
// NewContext begins cron tasks
2019-12-15 17:51:28 +08:00
// Each cron task is run within the shutdown context as a running server
// AtShutdown the cron server is stopped
2016-02-21 04:58:09 +08:00
func NewContext ( ) {
var (
entry * cron . Entry
err error
)
if setting . Cron . UpdateMirror . Enabled {
2019-10-01 21:40:17 +08:00
entry , err = c . AddFunc ( "Update mirrors" , setting . Cron . UpdateMirror . Schedule , WithUnique ( mirrorUpdate , mirror_service . Update ) )
2016-02-21 04:58:09 +08:00
if err != nil {
2019-04-02 15:48:31 +08:00
log . Fatal ( "Cron[Update mirrors]: %v" , err )
2016-02-21 04:58:09 +08:00
}
if setting . Cron . UpdateMirror . RunAtStart {
entry . Prev = time . Now ( )
entry . ExecTimes ++
2019-10-01 21:40:17 +08:00
go WithUnique ( mirrorUpdate , mirror_service . Update ) ( )
2016-02-21 04:58:09 +08:00
}
2014-06-14 01:01:52 +08:00
}
2016-02-21 04:58:09 +08:00
if setting . Cron . RepoHealthCheck . Enabled {
2020-01-21 04:01:19 +08:00
entry , err = c . AddFunc ( "Repository health check" , setting . Cron . RepoHealthCheck . Schedule , WithUnique ( gitFsck , func ( ctx context . Context ) {
if err := repo_module . GitFsck ( ctx ) ; err != nil {
log . Error ( "GitFsck: %s" , err )
}
} ) )
2016-02-21 04:58:09 +08:00
if err != nil {
2019-04-02 15:48:31 +08:00
log . Fatal ( "Cron[Repository health check]: %v" , err )
2016-02-21 04:58:09 +08:00
}
if setting . Cron . RepoHealthCheck . RunAtStart {
entry . Prev = time . Now ( )
entry . ExecTimes ++
2020-01-21 04:01:19 +08:00
go WithUnique ( gitFsck , func ( ctx context . Context ) {
if err := repo_module . GitFsck ( ctx ) ; err != nil {
log . Error ( "GitFsck: %s" , err )
}
} ) ( )
2016-02-21 04:58:09 +08:00
}
2014-06-14 01:01:52 +08:00
}
2016-02-21 04:58:09 +08:00
if setting . Cron . CheckRepoStats . Enabled {
2019-07-16 08:13:03 +08:00
entry , err = c . AddFunc ( "Check repository statistics" , setting . Cron . CheckRepoStats . Schedule , WithUnique ( checkRepos , models . CheckRepoStats ) )
2016-02-21 04:58:09 +08:00
if err != nil {
2019-04-02 15:48:31 +08:00
log . Fatal ( "Cron[Check repository statistics]: %v" , err )
2014-06-14 01:01:52 +08:00
}
2016-02-21 04:58:09 +08:00
if setting . Cron . CheckRepoStats . RunAtStart {
entry . Prev = time . Now ( )
entry . ExecTimes ++
2019-07-16 08:13:03 +08:00
go WithUnique ( checkRepos , models . CheckRepoStats ) ( )
2014-06-14 01:01:52 +08:00
}
}
2017-02-11 12:00:46 +08:00
if setting . Cron . ArchiveCleanup . Enabled {
2019-07-16 08:13:03 +08:00
entry , err = c . AddFunc ( "Clean up old repository archives" , setting . Cron . ArchiveCleanup . Schedule , WithUnique ( archiveCleanup , models . DeleteOldRepositoryArchives ) )
2017-02-11 12:00:46 +08:00
if err != nil {
2019-04-02 15:48:31 +08:00
log . Fatal ( "Cron[Clean up old repository archives]: %v" , err )
2017-02-11 12:00:46 +08:00
}
if setting . Cron . ArchiveCleanup . RunAtStart {
entry . Prev = time . Now ( )
entry . ExecTimes ++
2019-07-16 08:13:03 +08:00
go WithUnique ( archiveCleanup , models . DeleteOldRepositoryArchives ) ( )
2017-02-11 12:00:46 +08:00
}
}
2017-05-10 21:10:18 +08:00
if setting . Cron . SyncExternalUsers . Enabled {
2019-07-16 08:13:03 +08:00
entry , err = c . AddFunc ( "Synchronize external users" , setting . Cron . SyncExternalUsers . Schedule , WithUnique ( syncExternalUsers , models . SyncExternalUsers ) )
2017-05-10 21:10:18 +08:00
if err != nil {
2019-04-02 15:48:31 +08:00
log . Fatal ( "Cron[Synchronize external users]: %v" , err )
2017-05-10 21:10:18 +08:00
}
if setting . Cron . SyncExternalUsers . RunAtStart {
entry . Prev = time . Now ( )
entry . ExecTimes ++
2019-07-16 08:13:03 +08:00
go WithUnique ( syncExternalUsers , models . SyncExternalUsers ) ( )
2017-05-10 21:10:18 +08:00
}
}
2017-10-26 08:49:16 +08:00
if setting . Cron . DeletedBranchesCleanup . Enabled {
2019-07-16 08:13:03 +08:00
entry , err = c . AddFunc ( "Remove old deleted branches" , setting . Cron . DeletedBranchesCleanup . Schedule , WithUnique ( deletedBranchesCleanup , models . RemoveOldDeletedBranches ) )
2017-10-26 08:49:16 +08:00
if err != nil {
2019-04-02 15:48:31 +08:00
log . Fatal ( "Cron[Remove old deleted branches]: %v" , err )
2017-10-26 08:49:16 +08:00
}
if setting . Cron . DeletedBranchesCleanup . RunAtStart {
entry . Prev = time . Now ( )
entry . ExecTimes ++
2019-07-16 08:13:03 +08:00
go WithUnique ( deletedBranchesCleanup , models . RemoveOldDeletedBranches ) ( )
2017-10-26 08:49:16 +08:00
}
}
2019-10-14 14:10:42 +08:00
entry , err = c . AddFunc ( "Update migrated repositories' issues and comments' posterid" , setting . Cron . UpdateMigrationPosterID . Schedule , WithUnique ( updateMigrationPosterID , migrations . UpdateMigrationPosterID ) )
if err != nil {
log . Fatal ( "Cron[Update migrated repositories]: %v" , err )
}
entry . Prev = time . Now ( )
entry . ExecTimes ++
go WithUnique ( updateMigrationPosterID , migrations . UpdateMigrationPosterID ) ( )
2016-02-21 04:58:09 +08:00
c . Start ( )
2019-12-15 17:51:28 +08:00
graceful . GetManager ( ) . RunAtShutdown ( context . Background ( ) , c . Stop )
2014-06-14 01:01:52 +08:00
}
2016-02-21 04:58:09 +08:00
// ListTasks returns all running cron tasks.
func ListTasks ( ) [ ] * cron . Entry {
return c . Entries ( )
2014-04-13 09:30:09 +08:00
}