mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-11-03 20:36:07 +01:00 
			
		
		
		
	Transaction-aware retry create issue to cope with duplicate keys (#8307)
* Revert #7898 * Transaction-aware retry create issue to cope with duplicate keys * Restore INSERT ... WHERE usage * Rearrange code for clarity * Fix error return in newIssue() * Fix error message
This commit is contained in:
		
				
					committed by
					
						
						Antoine GIRARD
					
				
			
			
				
	
			
			
			
						parent
						
							c9f819eae0
						
					
				
				
					commit
					cd13f273d1
				
			@@ -657,6 +657,24 @@ func (pr *PullRequest) testPatch(e Engine) (err error) {
 | 
			
		||||
 | 
			
		||||
// NewPullRequest creates new pull request with labels for repository.
 | 
			
		||||
func NewPullRequest(repo *Repository, pull *Issue, labelIDs []int64, uuids []string, pr *PullRequest, patch []byte, assigneeIDs []int64) (err error) {
 | 
			
		||||
	// Retry several times in case INSERT fails due to duplicate key for (repo_id, index); see #7887
 | 
			
		||||
	i := 0
 | 
			
		||||
	for {
 | 
			
		||||
		if err = newPullRequestAttempt(repo, pull, labelIDs, uuids, pr, patch, assigneeIDs); err == nil {
 | 
			
		||||
			return nil
 | 
			
		||||
		}
 | 
			
		||||
		if !IsErrNewIssueInsert(err) {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
		if i++; i == issueMaxDupIndexAttempts {
 | 
			
		||||
			break
 | 
			
		||||
		}
 | 
			
		||||
		log.Error("NewPullRequest: error attempting to insert the new issue; will retry. Original error: %v", err)
 | 
			
		||||
	}
 | 
			
		||||
	return fmt.Errorf("NewPullRequest: too many errors attempting to insert the new issue. Last error was: %v", err)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func newPullRequestAttempt(repo *Repository, pull *Issue, labelIDs []int64, uuids []string, pr *PullRequest, patch []byte, assigneeIDs []int64) (err error) {
 | 
			
		||||
	sess := x.NewSession()
 | 
			
		||||
	defer sess.Close()
 | 
			
		||||
	if err = sess.Begin(); err != nil {
 | 
			
		||||
@@ -671,7 +689,7 @@ func NewPullRequest(repo *Repository, pull *Issue, labelIDs []int64, uuids []str
 | 
			
		||||
		IsPull:      true,
 | 
			
		||||
		AssigneeIDs: assigneeIDs,
 | 
			
		||||
	}); err != nil {
 | 
			
		||||
		if IsErrUserDoesNotHaveAccessToRepo(err) {
 | 
			
		||||
		if IsErrUserDoesNotHaveAccessToRepo(err) || IsErrNewIssueInsert(err) {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
		return fmt.Errorf("newIssue: %v", err)
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user