diff --git a/go.mod b/go.mod index cc2bddc98..0d3ed6fcf 100644 --- a/go.mod +++ b/go.mod @@ -6,6 +6,7 @@ require ( github.com/AlecAivazis/survey/v2 v2.3.6 github.com/MakeNowJust/heredoc v1.0.0 github.com/briandowns/spinner v1.18.1 + github.com/cenkalti/backoff/v4 v4.1.3 github.com/charmbracelet/glamour v0.5.1-0.20220727184942-e70ff2d969da github.com/charmbracelet/lipgloss v0.5.0 github.com/cli/go-gh v0.1.2 diff --git a/go.sum b/go.sum index e15581064..7e6afd9e3 100644 --- a/go.sum +++ b/go.sum @@ -45,6 +45,8 @@ github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuP github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= github.com/briandowns/spinner v1.18.1 h1:yhQmQtM1zsqFsouh09Bk/jCjd50pC3EOGsh28gLVvwY= github.com/briandowns/spinner v1.18.1/go.mod h1:mQak9GHqbspjC/5iUx3qMlIho8xBS/ppAL/hX5SmPJU= +github.com/cenkalti/backoff/v4 v4.1.3 h1:cFAlzYUlVYDysBEH2T5hyJZMh3+5+WCBvSnK6Q8UtC4= +github.com/cenkalti/backoff/v4 v4.1.3/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/charmbracelet/glamour v0.5.1-0.20220727184942-e70ff2d969da h1:FGz53GWQRiKQ/5xUsoCCkewSQIC7u81Scaxx2nUy3nM= github.com/charmbracelet/glamour v0.5.1-0.20220727184942-e70ff2d969da/go.mod h1:HXz79SMFnF9arKxqeoHWxmo1BhplAH7wehlRhKQIL94= diff --git a/internal/codespaces/codespaces.go b/internal/codespaces/codespaces.go index 6e65b6449..2dc81ba64 100644 --- a/internal/codespaces/codespaces.go +++ b/internal/codespaces/codespaces.go @@ -6,6 +6,7 @@ import ( "fmt" "time" + "github.com/cenkalti/backoff/v4" "github.com/cli/cli/v2/internal/codespaces/api" "github.com/cli/cli/v2/pkg/liveshare" ) @@ -43,13 +44,19 @@ func ConnectToLiveshare(ctx context.Context, progress progressIndicator, session return nil, fmt.Errorf("error starting codespace: %w", err) } } + expBackoff := backoff.NewExponentialBackOff() + + expBackoff.Multiplier = 1.1 + expBackoff.MaxInterval = 10 * time.Second + expBackoff.MaxElapsedTime = 5 * time.Minute for retries := 0; !connectionReady(codespace); retries++ { if retries > 1 { - time.Sleep(1 * time.Second) + duration := expBackoff.NextBackOff() + time.Sleep(duration) } - if retries == 30 { + if expBackoff.GetElapsedTime() >= expBackoff.MaxElapsedTime { return nil, errors.New("timed out while waiting for the codespace to start") }