]> source.dussan.org Git - gitea.git/commitdiff
fix race on indexer (#9136)
authorLunny Xiao <xiaolunwen@gmail.com>
Sat, 23 Nov 2019 15:03:35 +0000 (23:03 +0800)
committerGitHub <noreply@github.com>
Sat, 23 Nov 2019 15:03:35 +0000 (23:03 +0800)
models/repo_indexer.go

index 7bfcde8db0bcec0fe9b39126bfab5de742ff0f52..4085982c263f0c9606aba1af5183c84ae22e9ae0 100644 (file)
@@ -60,7 +60,7 @@ func (repo *Repository) updateIndexerStatus(sha string) error {
 }
 
 type repoIndexerOperation struct {
-       repo     *Repository
+       repoID   int64
        deleted  bool
        watchers []chan<- error
 }
@@ -145,7 +145,7 @@ func populateRepoIndexer(maxRepoID int64) {
                }
                for _, repo := range repos {
                        repoIndexerOperationQueue <- repoIndexerOperation{
-                               repo:    repo,
+                               repoID:  repo.ID,
                                deleted: false,
                        }
                        maxRepoID = repo.ID - 1
@@ -154,7 +154,12 @@ func populateRepoIndexer(maxRepoID int64) {
        log.Info("Done populating the repo indexer with existing repositories")
 }
 
-func updateRepoIndexer(repo *Repository) error {
+func updateRepoIndexer(repoID int64) error {
+       repo, err := getRepositoryByID(x, repoID)
+       if err != nil {
+               return err
+       }
+
        sha, err := getDefaultBranchSha(repo)
        if err != nil {
                return err
@@ -362,11 +367,11 @@ func processRepoIndexerOperationQueue() {
                op := <-repoIndexerOperationQueue
                var err error
                if op.deleted {
-                       if err = indexer.DeleteRepoFromIndexer(op.repo.ID); err != nil {
+                       if err = indexer.DeleteRepoFromIndexer(op.repoID); err != nil {
                                log.Error("DeleteRepoFromIndexer: %v", err)
                        }
                } else {
-                       if err = updateRepoIndexer(op.repo); err != nil {
+                       if err = updateRepoIndexer(op.repoID); err != nil {
                                log.Error("updateRepoIndexer: %v", err)
                        }
                }
@@ -378,12 +383,12 @@ func processRepoIndexerOperationQueue() {
 
 // DeleteRepoFromIndexer remove all of a repository's entries from the indexer
 func DeleteRepoFromIndexer(repo *Repository, watchers ...chan<- error) {
-       addOperationToQueue(repoIndexerOperation{repo: repo, deleted: true, watchers: watchers})
+       addOperationToQueue(repoIndexerOperation{repoID: repo.ID, deleted: true, watchers: watchers})
 }
 
 // UpdateRepoIndexer update a repository's entries in the indexer
 func UpdateRepoIndexer(repo *Repository, watchers ...chan<- error) {
-       addOperationToQueue(repoIndexerOperation{repo: repo, deleted: false, watchers: watchers})
+       addOperationToQueue(repoIndexerOperation{repoID: repo.ID, deleted: false, watchers: watchers})
 }
 
 func addOperationToQueue(op repoIndexerOperation) {