gh-gei icon indicating copy to clipboard operation
gh-gei copied to clipboard

Retry `createMigrationSource` mutation if it fails without a non-validation error

Open timrogers opened this issue 2 years ago • 1 comments

If the createMigrationSource mutation fails with an response which doesn't indicate a validation error, then we should retry the mutation.

Here's some example CLI output for a timeout - in this case, the HTTP request timed out after 100 seconds:

[11:53] [DEBUG] HTTP POST: https://api.github.com/graphql
[11:53] [DEBUG] HTTP BODY: {"query":"mutation createMigrationSource($name: String!, $url: String!, $ownerId: ID!, $type: MigrationSourceType!) { createMigrationSource(input: {name: $name, url: $url, ownerId: $ownerId, type: $type}) { migrationSource { id, name, url, type } } }","variables":{"name":"GHEC Source","url":"https://github.com","ownerId":"REDACTED","type":"GITHUB_ARCHIVE"},"operationName":"createMigrationSource"}
[11:54] [ERROR] System.Threading.Tasks.TaskCanceledException: The request was canceled due to the configured HttpClient.Timeout of 100 seconds elapsing.
 ---> System.TimeoutException: The operation was canceled.
 ---> System.Threading.Tasks.TaskCanceledException: The operation was canceled.
 ---> System.IO.IOException: Unable to read data from the transport connection: Operation canceled.
 ---> System.Net.Sockets.SocketException (125): Operation canceled
   --- End of inner exception stack trace ---
   at System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.System.Threading.Tasks.Sources.IValueTaskSource<System.Int32>.GetResult(Int16 )
   at System.Net.Security.SslStream.EnsureFullTlsFrameAsync[TIOAdapter](TIOAdapter )
   at System.Net.Security.SslStream.ReadAsyncInternal[TIOAdapter](TIOAdapter , Memory`1 )
   at System.Net.Http.HttpConnection.SendAsyncCore(HttpRequestMessage , Boolean , CancellationToken )
   --- End of inner exception stack trace ---
   at System.Net.Http.HttpConnection.SendAsyncCore(HttpRequestMessage , Boolean , CancellationToken )
   at System.Net.Http.HttpConnectionPool.SendWithVersionDetectionAndRetryAsync(HttpRequestMessage , Boolean , Boolean , CancellationToken )
   at Microsoft.Extensions.Http.Logging.LoggingHttpMessageHandler.SendAsync(HttpRequestMessage , CancellationToken )
   at Microsoft.Extensions.Http.Logging.LoggingScopeHttpMessageHandler.SendAsync(HttpRequestMessage , CancellationToken )
   at System.Net.Http.HttpClient.<SendAsync>g__Core|83_0(HttpRequestMessage , HttpCompletionOption , CancellationTokenSource , Boolean , CancellationTokenSource , CancellationToken )

It's likely that there are other kinds of timeout we could see, for example where a 503 is returned by the load balancer.

It's probably best to just retry any non-validation error type validation.

Todo

  • [ ] ...

Dependencies

  • ...

timrogers avatar Feb 20 '23 14:02 timrogers

See https://github.com/github/gh-gei/issues/792.

timrogers avatar Feb 20 '23 14:02 timrogers