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
}