@@ -171,23 +171,45 @@ private async Task CleanupDatabase()
171171
172172 if ( oldRunnerIds . Count > 0 )
173173 {
174+ _logger . LogInformation ( $ "Removing { oldRunnerIds . Count } runners older than 30 days from database") ;
175+
176+ // Delete RunnerLifecycles first (they reference runners)
177+ var oldLifecycles = await db . RunnerLifecycles . Where ( rl => oldRunnerIds . Contains ( rl . RunnerId ) ) . ToListAsync ( ) ;
178+ db . RunnerLifecycles . RemoveRange ( oldLifecycles ) ;
179+ await db . SaveChangesAsync ( ) ;
180+
181+ // Break circular dependencies by nulling out foreign keys
174182 var oldRunners = await db . Runners . Where ( r => oldRunnerIds . Contains ( r . RunnerId ) ) . ToListAsync ( ) ;
175- _logger . LogInformation ( $ "Removing { oldRunners . Count } runners older than 30 days from database") ;
183+ var oldJobs = await db . Jobs . Where ( j => oldRunnerIds . Contains ( j . RunnerId . Value ) ) . ToListAsync ( ) ;
184+
185+ // Null out the foreign keys to break circular reference
186+ foreach ( var runner in oldRunners )
187+ {
188+ runner . JobId = null ;
189+ }
190+ foreach ( var job in oldJobs )
191+ {
192+ job . RunnerId = null ;
193+ }
194+ await db . SaveChangesAsync ( ) ;
195+
196+ // Now delete the runners and jobs
176197 db . Runners . RemoveRange ( oldRunners ) ;
198+ db . Jobs . RemoveRange ( oldJobs ) ;
199+ await db . SaveChangesAsync ( ) ;
177200 }
178201
179- // Remove old jobs - only remove completed jobs older than 30 days
180- var oldJobs = await db . Jobs
181- . Where ( j => j . CompleteTime < cutoffTime && j . CompleteTime != DateTime . MinValue )
202+ // Remove old completed jobs - only remove completed jobs older than 30 days
203+ var oldCompletedJobs = await db . Jobs
204+ . Where ( j => j . CompleteTime < cutoffTime && j . CompleteTime != DateTime . MinValue && j . RunnerId == null )
182205 . ToListAsync ( ) ;
183206
184- if ( oldJobs . Count > 0 )
207+ if ( oldCompletedJobs . Count > 0 )
185208 {
186- _logger . LogInformation ( $ "Removing { oldJobs . Count } jobs older than 30 days from database") ;
187- db . Jobs . RemoveRange ( oldJobs ) ;
209+ _logger . LogInformation ( $ "Removing { oldCompletedJobs . Count } completed jobs older than 30 days from database") ;
210+ db . Jobs . RemoveRange ( oldCompletedJobs ) ;
211+ await db . SaveChangesAsync ( ) ;
188212 }
189-
190- await db . SaveChangesAsync ( ) ;
191213 }
192214
193215 private async Task CheckForStuckRunners ( List < GithubTargetConfiguration > targetConfig )
0 commit comments