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