Improve handling of old/slow-to-start remote renderer (#40492)

* Assume the remote renderer is old if it returns 404 to the version endpoint

* Retry fetch of remote image renderer version on failure

Co-authored-by: Agnès Toulet <35176601+AgnesToulet@users.noreply.github.com>
This commit is contained in:
Jesse Weaver
2021-12-01 08:58:43 -07:00
committed by GitHub
co-authored by Agnès Toulet
parent a365dcca5b
commit be578e5700
3 changed files with 112 additions and 7 deletions
+27 -1
View File
@@ -28,6 +28,11 @@ var netClient = &http.Client{
Transport: netTransport,
}
var (
remoteVersionFetchInterval time.Duration = time.Second * 15
remoteVersionFetchRetries uint = 4
)
func (rs *RenderingService) renderViaHTTP(ctx context.Context, renderKey string, opts Opts) (*RenderResult, error) {
filePath, err := rs.getNewFilePath(RenderPNG)
if err != nil {
@@ -194,6 +199,24 @@ func (rs *RenderingService) readFileResponse(ctx context.Context, resp *http.Res
return nil
}
func (rs *RenderingService) getRemotePluginVersionWithRetry(callback func(string, error)) {
go func() {
var err error
for try := uint(0); try < remoteVersionFetchRetries; try++ {
version, err := rs.getRemotePluginVersion()
if err == nil {
callback(version, err)
return
}
rs.log.Info("Couldn't get remote renderer version, retrying", "err", err, "try", try)
time.Sleep(remoteVersionFetchInterval)
}
callback("", err)
}()
}
func (rs *RenderingService) getRemotePluginVersion() (string, error) {
rendererURL, err := url.Parse(rs.Cfg.RendererUrl + "/version")
if err != nil {
@@ -212,7 +235,10 @@ func (rs *RenderingService) getRemotePluginVersion() (string, error) {
}
}()
if resp.StatusCode != http.StatusOK {
if resp.StatusCode == http.StatusNotFound {
// Old versions of the renderer lacked the version endpoint
return "1.0.0", nil
} else if resp.StatusCode != http.StatusOK {
return "", fmt.Errorf("remote rendering request to get version failed, status code: %d, status: %s", resp.StatusCode,
resp.Status)
}