in awstesting/integration/performance/s3GetObject/main.go [29:115]
func main() {
if err := flag.CommandLine.Parse(os.Args[1:]); err != nil {
flag.CommandLine.PrintDefaults()
exitErrorf(err, "failed to parse CLI commands")
}
if err := config.Validate(); err != nil {
flag.CommandLine.PrintDefaults()
exitErrorf(err, "invalid arguments")
}
client := NewClient(config.Client)
var creds *credentials.Credentials
if config.SDK.Anonymous {
creds = credentials.AnonymousCredentials
}
var endpoint *string
if v := config.Endpoint; len(v) != 0 {
endpoint = &v
}
sess, err := session.NewSession(&aws.Config{
HTTPClient: client,
Endpoint: endpoint,
Credentials: creds,
S3Disable100Continue: aws.Bool(!config.SDK.ExpectContinue),
})
if err != nil {
exitErrorf(err, "failed to load config")
}
// Create context cancel for Ctrl+C/Interrupt
ctx, cancelFn := context.WithCancel(context.Background())
defer cancelFn()
sigCh := make(chan os.Signal, 1)
signal.Notify(sigCh, os.Interrupt)
go func() {
<-sigCh
cancelFn()
}()
// Use the request duration timeout if specified.
if config.RequestDuration != 0 {
var timeoutFn func()
ctx, timeoutFn = context.WithTimeout(ctx, config.RequestDuration)
defer timeoutFn()
}
logger := NewLogger(os.Stdout)
// Start making the requests.
svc := s3.New(sess)
var reqCount int64
errCount := 0
for {
trace := doRequest(ctx, reqCount, svc, config)
select {
case <-ctx.Done():
return
default:
}
logger.RecordTrace(trace)
if err := trace.Err(); err != nil {
fmt.Fprintf(os.Stderr, err.Error())
errCount++
} else {
errCount = 0
}
if config.RequestCount > 0 && reqCount == config.RequestCount {
return
}
reqCount++
// If the first several requests fail, exist, something is broken.
if errCount == 5 && reqCount == 5 {
exitErrorf(trace.Err(), "unable to make requests")
}
if config.RequestDelay > 0 {
time.Sleep(config.RequestDelay)
}
}
}