refactor: update task refund logic and remove legacy handling

This commit is contained in:
CaIon
2026-07-26 20:47:52 +08:00
parent 2d23cdf291
commit bc14c18f60
6 changed files with 64 additions and 310 deletions
-105
View File
@@ -256,108 +256,3 @@ func TestUpdateWithStatus_ConcurrentWinner(t *testing.T) {
}
assert.Equal(t, 1, winCount, "exactly one goroutine should win the CAS")
}
func TestClaimQuotaForRefund_OnlyOneClaimSucceeds(t *testing.T) {
truncateTables(t)
task := &Task{
TaskID: "task_refund_claim",
Status: TaskStatusFailure,
Quota: 1000,
Data: json.RawMessage(`{}`),
}
insertTask(t, task)
claimed, err := ClaimQuotaForRefund(task.ID, task.Quota)
require.NoError(t, err)
assert.True(t, claimed)
claimed, err = ClaimQuotaForRefund(task.ID, task.Quota)
require.NoError(t, err)
assert.False(t, claimed)
var reloaded Task
require.NoError(t, DB.First(&reloaded, task.ID).Error)
assert.Zero(t, reloaded.Quota)
}
func TestGetUnrefundedFailedTasks_FiltersAndLimits(t *testing.T) {
truncateTables(t)
tasks := []*Task{
{TaskID: "failed_refundable_1", Status: TaskStatusFailure, Quota: 100, SubmitTime: TaskRefundLegacyCutoff, Data: json.RawMessage(`{}`)},
{TaskID: "failed_refundable_2", Status: TaskStatusFailure, Quota: 200, SubmitTime: TaskRefundLegacyCutoff + 1, Data: json.RawMessage(`{}`)},
{TaskID: "legacy_failed", Status: TaskStatusFailure, Quota: 400, SubmitTime: TaskRefundLegacyCutoff - 1, Data: json.RawMessage(`{}`)},
{TaskID: "failed_without_quota", Status: TaskStatusFailure, Quota: 0, Data: json.RawMessage(`{}`)},
{TaskID: "successful_with_quota", Status: TaskStatusSuccess, Quota: 300, Data: json.RawMessage(`{}`)},
}
for _, task := range tasks {
insertTask(t, task)
}
updatedBefore := time.Now().Unix() + 1
found := GetUnrefundedFailedTasks(updatedBefore, 1)
require.Len(t, found, 1)
assert.Equal(t, tasks[0].ID, found[0].ID)
found = GetUnrefundedFailedTasks(updatedBefore, 10)
require.Len(t, found, 2)
assert.Equal(t, []int64{tasks[0].ID, tasks[1].ID}, []int64{found[0].ID, found[1].ID})
assert.Empty(t, GetUnrefundedFailedTasks(updatedBefore, 0))
}
func TestRestoreQuotaAfterFailedRefund_OnlyRestoresClaimedMarker(t *testing.T) {
truncateTables(t)
task := &Task{
TaskID: "task_refund_restore",
Status: TaskStatusFailure,
Quota: 750,
Data: json.RawMessage(`{}`),
}
insertTask(t, task)
claimed, err := ClaimQuotaForRefund(task.ID, task.Quota)
require.NoError(t, err)
require.True(t, claimed)
restored, err := RestoreQuotaAfterFailedRefund(task.ID, task.Quota)
require.NoError(t, err)
assert.True(t, restored)
restored, err = RestoreQuotaAfterFailedRefund(task.ID, task.Quota)
require.NoError(t, err)
assert.False(t, restored)
var reloaded Task
require.NoError(t, DB.First(&reloaded, task.ID).Error)
assert.Equal(t, task.Quota, reloaded.Quota)
}
func TestHasTaskPollingWork_IncludesOnlyRefundableFailedTasks(t *testing.T) {
truncateTables(t)
assert.False(t, HasTaskPollingWork())
legacy := &Task{
TaskID: "legacy_failed_work",
Status: TaskStatusFailure,
Progress: "100%",
Quota: 500,
SubmitTime: TaskRefundLegacyCutoff - 1,
Data: json.RawMessage(`{}`),
}
insertTask(t, legacy)
assert.False(t, HasTaskPollingWork())
refundable := &Task{
TaskID: "refundable_failed_work",
Status: TaskStatusFailure,
Progress: "100%",
Quota: 500,
SubmitTime: TaskRefundLegacyCutoff,
Data: json.RawMessage(`{}`),
}
insertTask(t, refundable)
assert.True(t, HasTaskPollingWork())
}