]> source.dussan.org Git - gitea.git/commitdiff
Fix sqlite deadlock when assigning to a PR (#5640)
authorzeripath <art27@cantab.net>
Fri, 4 Jan 2019 21:51:27 +0000 (21:51 +0000)
committertechknowlogick <hello@techknowlogick.com>
Fri, 4 Jan 2019 21:51:27 +0000 (16:51 -0500)
* Fix sqlite deadlock when assigning to a PR

Fix 5639

Signed-off-by: Andrew Thornton <art27@cantab.net>
* More possible deadlocks found and fixed

Signed-off-by: Andrew Thornton <art27@cantab.net>
models/issue.go
models/issue_assignees.go
models/issue_mail.go
models/issue_user.go
models/org.go
models/repo_watch.go

index cee9b0ca5c6454c61b89e3f81d2dc447e0782637..c982931c0fd8aaae45c5f95cb53a6899c1a148fb 100644 (file)
@@ -1402,7 +1402,7 @@ func UpdateIssueMentions(e Engine, issueID int64, mentions []string) error {
                }
 
                memberIDs := make([]int64, 0, user.NumMembers)
-               orgUsers, err := GetOrgUsersByOrgID(user.ID)
+               orgUsers, err := getOrgUsersByOrgID(e, user.ID)
                if err != nil {
                        return fmt.Errorf("GetOrgUsersByOrgID [%d]: %v", user.ID, err)
                }
index 753396e39b49f46e8da160b01110721378e230c3..0fff2dfad554c67d739bca1be9d7f505fd3460f8 100644 (file)
@@ -44,7 +44,11 @@ func (issue *Issue) loadAssignees(e Engine) (err error) {
 
 // GetAssigneesByIssue returns everyone assigned to that issue
 func GetAssigneesByIssue(issue *Issue) (assignees []*User, err error) {
-       err = issue.loadAssignees(x)
+       return getAssigneesByIssue(x, issue)
+}
+
+func getAssigneesByIssue(e Engine, issue *Issue) (assignees []*User, err error) {
+       err = issue.loadAssignees(e)
        if err != nil {
                return assignees, err
        }
@@ -173,7 +177,7 @@ func (issue *Issue) changeAssignee(sess *xorm.Session, doer *User, assigneeID in
                issue.PullRequest.Issue = issue
                apiPullRequest := &api.PullRequestPayload{
                        Index:       issue.Index,
-                       PullRequest: issue.PullRequest.APIFormat(),
+                       PullRequest: issue.PullRequest.apiFormat(sess),
                        Repository:  issue.Repo.innerAPIFormat(sess, mode, false),
                        Sender:      doer.APIFormat(),
                }
index 7f780e667e77333579e09fb8185c1c5f1795aff2..78dbd13def0ca3183f271077029febb820e3508a 100644 (file)
@@ -48,7 +48,7 @@ func mailIssueCommentToParticipants(e Engine, issue *Issue, doer *User, content
        }
 
        // Assignees must receive any communications
-       assignees, err := GetAssigneesByIssue(issue)
+       assignees, err := getAssigneesByIssue(e, issue)
        if err != nil {
                return err
        }
index 733c35df1f3be541e3b440ad98a43cdc87e3042d..58eb5117f81c3b70e341e41f5c38c4babbd58f40 100644 (file)
@@ -54,7 +54,7 @@ func newIssueUsers(e Engine, repo *Repository, issue *Issue) error {
 func updateIssueAssignee(e *xorm.Session, issue *Issue, assigneeID int64) (removed bool, err error) {
 
        // Check if the user exists
-       assignee, err := GetUserByID(assigneeID)
+       assignee, err := getUserByID(e, assigneeID)
        if err != nil {
                return false, err
        }
index bba5e22a2126d8965696c81cc572d2280a060774..81542f0e606cdabbd1d2a0439118c2d60bed1c55 100644 (file)
@@ -393,8 +393,12 @@ func GetOrgUsersByUserID(uid int64, all bool) ([]*OrgUser, error) {
 
 // GetOrgUsersByOrgID returns all organization-user relations by organization ID.
 func GetOrgUsersByOrgID(orgID int64) ([]*OrgUser, error) {
+       return getOrgUsersByOrgID(x, orgID)
+}
+
+func getOrgUsersByOrgID(e Engine, orgID int64) ([]*OrgUser, error) {
        ous := make([]*OrgUser, 0, 10)
-       err := x.
+       err := e.
                Where("org_id=?", orgID).
                Find(&ous)
        return ous, err
index 95c7e44e938d164fd2f95f567c3316f6d84ec937..53a34efdafea0b5616fbf95a00baf1efa769090e 100644 (file)
@@ -113,15 +113,15 @@ func notifyWatchers(e Engine, act *Action) error {
 
                switch act.OpType {
                case ActionCommitRepo, ActionPushTag, ActionDeleteTag, ActionDeleteBranch:
-                       if !act.Repo.CheckUnitUser(act.UserID, false, UnitTypeCode) {
+                       if !act.Repo.checkUnitUser(e, act.UserID, false, UnitTypeCode) {
                                continue
                        }
                case ActionCreateIssue, ActionCommentIssue, ActionCloseIssue, ActionReopenIssue:
-                       if !act.Repo.CheckUnitUser(act.UserID, false, UnitTypeIssues) {
+                       if !act.Repo.checkUnitUser(e, act.UserID, false, UnitTypeIssues) {
                                continue
                        }
                case ActionCreatePullRequest, ActionMergePullRequest, ActionClosePullRequest, ActionReopenPullRequest:
-                       if !act.Repo.CheckUnitUser(act.UserID, false, UnitTypePullRequests) {
+                       if !act.Repo.checkUnitUser(e, act.UserID, false, UnitTypePullRequests) {
                                continue
                        }
                }