From ab3d43fc75d483a18626456abccfdd198391080e Mon Sep 17 00:00:00 2001 From: vytautas Date: Thu, 26 Aug 2021 07:44:08 +0000 Subject: [PATCH] Break long poll loop early when context remaining timeout is too low --- internal/internal_workflow_client.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/internal/internal_workflow_client.go b/internal/internal_workflow_client.go index d3a160e96..13d66a4f6 100644 --- a/internal/internal_workflow_client.go +++ b/internal/internal_workflow_client.go @@ -49,6 +49,7 @@ var _ DomainClient = (*domainClient)(nil) const ( defaultDecisionTaskTimeoutInSecs = 10 defaultGetHistoryTimeoutInSecs = 25 + minLongPollInterval = 100 * time.Millisecond ) var ( @@ -512,6 +513,15 @@ func (wc *workflowClient) GetWorkflowHistory( var err error Loop: for { + // Stop polling the server if the remaining context timeout is too low. + // This prevents unnessesary final call which will result in a timeout anyway. + if deadline, ok := ctx.Deadline(); ok { + remainingTime := deadline.Sub(time.Now()) + if remainingTime < minLongPollInterval { + return nil, context.DeadlineExceeded + } + } + err = backoff.Retry(ctx, func() error { var err1 error