func()

in pkg/aws/ec2/api/wrapper.go [724:778]


func (e *ec2Wrapper) DescribeNetworkInterfacesPagesWithRetry(input *ec2.DescribeNetworkInterfacesInput) ([]*ec2types.NetworkInterface, error) {
	if input.MaxResults == nil {
		input.MaxResults = aws.Int32(int32(vpc_rc_config.DescribeNetworkInterfacesMaxResults))
	}

	start := time.Now()
	defer func() {
		ec2APICallLatencies.WithLabelValues("describe_network_interfaces_pages").Observe(timeSinceMs(start))
	}()

	var apiError error
	for attempt := 1; attempt <= MaxRetries; attempt++ {
		attemptInterfaces := make([]*ec2types.NetworkInterface, 0, vpc_rc_config.DescribeNetworkInterfacesMaxResults)

		paginator := ec2.NewDescribeNetworkInterfacesPaginator(e.userServiceClient, input)

		for paginator.HasMorePages() {
			output, err := paginator.NextPage(context.TODO())
			if err != nil {
				ec2APIErrCnt.Inc()
				ec2DescribeNetworkInterfacesPagesAPIErrCnt.Inc()
				apiError = err

				var ae smithy.APIError
				if errors.As(err, &ae) && ae.ErrorCode() == "Throttling" && attempt < MaxRetries {
					e.log.Info("Throttling error, will retry", "attempt", attempt)
					backoff := time.Duration(attempt) * 500 * time.Millisecond
					time.Sleep(wait.Jitter(backoff, 0.1))
					goto Retry
				}
				return nil, err
			}

			ec2APICallCnt.Inc()
			ec2DescribeNetworkInterfacesPagesAPICallCnt.Inc()

			for _, nwInterface := range output.NetworkInterfaces {
				attemptInterfaces = append(attemptInterfaces, &ec2types.NetworkInterface{
					NetworkInterfaceId: nwInterface.NetworkInterfaceId,
					TagSet:             nwInterface.TagSet,
					Attachment:         nwInterface.Attachment,
				})
			}

			time.Sleep(wait.Jitter(100*time.Millisecond, 0.2))
		}

		return attemptInterfaces, nil

	Retry:
		continue
	}

	return nil, apiError
}