dnscontrol/providers/gcloud/retry.go

95 lines
2.7 KiB
Go
Raw Normal View History

Squashed commit of the following: commit 901a3ac1c9ec93d504b7de48f0134ebb466a87f1 Author: Tom Limoncelli <tlimoncelli@stackoverflow.com> Date: Tue Jan 21 14:43:33 2025 -0500 CHORE: Update dependencies (#3397) commit 70e96590142bfd8084e874bf1666c8d3dd795a03 Author: Tom Limoncelli <tlimoncelli@stackoverflow.com> Date: Tue Jan 21 14:29:53 2025 -0500 MSDNS: Provider is failing due to lint fix gone wrong (#3396) commit 5e15bbe676332beaeae1a3838450b2d6f3e678f2 Author: Jakob Ackermann <das7pad@outlook.com> Date: Sat Jan 18 13:54:37 2025 +0000 BUG: fetch zones once in ZoneCache (#3394) commit a631c5bfdd5a46cbf4046232b3ad8858949c6794 Author: Kai Schwarz <kai.schwarz@centralnic.com> Date: Fri Jan 17 20:15:10 2025 +0100 CNR: Initial Performance improvement; golint review (#3391) commit e1c9785159df631a1991f5d8b2569e0d6b5c45a9 Author: Tom Limoncelli <tlimoncelli@stackoverflow.com> Date: Fri Jan 17 07:11:10 2025 -0500 CHORE: Update dependencies (#3385) commit 9e88b6a801e49260f1615469396cc8d9ed0371cc Author: Tom Limoncelli <tlimoncelli@stackoverflow.com> Date: Thu Jan 16 21:47:10 2025 -0500 CICD: Make pager tests more visible (#3387) commit 67db0e287da5818757e042a9cc4818db2fda2b4d Author: Tom Limoncelli <tlimoncelli@stackoverflow.com> Date: Thu Jan 16 14:41:18 2025 -0500 GCLOUD: remove (irrelevant) slow test (#3384) commit c348e354ff7f4ee6c996490e3236594e4b6f60a5 Author: Tom Limoncelli <tlimoncelli@stackoverflow.com> Date: Thu Jan 16 14:32:32 2025 -0500 GCLOUD: CICD: Skip the pager1201 integration test (#3383) commit 5cfb9073a20026294159d91f69156a52125515bc Author: Tom Limoncelli <tlimoncelli@stackoverflow.com> Date: Thu Jan 16 14:17:47 2025 -0500 TRANSIP: Pause when rate-limited (#3378) commit f666af8714267efe0b931b6f84565fea1341d919 Author: Tom Limoncelli <tlimoncelli@stackoverflow.com> Date: Thu Jan 16 13:56:46 2025 -0500 GCLOUD: Re-try on 502 errors (#3376) commit 1a1a4bf00d7d6402471525f4d0d8676e3b689ec1 Author: Tom Limoncelli <tlimoncelli@stackoverflow.com> Date: Thu Jan 16 12:54:48 2025 -0500 INWX: Enable SRV to have "." target (#3380) commit 355643988ef90ed71becb1e42f4f976b01e39a02 Author: Tom Limoncelli <tlimoncelli@stackoverflow.com> Date: Thu Jan 16 10:58:11 2025 -0500 CLOUDFLAREAPI: No longer treat TTL=300 as special (#3368) Co-authored-by: Sukka <github@skk.moe> commit 89c65b6683f5752a5435ac2d9dfc66da5ccb76b8 Author: Tom Limoncelli <tlimoncelli@stackoverflow.com> Date: Thu Jan 16 10:03:00 2025 -0500 INWX: Permit "." target for SRV records (#3377) commit fc2c5069202fb8d2e1eb70aba5dde103afc16022 Author: Tom Limoncelli <tlimoncelli@stackoverflow.com> Date: Wed Jan 15 18:28:15 2025 -0500 CICD: Warn user if -provider does not match profiles.json:TYPE (#3375) commit 0d5b3c22b72db6a9e01630937409c5e45f82f8b3 Author: Jakob Ackermann <das7pad@outlook.com> Date: Wed Jan 15 22:43:24 2025 +0000 CLOUDFLARE: adopt ZoneCache (#3373) commit 2ef23621b5fbf0652a4eb5c7c86fba56444e3644 Author: Jakob Ackermann <das7pad@outlook.com> Date: Wed Jan 15 20:23:02 2025 +0000 HETZNER: adopt ZoneCache (#3372) commit ab00797f89b598a391a428e24f2a05332ed109a3 Author: Tom Hughes <tom@compton.nu> Date: Wed Jan 15 02:07:19 2025 +0000 FEATURE: Extend PTR magic handling to support RFC4183 names (#3364) commit 5c9b17039e05cbdb66d2aa954e6dbdfbc0b007c0 Author: Jakob Ackermann <das7pad@outlook.com> Date: Wed Jan 15 02:05:17 2025 +0000 FEAT: Add ZoneCache primitive (#3365)
2025-01-22 05:24:46 +08:00
package gcloud
import (
"log"
"time"
"google.golang.org/api/googleapi"
)
const (
initialBackoff = time.Second * 10 // First delay duration
maxBackoff = time.Minute * 3 // Maximum backoff delay
)
// backoff is the amount of time to sleep if a 429 or 504 is received.
// It is doubled after each use.
var (
backoff = initialBackoff
backoff404 = false // Set if the last call requested a retry of a 404
backoff502 = false // Set if the last call requested a retry of a 502
)
func retryNeeded(resp *googleapi.ServerResponse, err error) bool {
if err == nil {
return false // Not an error.
}
serr, ok := err.(*googleapi.Error)
if !ok {
return false // Not a google error.
}
if serr.Code == 200 {
backoff = initialBackoff // Reset
return false // Success! No need to retry.
}
if serr.Code == 404 {
// serr.Code == 404 happens occasionally when GCLOUD hasn't
// finished updating the database yet. We pause and retry
// exactly once. There should be a better way to do this, such as
// a callback that would tell us a transaction is complete.
if backoff404 {
backoff404 = false
return false // Give up. We've done this already.
}
log.Printf("Special 404 pause-and-retry for GCLOUD: Pausing %s\n", backoff)
time.Sleep(backoff)
backoff404 = true
return true // Request a retry.
}
backoff404 = false
if serr.Code == 502 {
// serr.Code == 502 happens occasionally when "The server
// encountered a temporary error and could not complete your
// request. Please try again in 30 seconds. Thats all we know."
// We pause and retry exactly once.
if backoff502 {
backoff502 = false
return false // Give up. We've done this already.
}
log.Printf("Special 502 pause-and-retry for GCLOUD: Pausing %s\n", backoff)
time.Sleep(31 * time.Second)
backoff502 = true
return true // Request a retry.
}
backoff502 = false
if serr.Code != 429 && serr.Code != 503 {
return false // Not an error that permits retrying.
}
// TODO(tlim): In theory, resp.Header has a header that says how
// long to wait but I haven't been able to capture that header in
// the wild. If you get these "RUNCHANGE HEAD" messages, please
// file a bug with the contents!
if resp != nil {
log.Printf("NOTE: If you see this message, please file a bug with the output below:\n")
log.Printf("RUNCHANGE CODE = %+v\n", resp.HTTPStatusCode)
log.Printf("RUNCHANGE HEAD = %+v\n", resp.Header)
}
// a simple exponential back-off
log.Printf("Pausing due to ratelimit: %v seconds\n", backoff)
time.Sleep(backoff)
backoff = backoff + (backoff / 2)
if backoff > maxBackoff {
backoff = maxBackoff
}
return true // Request the API call be re-tried.
}