Fix sqlite deadlock when assigning to a PR (#5640)
* 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>
This commit is contained in:
		
							parent
							
								
									9e901039e7
								
							
						
					
					
						commit
						6311e4ce6a
					
				
					 6 changed files with 17 additions and 9 deletions
				
			
		|  | @ -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) | ||||
| 		} | ||||
|  |  | |||
|  | @ -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(), | ||||
| 		} | ||||
|  |  | |||
|  | @ -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 | ||||
| 	} | ||||
|  |  | |||
|  | @ -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 | ||||
| 	} | ||||
|  |  | |||
|  | @ -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 | ||||
|  |  | |||
|  | @ -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 | ||||
| 			} | ||||
| 		} | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue