69 lines
1.1 KiB
Go
69 lines
1.1 KiB
Go
package custom_errors
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"sync"
|
|
|
|
"git.ksdemosapps.com/kylesoda/go-migrate/internal/app/models"
|
|
)
|
|
|
|
type LoaderError struct {
|
|
models.Chunk
|
|
Msg string
|
|
}
|
|
|
|
func (e *LoaderError) Error() string {
|
|
return e.Msg
|
|
}
|
|
|
|
func LoaderErrorHandler(
|
|
ctx context.Context,
|
|
maxRetryAttempts int,
|
|
chErrorsIn <-chan LoaderError,
|
|
chChunksOut chan<- models.Chunk,
|
|
chJobErrorsOut chan<- JobError,
|
|
wgActiveChunks *sync.WaitGroup,
|
|
) {
|
|
for {
|
|
if ctx.Err() != nil {
|
|
return
|
|
}
|
|
|
|
select {
|
|
case <-ctx.Done():
|
|
return
|
|
|
|
case err, ok := <-chErrorsIn:
|
|
if !ok {
|
|
return
|
|
}
|
|
|
|
if err.RetryCounter >= maxRetryAttempts {
|
|
jobError := JobError{
|
|
ShouldCancelJob: false,
|
|
Msg: fmt.Sprintf("chunk %v reached max retries (%d)", err.Id, maxRetryAttempts),
|
|
Prev: &err,
|
|
}
|
|
|
|
select {
|
|
case chJobErrorsOut <- jobError:
|
|
case <-ctx.Done():
|
|
return
|
|
}
|
|
|
|
wgActiveChunks.Done()
|
|
continue
|
|
}
|
|
|
|
err.RetryCounter++
|
|
|
|
select {
|
|
case chChunksOut <- err.Chunk:
|
|
case <-ctx.Done():
|
|
return
|
|
}
|
|
}
|
|
}
|
|
}
|