51 lines
1.2 KiB
Go
51 lines
1.2 KiB
Go
package loaders
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"fmt"
|
|
"time"
|
|
|
|
"git.ksdemosapps.com/kylesoda/go-migrate/internal/app/config"
|
|
"git.ksdemosapps.com/kylesoda/go-migrate/internal/app/custom_errors"
|
|
"git.ksdemosapps.com/kylesoda/go-migrate/internal/app/models"
|
|
)
|
|
|
|
func (gl *GenericLoader) ProcessBatchWithRetries(
|
|
ctx context.Context,
|
|
tableInfo config.TargetTableInfo,
|
|
colNames []string,
|
|
retryConfig config.RetryConfig,
|
|
batch models.Batch,
|
|
) (int64, error) {
|
|
for {
|
|
rowsLoaded, err := gl.ProcessBatch(ctx, tableInfo, colNames, batch)
|
|
if err == nil {
|
|
return rowsLoaded, nil
|
|
}
|
|
|
|
if btError, ok := errors.AsType[*custom_errors.LoaderError](err); ok {
|
|
batch.RetryCounter++
|
|
|
|
if batch.RetryCounter >= retryConfig.Attempts {
|
|
return rowsLoaded, &custom_errors.JobError{
|
|
ShouldCancelJob: false,
|
|
Msg: fmt.Sprintf("Temporal error in batch %v (retries: %d)", btError.Batch.Id, btError.Batch.RetryCounter),
|
|
Prev: btError,
|
|
}
|
|
}
|
|
|
|
delay := custom_errors.ComputeBackoffDelay(
|
|
batch.RetryCounter,
|
|
retryConfig.BaseDelayMs,
|
|
retryConfig.MaxDelayMs,
|
|
retryConfig.MaxJitterMs,
|
|
)
|
|
time.Sleep(delay)
|
|
continue
|
|
}
|
|
|
|
return rowsLoaded, err
|
|
}
|
|
}
|