本文整理匯總了Golang中github.com/cenkalti/backoff.Retry函數的典型用法代碼示例。如果您正苦於以下問題:Golang Retry函數的具體用法?Golang Retry怎麽用?Golang Retry使用的例子?那麽, 這裏精選的函數代碼示例或許可以為您提供幫助。
在下文中一共展示了Retry函數的15個代碼示例,這些例子默認根據受歡迎程度排序。您可以為喜歡或者感覺有用的代碼點讚,您的評價將有助於係統推薦出更棒的Golang代碼示例。
示例1: RegisterHTTPForever
// RegisterHTTPForever is just like RegisterHTTP however it first tries to
// register forever until a response from kontrol is received. It's useful to
// use it during app initializations. After the registration a reconnect is
// automatically handled inside the RegisterHTTP method.
func (k *Kite) RegisterHTTPForever(kiteURL *url.URL) {
// Create the httpBackoffRegister that RegisterHTTPForever will
// use to backoff repeated register attempts.
httpRegisterBackOff := backoff.NewExponentialBackOff()
httpRegisterBackOff.InitialInterval = 30 * time.Second
httpRegisterBackOff.MaxInterval = 5 * time.Minute
httpRegisterBackOff.Multiplier = 1.7
httpRegisterBackOff.MaxElapsedTime = 0
register := func() error {
_, err := k.RegisterHTTP(kiteURL)
if err != nil {
k.Log.Error("Cannot register to Kontrol: %s Will retry after %d seconds",
err,
httpRegisterBackOff.NextBackOff()/time.Second)
return err
}
return nil
}
// this will retry register forever
err := backoff.Retry(register, httpRegisterBackOff)
if err != nil {
k.Log.Error("BackOff stopped retrying with Error '%s'", err)
}
}
示例2: refreshFromSource
func refreshFromSource() {
certData := bytes.NewBuffer([]byte{})
bo := backoff.NewExponentialBackOff()
bo.MaxElapsedTime = time.Minute
err := backoff.Retry(func() error {
src, err := http.Get(certDataSource)
if err != nil {
return err
}
defer src.Body.Close()
license, cvsID, objects := cert.ParseInput(src.Body)
fmt.Fprint(certData, license)
if len(cvsID) > 0 {
fmt.Fprint(certData, "CVS_ID "+cvsID+"\n")
}
cert.OutputTrustedCerts(certData, objects)
return nil
}, bo)
if err != nil {
log.Fatal(err)
}
saveToCache(strconv.FormatInt(time.Now().UTC().Unix(), 10), certData.Bytes())
latestCertificates = certData.Bytes()
}
示例3: makeImageRequest
func (as *APISelector) makeImageRequest(urlString string, bodyLines []string) (*apiSelectorImageResponse, error) {
var responseBody []byte
b := backoff.NewExponentialBackOff()
b.MaxInterval = 10 * time.Second
b.MaxElapsedTime = time.Minute
err := backoff.Retry(func() (err error) {
resp, err := http.Post(urlString, imageAPIRequestContentType,
strings.NewReader(strings.Join(bodyLines, "\n")+"\n"))
if err != nil {
return err
}
defer resp.Body.Close()
responseBody, err = ioutil.ReadAll(resp.Body)
return
}, b)
if err != nil {
return nil, err
}
imageResp := &apiSelectorImageResponse{
Data: []*apiSelectorImageRef{},
}
err = json.Unmarshal(responseBody, imageResp)
if err != nil {
return nil, err
}
return imageResp, nil
}
示例4: makeRequest
func (c *Client) makeRequest(request *batch) {
payload, err := json.Marshal(request)
if err != nil {
log.Printf("[Error] Batch failed to marshal: %v - %v", request, err)
return
}
bodyReader := bytes.NewReader(payload)
b := backoff.NewExponentialBackOff()
b.MaxElapsedTime = 10 * time.Second
err = backoff.Retry(func() error {
resp, err := http.Post(c.BaseEndpoint+"/v1/set", "application/json", bodyReader)
if err != nil {
return err
}
defer resp.Body.Close()
response := map[string]interface{}{}
dec := json.NewDecoder(resp.Body)
dec.Decode(&response)
if resp.StatusCode != http.StatusOK {
return fmt.Errorf("HTTP Post Request Failed, Status Code %d: %v", resp.StatusCode, response)
}
return nil
}, b)
if err != nil {
log.Printf("[Error] %v", err)
return
}
}
示例5: isPreempted
func (i *gceInstance) isPreempted(ctx gocontext.Context) (bool, error) {
if !i.ic.Preemptible {
return false, nil
}
listOpCall := i.provider.client.GlobalOperations.AggregatedList(i.provider.projectID).
Filter(fmt.Sprintf("targetId eq %d", i.instance.Id))
b := backoff.NewExponentialBackOff()
b.InitialInterval = 1 * time.Second
b.MaxElapsedTime = 1 * time.Minute
var preempted bool
err := backoff.Retry(func() error {
i.provider.apiRateLimit(ctx)
list, err := listOpCall.Do()
if err != nil {
return err
}
for _, item := range list.Items {
for _, op := range item.Operations {
if op.Kind == "compute#operation" && op.OperationType == "compute.instances.preempted" {
preempted = true
return nil
}
}
}
return nil
}, b)
return preempted, err
}
示例6: Run
func (s *stepGenerateScript) Run(state multistep.StateBag) multistep.StepAction {
buildJob := state.Get("buildJob").(Job)
ctx := state.Get("ctx").(gocontext.Context)
b := backoff.NewExponentialBackOff()
b.MaxInterval = 10 * time.Second
b.MaxElapsedTime = time.Minute
var script []byte
err := backoff.Retry(func() (err error) {
script, err = s.generator.Generate(ctx, buildJob.RawPayload())
return
}, b)
if err != nil {
context.LoggerFromContext(ctx).WithField("err", err).Error("couldn't generate build script, erroring job")
err := buildJob.Error(ctx, "An error occurred while generating the build script.")
if err != nil {
context.LoggerFromContext(ctx).WithField("err", err).Error("couldn't requeue job")
}
return multistep.ActionHalt
}
context.LoggerFromContext(ctx).Info("generated script")
state.Put("script", script)
return multistep.ActionContinue
}
示例7: makeJobBoardImagesRequest
func makeJobBoardImagesRequest(urlString string) (*jobBoardImagesResponse, error) {
var responseBody []byte
b := backoff.NewExponentialBackOff()
b.MaxInterval = 10 * time.Second
b.MaxElapsedTime = time.Minute
err := backoff.Retry(func() (err error) {
resp, err := http.Get(urlString)
if err != nil {
return err
}
defer resp.Body.Close()
responseBody, err = ioutil.ReadAll(resp.Body)
return
}, b)
if err != nil {
return nil, err
}
imageResp := &jobBoardImagesResponse{
Data: []*jobBoardImageRef{},
}
err = json.Unmarshal(responseBody, imageResp)
if err != nil {
return nil, err
}
return imageResp, nil
}
示例8: retryTask
func retryTask(c context.Context, ds appwrap.Datastore, taskIntf TaskInterface, jobKey *datastore.Key, taskKey *datastore.Key) error {
var job JobInfo
if j, err := getJob(ds, jobKey); err != nil {
return fmt.Errorf("getting job: %s", err)
} else {
job = j
}
time.Sleep(time.Duration(job.RetryCount) * 5 * time.Second)
if err := backoff.Retry(func() error {
var task JobTask
if err := ds.Get(taskKey, &task); err != nil {
return fmt.Errorf("getting task: %s", err)
}
task.Status = TaskStatusPending
if _, err := ds.Put(taskKey, &task); err != nil {
return fmt.Errorf("putting task: %s", err)
} else if err := taskIntf.PostTask(c, task.Url, job.JsonParameters); err != nil {
return fmt.Errorf("enqueuing task: %s", err)
}
logInfo(c, "retrying task %d/%d", task.Retries, job.RetryCount)
return nil
}, mrBackOff()); err != nil {
logInfo(c, "retryTask() failed after backoff attempts")
return err
} else {
return nil
}
}
示例9: listenForNodeChanges
// listenForNodeChanges listens for changes to node status using change feeds.
// This function will block until the query fails
func (c *Cluster) listenForNodeChanges() error {
// Start listening to changes from a random active node
node, hpr, err := c.GetNextNode()
if err != nil {
return err
}
q, err := newQuery(
DB("rethinkdb").Table("server_status").Changes(),
map[string]interface{}{},
c.opts,
)
if err != nil {
return fmt.Errorf("Error building query: %s", err)
}
cursor, err := node.Query(q)
if err != nil {
hpr.Mark(err)
return err
}
// Keep reading node status updates from changefeed
var result struct {
NewVal nodeStatus `gorethink:"new_val"`
OldVal nodeStatus `gorethink:"old_val"`
}
for cursor.Next(&result) {
addr := fmt.Sprintf("%s:%d", result.NewVal.Network.Hostname, result.NewVal.Network.ReqlPort)
addr = strings.ToLower(addr)
switch result.NewVal.Status {
case "connected":
// Connect to node using exponential backoff (give up after waiting 5s)
// to give the node time to start-up.
b := backoff.NewExponentialBackOff()
b.MaxElapsedTime = time.Second * 5
backoff.Retry(func() error {
node, err := c.connectNodeWithStatus(result.NewVal)
if err == nil {
if !c.nodeExists(node) {
c.addNode(node)
Log.WithFields(logrus.Fields{
"id": node.ID,
"host": node.Host.String(),
}).Debug("Connected to node")
}
}
return err
}, b)
}
}
err = cursor.Err()
hpr.Mark(err)
return err
}
示例10: watch
func watch(src string) error {
loc, err := storage.ParseLocation(src)
if err != nil {
return err
}
watcher, err := sync.Watch(loc)
if err != nil {
return err
}
defer watcher.Stop()
// TODO: a better approach here would be to use a channel to retry on,
// then if you jacked up the config, it would pick up the change
// in the middle of all the retries. As it stands now it would take a
// minute to fix itself.
eb := backoff.NewExponentialBackOff()
eb.MaxElapsedTime = time.Minute
for range watcher.C {
log.Println("[watch] new version")
backoff.Retry(func() error {
err := apply(src)
if err != nil {
log.Printf("[watch] error installing: %v\n", err)
}
return err
}, eb)
}
return nil
}
示例11: main
func main() {
flag.Parse()
args := flag.Args()
if len(args) == 0 {
usage()
}
var b []byte
operation := func() error {
var err error
b, err = exec.Command(flag.Arg(0), args[1:]...).Output()
if err != nil {
log.Printf("err: %s", err)
}
return err
}
bf := backoff.NewExponentialBackOff()
second := func(i int) time.Duration {
return time.Duration(i) * time.Second
}
bf.MaxElapsedTime = second(*flagMaxElapsedTime)
bf.MaxInterval = second(*flagMaxInterval)
bf.InitialInterval = second(*flagInitialInterval)
err := backoff.Retry(operation, bf)
if err != nil {
fmt.Fprintf(os.Stderr, "operation failed: %s\n", err)
os.Exit(1)
}
fmt.Fprint(os.Stdout, string(b))
os.Exit(0)
}
示例12: Add
func (b *Bridge) Add(containerId string) {
b.Lock()
defer b.Unlock()
container, err := b.docker.InspectContainer(containerId)
if err != nil {
log.Println("docksul: unable to inspect container:", containerId, err)
return
}
portDefs := make([][]string, 0)
for port, published := range container.NetworkSettings.Ports {
if len(published) > 0 {
p := strings.Split(string(port), "/")
portDefs = append(portDefs, []string{published[0].HostPort, p[0], p[1]})
}
}
multiservice := len(portDefs) > 1
for _, port := range portDefs {
service := b.buildService(container, port[0], port[1], port[2], multiservice)
err := backoff.Retry(func() error {
return b.consul.Agent().ServiceRegister(service)
}, backoff.NewExponentialBackoff())
if err != nil {
log.Println("docksul: unable to register service:", service, err)
continue
}
b.services[container.ID] = append(b.services[container.ID], service)
log.Println("docksul: added:", container.ID[:12], service.ID)
}
}
示例13: connect
func (s *Sender) connect() {
for s.conn == nil {
var conn *conn
var err error
connect := func() error {
log.Printf("Connecting to %v", s.addr)
conn, err = newConn(s.addr, s.cert)
if err != nil {
log.Printf("Failed connecting to %v: %v; will retry", s.addr, err)
return err
}
return nil
}
if backoff.Retry(connect, backoff.NewExponentialBackOff()) != nil {
continue
}
log.Printf("Connected to %v", s.addr)
go s.read(conn)
s.conn = conn
}
}
示例14: main
// main reads configs, starts all gouroutines and waits until a message is in channel stop.
func main() {
backoff.Retry(testWebGuiPost, backoff.NewExponentialBackOff())
// Attempt to increase the limit on number of open files to the maximum allowed.
MaximizeOpenFileLimit()
allFolders := getFolders()
folders := filterFolders(allFolders)
if len(folders) == 0 {
log.Fatalln("No folders to be watched, exiting...")
}
stChans := make(map[string]chan STEvent, len(folders))
for _, folder := range folders {
Debug.Println("Installing watch for " + folder.Label)
stChan := make(chan STEvent)
stChans[folder.ID] = stChan
go watchFolder(folder, stChan)
}
// Note: Lose thread ownership of stChans
go watchSTEvents(stChans, allFolders)
go listenForSighup()
code := <-stop
OK.Println("Exiting")
os.Exit(code)
}
示例15: createUnitWithRetry
// createUnitWithRetry wraps CreateUnit of the fleet API with a retry.
func (f *FleetTunnel) createUnitWithRetry(unit *schema.Unit) error {
op := func() error {
return maskAny(f.cAPI.CreateUnit(unit))
}
if err := backoff.Retry(op, backoff.NewExponentialBackOff()); err != nil {
return maskAny(err)
}
return nil
}