Skip to content

Commit fb75af3

Browse files
committed
fix: fix status stuck in rendering
1 parent 73c0e12 commit fb75af3

File tree

3 files changed

+102
-0
lines changed

3 files changed

+102
-0
lines changed

cmd/server/main.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,25 @@ func main() {
3434
workerCount := config.AppConfig.RenderWorkerCount
3535
renderer.InitRenderQueue(workerCount)
3636

37+
// Reset any stuck rendering tasks from previous crashes
38+
affected, err := db.ResetStuckRenderingTasks()
39+
if err != nil {
40+
log.Printf("Warning: Failed to reset stuck rendering tasks: %v", err)
41+
} else if affected > 0 {
42+
log.Printf("Reset %d stuck rendering tasks to pending status", affected)
43+
44+
// Re-queue the reset tasks for rendering
45+
var stuckLinks []db.Link
46+
if err := db.DB.Where("render_status = ?", db.RenderStatusPending).Find(&stuckLinks).Error; err != nil {
47+
log.Printf("Warning: Failed to fetch reset tasks for re-queuing: %v", err)
48+
} else {
49+
for _, link := range stuckLinks {
50+
renderer.GlobalRenderQueue.QueueRender(link.ShortCode, link.OriginalURL)
51+
log.Printf("Re-queued reset task for URL: %s (short code: %s)", link.OriginalURL, link.ShortCode)
52+
}
53+
}
54+
}
55+
3756
// Setup graceful shutdown
3857
c := make(chan os.Signal, 1)
3958
signal.Notify(c, os.Interrupt, syscall.SIGTERM)

internal/db/db.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,3 +78,12 @@ func UpdateLinkContent(shortCode string, htmlContent string, status RenderStatus
7878
"render_status": status,
7979
}).Error
8080
}
81+
82+
// ResetStuckRenderingTasks finds all links stuck in rendering status and resets them to pending
83+
func ResetStuckRenderingTasks() (int64, error) {
84+
result := DB.Model(&Link{}).
85+
Where("render_status = ?", RenderStatusRendering).
86+
Update("render_status", RenderStatusPending)
87+
88+
return result.RowsAffected, result.Error
89+
}

internal/db/db_test.go

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -328,3 +328,77 @@ func TestLinkModel(t *testing.T) {
328328
assert.Equal(t, link.RenderedHTMLContent, retrieved.RenderedHTMLContent)
329329
assert.Equal(t, link.RenderStatus, retrieved.RenderStatus)
330330
}
331+
332+
func TestResetStuckRenderingTasks(t *testing.T) {
333+
setupTestDB(t)
334+
defer teardownTestDB(t)
335+
336+
// Create test data with various render statuses
337+
testLinks := []Link{
338+
{
339+
ShortCode: "STUCK1",
340+
OriginalURL: "https://stuck1.com",
341+
RenderStatus: RenderStatusRendering, // This should be reset
342+
},
343+
{
344+
ShortCode: "STUCK2",
345+
OriginalURL: "https://stuck2.com",
346+
RenderStatus: RenderStatusRendering, // This should be reset
347+
},
348+
{
349+
ShortCode: "COMPLETE1",
350+
OriginalURL: "https://complete1.com",
351+
RenderStatus: RenderStatusCompleted, // This should not be affected
352+
},
353+
{
354+
ShortCode: "PENDING1",
355+
OriginalURL: "https://pending1.com",
356+
RenderStatus: RenderStatusPending, // This should not be affected
357+
},
358+
{
359+
ShortCode: "FAILED1",
360+
OriginalURL: "https://failed1.com",
361+
RenderStatus: RenderStatusFailed, // This should not be affected
362+
},
363+
}
364+
365+
// Insert test data
366+
for _, link := range testLinks {
367+
err := CreateLink(&link)
368+
require.NoError(t, err)
369+
}
370+
371+
// Test resetting stuck tasks
372+
affected, err := ResetStuckRenderingTasks()
373+
require.NoError(t, err)
374+
assert.Equal(t, int64(2), affected, "Should have reset exactly 2 stuck tasks")
375+
376+
// Verify the results
377+
for _, link := range testLinks {
378+
updatedLink, err := GetLinkByShortCode(link.ShortCode)
379+
require.NoError(t, err)
380+
381+
switch link.ShortCode {
382+
case "STUCK1", "STUCK2":
383+
// These should have been reset to pending
384+
assert.Equal(t, RenderStatusPending, updatedLink.RenderStatus,
385+
"Stuck task %s should have been reset to pending", link.ShortCode)
386+
default:
387+
// These should remain unchanged
388+
assert.Equal(t, link.RenderStatus, updatedLink.RenderStatus,
389+
"Non-stuck task %s should have remained unchanged", link.ShortCode)
390+
}
391+
}
392+
393+
// Test resetting when no stuck tasks exist
394+
affected, err = ResetStuckRenderingTasks()
395+
require.NoError(t, err)
396+
assert.Equal(t, int64(0), affected, "Should have found no stuck tasks to reset")
397+
398+
// Test with empty database
399+
teardownTestDB(t)
400+
setupTestDB(t)
401+
affected, err = ResetStuckRenderingTasks()
402+
require.NoError(t, err)
403+
assert.Equal(t, int64(0), affected, "Should handle empty database gracefully")
404+
}

0 commit comments

Comments
 (0)