[TEST] make the indexer and pull tasks cancellable (without shutdown)

See
https://codeberg.org/forgejo/forgejo/pulls/3130#issuecomment-1763440
for the conflict resolution.

(cherry picked from commit d79690ce18)
This commit is contained in:
oliverpool 2024-04-10 14:26:47 +02:00 committed by Earl Warren
parent ec6b255c2c
commit 8f06a99c2c
No known key found for this signature in database
GPG key ID: 0579CB2928A78A00
2 changed files with 11 additions and 3 deletions

View file

@ -120,9 +120,12 @@ func Init() {
case "bleve", "elasticsearch": case "bleve", "elasticsearch":
handler := func(items ...*internal.IndexerData) (unhandled []*internal.IndexerData) { handler := func(items ...*internal.IndexerData) (unhandled []*internal.IndexerData) {
indexer := *globalIndexer.Load() indexer := *globalIndexer.Load()
// make it a process to allow for cancellation (especially during integration tests where no global shutdown happens)
batchCtx, _, finished := process.GetManager().AddContext(ctx, "CodeIndexer batch")
defer finished()
for _, indexerData := range items { for _, indexerData := range items {
log.Trace("IndexerData Process Repo: %d", indexerData.RepoID) log.Trace("IndexerData Process Repo: %d", indexerData.RepoID)
if err := index(ctx, indexer, indexerData.RepoID); err != nil { if err := index(batchCtx, indexer, indexerData.RepoID); err != nil {
unhandled = append(unhandled, indexerData) unhandled = append(unhandled, indexerData)
if !setting.IsInTesting { if !setting.IsInTesting {
log.Error("Codes indexer handler: index error for repo %v: %v", indexerData.RepoID, err) log.Error("Codes indexer handler: index error for repo %v: %v", indexerData.RepoID, err)

View file

@ -26,6 +26,7 @@ import (
"code.gitea.io/gitea/modules/graceful" "code.gitea.io/gitea/modules/graceful"
"code.gitea.io/gitea/modules/json" "code.gitea.io/gitea/modules/json"
"code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/process"
repo_module "code.gitea.io/gitea/modules/repository" repo_module "code.gitea.io/gitea/modules/repository"
"code.gitea.io/gitea/modules/setting" "code.gitea.io/gitea/modules/setting"
"code.gitea.io/gitea/modules/sync" "code.gitea.io/gitea/modules/sync"
@ -296,8 +297,12 @@ func checkForInvalidation(ctx context.Context, requests issues_model.PullRequest
// AddTestPullRequestTask adds new test tasks by given head/base repository and head/base branch, // AddTestPullRequestTask adds new test tasks by given head/base repository and head/base branch,
// and generate new patch for testing as needed. // and generate new patch for testing as needed.
func AddTestPullRequestTask(ctx context.Context, doer *user_model.User, repoID int64, branch string, isSync bool, oldCommitID, newCommitID string, timeNano int64) { func AddTestPullRequestTask(ctx context.Context, doer *user_model.User, repoID int64, branch string, isSync bool, oldCommitID, newCommitID string, timeNano int64) {
log.Trace("AddTestPullRequestTask [head_repo_id: %d, head_branch: %s]: only pull requests created before nano time %d will be considered", repoID, branch, timeNano) description := fmt.Sprintf("AddTestPullRequestTask [head_repo_id: %d, head_branch: %s]: only pull requests created before nano time %d will be considered", repoID, branch, timeNano)
go graceful.GetManager().RunWithShutdownContext(func(ctx context.Context) { log.Trace(description)
go graceful.GetManager().RunWithShutdownContext(func(shutdownCtx context.Context) {
// make it a process to allow for cancellation (especially during integration tests where no global shutdown happens)
ctx, _, finished := process.GetManager().AddContext(shutdownCtx, description)
defer finished()
// There is no sensible way to shut this down ":-(" // There is no sensible way to shut this down ":-("
// If you don't let it run all the way then you will lose data // If you don't let it run all the way then you will lose data
// TODO: graceful: TestPullRequest needs to become a queue! // TODO: graceful: TestPullRequest needs to become a queue!