mirror of
				https://codeberg.org/forgejo/forgejo.git
				synced 2025-10-31 14:31:02 +00:00 
			
		
		
		
	Backport #22422 The current code propagates all errors up to the iteration step meaning that a single malformed repo will prevent GC of other repos. This PR simply stops that propagation. Fix #21605 Signed-off-by: Andrew Thornton <art27@cantab.net>
This commit is contained in:
		
					parent
					
						
							
								3ad62127df
							
						
					
				
			
			
				commit
				
					
						2f91a12143
					
				
			
		
					 1 changed files with 34 additions and 27 deletions
				
			
		|  | @ -73,32 +73,8 @@ func GitGcRepos(ctx context.Context, timeout time.Duration, args ...git.CmdArg) | ||||||
| 				return db.ErrCancelledf("before GC of %s", repo.FullName()) | 				return db.ErrCancelledf("before GC of %s", repo.FullName()) | ||||||
| 			default: | 			default: | ||||||
| 			} | 			} | ||||||
| 			log.Trace("Running git gc on %v", repo) | 			// we can ignore the error here because it will be logged in GitGCRepo | ||||||
| 			command := git.NewCommand(ctx, args...). | 			_ = GitGcRepo(ctx, repo, timeout, args) | ||||||
| 				SetDescription(fmt.Sprintf("Repository Garbage Collection: %s", repo.FullName())) |  | ||||||
| 			var stdout string |  | ||||||
| 			var err error |  | ||||||
| 			stdout, _, err = command.RunStdString(&git.RunOpts{Timeout: timeout, Dir: repo.RepoPath()}) |  | ||||||
| 
 |  | ||||||
| 			if err != nil { |  | ||||||
| 				log.Error("Repository garbage collection failed for %v. Stdout: %s\nError: %v", repo, stdout, err) |  | ||||||
| 				desc := fmt.Sprintf("Repository garbage collection failed for %s. Stdout: %s\nError: %v", repo.RepoPath(), stdout, err) |  | ||||||
| 				if err = system_model.CreateRepositoryNotice(desc); err != nil { |  | ||||||
| 					log.Error("CreateRepositoryNotice: %v", err) |  | ||||||
| 				} |  | ||||||
| 				return fmt.Errorf("Repository garbage collection failed in repo: %s: Error: %w", repo.FullName(), err) |  | ||||||
| 			} |  | ||||||
| 
 |  | ||||||
| 			// Now update the size of the repository |  | ||||||
| 			if err := repo_module.UpdateRepoSize(ctx, repo); err != nil { |  | ||||||
| 				log.Error("Updating size as part of garbage collection failed for %v. Stdout: %s\nError: %v", repo, stdout, err) |  | ||||||
| 				desc := fmt.Sprintf("Updating size as part of garbage collection failed for %s. Stdout: %s\nError: %v", repo.RepoPath(), stdout, err) |  | ||||||
| 				if err = system_model.CreateRepositoryNotice(desc); err != nil { |  | ||||||
| 					log.Error("CreateRepositoryNotice: %v", err) |  | ||||||
| 				} |  | ||||||
| 				return fmt.Errorf("Updating size as part of garbage collection failed in repo: %s: Error: %w", repo.FullName(), err) |  | ||||||
| 			} |  | ||||||
| 
 |  | ||||||
| 			return nil | 			return nil | ||||||
| 		}, | 		}, | ||||||
| 	); err != nil { | 	); err != nil { | ||||||
|  | @ -109,6 +85,37 @@ func GitGcRepos(ctx context.Context, timeout time.Duration, args ...git.CmdArg) | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // GitGcRepo calls 'git gc' to remove unnecessary files and optimize the local repository | ||||||
|  | func GitGcRepo(ctx context.Context, repo *repo_model.Repository, timeout time.Duration, args []git.CmdArg) error { | ||||||
|  | 	log.Trace("Running git gc on %-v", repo) | ||||||
|  | 	command := git.NewCommand(ctx, args...). | ||||||
|  | 		SetDescription(fmt.Sprintf("Repository Garbage Collection: %s", repo.FullName())) | ||||||
|  | 	var stdout string | ||||||
|  | 	var err error | ||||||
|  | 	stdout, _, err = command.RunStdString(&git.RunOpts{Timeout: timeout, Dir: repo.RepoPath()}) | ||||||
|  | 
 | ||||||
|  | 	if err != nil { | ||||||
|  | 		log.Error("Repository garbage collection failed for %-v. Stdout: %s\nError: %v", repo, stdout, err) | ||||||
|  | 		desc := fmt.Sprintf("Repository garbage collection failed for %s. Stdout: %s\nError: %v", repo.RepoPath(), stdout, err) | ||||||
|  | 		if err := system_model.CreateRepositoryNotice(desc); err != nil { | ||||||
|  | 			log.Error("CreateRepositoryNotice: %v", err) | ||||||
|  | 		} | ||||||
|  | 		return fmt.Errorf("Repository garbage collection failed in repo: %s: Error: %w", repo.FullName(), err) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// Now update the size of the repository | ||||||
|  | 	if err := repo_module.UpdateRepoSize(ctx, repo); err != nil { | ||||||
|  | 		log.Error("Updating size as part of garbage collection failed for %-v. Stdout: %s\nError: %v", repo, stdout, err) | ||||||
|  | 		desc := fmt.Sprintf("Updating size as part of garbage collection failed for %s. Stdout: %s\nError: %v", repo.RepoPath(), stdout, err) | ||||||
|  | 		if err := system_model.CreateRepositoryNotice(desc); err != nil { | ||||||
|  | 			log.Error("CreateRepositoryNotice: %v", err) | ||||||
|  | 		} | ||||||
|  | 		return fmt.Errorf("Updating size as part of garbage collection failed in repo: %s: Error: %w", repo.FullName(), err) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func gatherMissingRepoRecords(ctx context.Context) ([]*repo_model.Repository, error) { | func gatherMissingRepoRecords(ctx context.Context) ([]*repo_model.Repository, error) { | ||||||
| 	repos := make([]*repo_model.Repository, 0, 10) | 	repos := make([]*repo_model.Repository, 0, 10) | ||||||
| 	if err := db.Iterate( | 	if err := db.Iterate( | ||||||
|  | @ -162,7 +169,7 @@ func DeleteMissingRepositories(ctx context.Context, doer *user_model.User) error | ||||||
| 		} | 		} | ||||||
| 		log.Trace("Deleting %d/%d...", repo.OwnerID, repo.ID) | 		log.Trace("Deleting %d/%d...", repo.OwnerID, repo.ID) | ||||||
| 		if err := models.DeleteRepository(doer, repo.OwnerID, repo.ID); err != nil { | 		if err := models.DeleteRepository(doer, repo.OwnerID, repo.ID); err != nil { | ||||||
| 			log.Error("Failed to DeleteRepository %s [%d]: Error: %v", repo.FullName(), repo.ID, err) | 			log.Error("Failed to DeleteRepository %-v: Error: %v", repo, err) | ||||||
| 			if err2 := system_model.CreateRepositoryNotice("Failed to DeleteRepository %s [%d]: Error: %v", repo.FullName(), repo.ID, err); err2 != nil { | 			if err2 := system_model.CreateRepositoryNotice("Failed to DeleteRepository %s [%d]: Error: %v", repo.FullName(), repo.ID, err); err2 != nil { | ||||||
| 				log.Error("CreateRepositoryNotice: %v", err) | 				log.Error("CreateRepositoryNotice: %v", err) | ||||||
| 			} | 			} | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue