mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 16:40:24 +08:00 
			
		
		
		
	Backport #28409 by @earl-warren - Currently there's code to recover gracefully from panics that happen within the execution of cron tasks. However this recover code wasn't being run, because `RunWithShutdownContext` also contains code to recover from any panic and then gracefully shutdown Forgejo. Because `RunWithShutdownContext` registers that code as last, that would get run first which in this case is not behavior that we want. - Move the recover code to inside the function, so that is run first before `RunWithShutdownContext`'s recover code (which is now a noop). Fixes: https://codeberg.org/forgejo/forgejo/issues/1910 Co-authored-by: Earl Warren <109468362+earl-warren@users.noreply.github.com> Co-authored-by: Gusted <postmaster@gusted.xyz>
This commit is contained in:
		@@ -84,13 +84,15 @@ func (t *Task) RunWithUser(doer *user_model.User, config Config) {
 | 
				
			|||||||
	t.lock.Unlock()
 | 
						t.lock.Unlock()
 | 
				
			||||||
	defer func() {
 | 
						defer func() {
 | 
				
			||||||
		taskStatusTable.Stop(t.Name)
 | 
							taskStatusTable.Stop(t.Name)
 | 
				
			||||||
		if err := recover(); err != nil {
 | 
					 | 
				
			||||||
			// Recover a panic within the
 | 
					 | 
				
			||||||
			combinedErr := fmt.Errorf("%s\n%s", err, log.Stack(2))
 | 
					 | 
				
			||||||
			log.Error("PANIC whilst running task: %s Value: %v", t.Name, combinedErr)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}()
 | 
						}()
 | 
				
			||||||
	graceful.GetManager().RunWithShutdownContext(func(baseCtx context.Context) {
 | 
						graceful.GetManager().RunWithShutdownContext(func(baseCtx context.Context) {
 | 
				
			||||||
 | 
							defer func() {
 | 
				
			||||||
 | 
								if err := recover(); err != nil {
 | 
				
			||||||
 | 
									// Recover a panic within the execution of the task.
 | 
				
			||||||
 | 
									combinedErr := fmt.Errorf("%s\n%s", err, log.Stack(2))
 | 
				
			||||||
 | 
									log.Error("PANIC whilst running task: %s Value: %v", t.Name, combinedErr)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}()
 | 
				
			||||||
		// Store the time of this run, before the function is executed, so it
 | 
							// Store the time of this run, before the function is executed, so it
 | 
				
			||||||
		// matches the behavior of what the cron library does.
 | 
							// matches the behavior of what the cron library does.
 | 
				
			||||||
		t.lock.Lock()
 | 
							t.lock.Lock()
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user