package daemon import ( "context" "crypto/rand" "encoding/hex" "time" "dev.mediocregopher.com/mediocre-go-lib.git/mlog" ) // until keeps trying fn until it returns nil, returning true. If the context is // canceled then until returns false. func until( ctx context.Context, logger *mlog.Logger, descr string, fn func(context.Context) error, ) bool { for { logger.Info(ctx, descr) err := fn(ctx) if err == nil { return true } else if ctxErr := ctx.Err(); ctxErr != nil { return false } logger.Warn(ctx, descr+" failed, retrying in one second", err) time.Sleep(1 * time.Second) } } func randStr(l int) string { b := make([]byte, l) if _, err := rand.Read(b); err != nil { panic(err) } return hex.EncodeToString(b) }