aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJason Song <i@wolfogre.com>2023-08-17 22:05:17 +0800
committerGitHub <noreply@github.com>2023-08-17 14:05:17 +0000
commit47fddaadc8b4c8d4d4359d6209b9fe06d6387a30 (patch)
tree823e4fd9174e0238a27b5fa1fdb273af68237aff
parent940f9975120a8d9e782a457edd5ccf1129ab746a (diff)
downloadgitea-47fddaadc8b4c8d4d4359d6209b9fe06d6387a30.tar.gz
gitea-47fddaadc8b4c8d4d4359d6209b9fe06d6387a30.zip
Support rebuilding issue indexer manually (#26546)
Provide a way to rebuild issue indexer manually. So if the indexer get outdated because of some bugs like #26539, we can rebuild it. <img width="1104" alt="image" src="https://github.com/go-gitea/gitea/assets/9418365/ac242e29-6f04-47ca-b3d0-801a796448d3"> Co-authored-by: Giteabot <teabot@gitea.io>
-rw-r--r--modules/indexer/issues/indexer.go22
-rw-r--r--options/locale/locale_en-US.ini1
-rw-r--r--services/cron/tasks_extended.go12
3 files changed, 28 insertions, 7 deletions
diff --git a/modules/indexer/issues/indexer.go b/modules/indexer/issues/indexer.go
index 42279cbddb..6619949104 100644
--- a/modules/indexer/issues/indexer.go
+++ b/modules/indexer/issues/indexer.go
@@ -5,6 +5,7 @@ package issues
import (
"context"
+ "fmt"
"os"
"runtime/pprof"
"sync/atomic"
@@ -202,11 +203,16 @@ func getIssueIndexerQueueHandler(ctx context.Context) func(items ...*IndexerMeta
func populateIssueIndexer(ctx context.Context) {
ctx, _, finished := process.GetManager().AddTypedContext(ctx, "Service: PopulateIssueIndexer", process.SystemProcessType, true)
defer finished()
+ if err := PopulateIssueIndexer(ctx, true); err != nil {
+ log.Error("Issue indexer population failed: %v", err)
+ }
+}
+
+func PopulateIssueIndexer(ctx context.Context, keepRetrying bool) error {
for page := 1; ; page++ {
select {
case <-ctx.Done():
- log.Warn("Issue Indexer population shutdown before completion")
- return
+ return fmt.Errorf("shutdown before completion: %w", ctx.Err())
default:
}
repos, _, err := repo_model.SearchRepositoryByName(ctx, &repo_model.SearchRepoOptions{
@@ -221,20 +227,22 @@ func populateIssueIndexer(ctx context.Context) {
}
if len(repos) == 0 {
log.Debug("Issue Indexer population complete")
- return
+ return nil
}
for _, repo := range repos {
for {
select {
case <-ctx.Done():
- log.Info("Issue Indexer population shutdown before completion")
- return
+ return fmt.Errorf("shutdown before completion: %w", ctx.Err())
default:
}
if err := updateRepoIndexer(ctx, repo.ID); err != nil {
- log.Warn("Retry to populate issue indexer for repo %d: %v", repo.ID, err)
- continue
+ if keepRetrying && ctx.Err() == nil {
+ log.Warn("Retry to populate issue indexer for repo %d: %v", repo.ID, err)
+ continue
+ }
+ return fmt.Errorf("populate issue indexer for repo %d: %v", repo.ID, err)
}
break
}
diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini
index cbafef9d5b..0bfe1eac75 100644
--- a/options/locale/locale_en-US.ini
+++ b/options/locale/locale_en-US.ini
@@ -2752,6 +2752,7 @@ dashboard.stop_zombie_tasks = Stop zombie tasks
dashboard.stop_endless_tasks = Stop endless tasks
dashboard.cancel_abandoned_jobs = Cancel abandoned jobs
dashboard.sync_branch.started = Branches Sync started
+dashboard.rebuild_issue_indexer = Rebuild issue indexer
users.user_manage_panel = User Account Management
users.new_account = Create User Account
diff --git a/services/cron/tasks_extended.go b/services/cron/tasks_extended.go
index acf2d3373c..48ea87df7f 100644
--- a/services/cron/tasks_extended.go
+++ b/services/cron/tasks_extended.go
@@ -13,6 +13,7 @@ import (
"code.gitea.io/gitea/models/system"
user_model "code.gitea.io/gitea/models/user"
"code.gitea.io/gitea/modules/git"
+ issue_indexer "code.gitea.io/gitea/modules/indexer/issues"
"code.gitea.io/gitea/modules/setting"
"code.gitea.io/gitea/modules/updatechecker"
repo_service "code.gitea.io/gitea/services/repository"
@@ -213,6 +214,16 @@ func registerGCLFS() {
})
}
+func registerRebuildIssueIndexer() {
+ RegisterTaskFatal("rebuild_issue_indexer", &BaseConfig{
+ Enabled: false,
+ RunAtStart: false,
+ Schedule: "@annually",
+ }, func(ctx context.Context, _ *user_model.User, config Config) error {
+ return issue_indexer.PopulateIssueIndexer(ctx, false)
+ })
+}
+
func initExtendedTasks() {
registerDeleteInactiveUsers()
registerDeleteRepositoryArchives()
@@ -227,4 +238,5 @@ func initExtendedTasks() {
registerUpdateGiteaChecker()
registerDeleteOldSystemNotices()
registerGCLFS()
+ registerRebuildIssueIndexer()
}