mirror of
				https://codeberg.org/forgejo/forgejo.git
				synced 2025-11-04 00:11:04 +00:00 
			
		
		
		
	[GITEA] Avoid WHERE IN for comment migration query
		
	- Rewrite `UpdateCommentsMigrationsByType` to not use `WHERE IN` as that's a performance diaster for MariaDB, it now use batching to query the the relevant comment IDs via JOINs (which is not possible in a UPDATE query for SQLite) and then update them in a seperate query. - Add unit test. - Resolves https://codeberg.org/forgejo/forgejo/issues/1856 (cherry picked from commit8098ca9d2e) Conflicts: models/issues/comment.go https://codeberg.org/forgejo/forgejo/pulls/2075 (cherry picked from commitca65deba1c) (cherry picked from commit0e1e09e77d) (cherry picked from commit19013ba5ea)
This commit is contained in:
		
					parent
					
						
							
								7b70fa9392
							
						
					
				
			
			
				commit
				
					
						23c887f97e
					
				
			
		
					 1 changed files with 27 additions and 0 deletions
				
			
		| 
						 | 
					@ -12,6 +12,7 @@ import (
 | 
				
			||||||
	repo_model "code.gitea.io/gitea/models/repo"
 | 
						repo_model "code.gitea.io/gitea/models/repo"
 | 
				
			||||||
	"code.gitea.io/gitea/models/unittest"
 | 
						"code.gitea.io/gitea/models/unittest"
 | 
				
			||||||
	user_model "code.gitea.io/gitea/models/user"
 | 
						user_model "code.gitea.io/gitea/models/user"
 | 
				
			||||||
 | 
						"code.gitea.io/gitea/modules/structs"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/stretchr/testify/assert"
 | 
						"github.com/stretchr/testify/assert"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
| 
						 | 
					@ -97,3 +98,29 @@ func TestMigrate_InsertIssueComments(t *testing.T) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	unittest.CheckConsistencyFor(t, &issues_model.Issue{})
 | 
						unittest.CheckConsistencyFor(t, &issues_model.Issue{})
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestUpdateCommentsMigrationsByType(t *testing.T) {
 | 
				
			||||||
 | 
						assert.NoError(t, unittest.PrepareTestDatabase())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						issue := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{ID: 1})
 | 
				
			||||||
 | 
						repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: issue.RepoID})
 | 
				
			||||||
 | 
						comment := unittest.AssertExistsAndLoadBean(t, &issues_model.Comment{ID: 1, IssueID: issue.ID})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Set repository to migrated from Gitea.
 | 
				
			||||||
 | 
						repo.OriginalServiceType = structs.GiteaService
 | 
				
			||||||
 | 
						repo_model.UpdateRepositoryCols(db.DefaultContext, repo, "original_service_type")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Set comment to have an original author.
 | 
				
			||||||
 | 
						comment.OriginalAuthor = "Example User"
 | 
				
			||||||
 | 
						comment.OriginalAuthorID = 1
 | 
				
			||||||
 | 
						comment.PosterID = 0
 | 
				
			||||||
 | 
						_, err := db.GetEngine(db.DefaultContext).ID(comment.ID).Cols("original_author", "original_author_id", "poster_id").Update(comment)
 | 
				
			||||||
 | 
						assert.NoError(t, err)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						assert.NoError(t, issues_model.UpdateCommentsMigrationsByType(db.DefaultContext, structs.GiteaService, "1", 513))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						comment = unittest.AssertExistsAndLoadBean(t, &issues_model.Comment{ID: 1, IssueID: issue.ID})
 | 
				
			||||||
 | 
						assert.Empty(t, comment.OriginalAuthor)
 | 
				
			||||||
 | 
						assert.Empty(t, comment.OriginalAuthorID)
 | 
				
			||||||
 | 
						assert.EqualValues(t, 513, comment.PosterID)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue