in awstesting/integration/performance/s3UploadManager/main.go [24:104]
func main() {
parseCommandLine()
log.SetOutput(os.Stderr)
var (
file *os.File
err error
)
if config.Filename != "" {
file, err = os.Open(config.Filename)
if err != nil {
log.Fatalf("failed to open file: %v", err)
}
} else {
file, err = integration.CreateFileOfSize(config.TempDir, config.Size)
if err != nil {
log.Fatalf("failed to create file: %v", err)
}
defer os.Remove(file.Name())
}
defer file.Close()
traces := make(chan *RequestTrace, config.SDK.Concurrency)
requestTracer := uploadRequestTracer(traces)
uploader := newUploader(config.Client, config.SDK, requestTracer)
metricReportDone := make(chan struct{})
go func() {
defer close(metricReportDone)
metrics := map[string]*RequestTrace{}
for trace := range traces {
curTrace, ok := metrics[trace.Operation]
if !ok {
curTrace = trace
} else {
curTrace.attempts = append(curTrace.attempts, trace.attempts...)
if len(trace.errs) != 0 {
curTrace.errs = append(curTrace.errs, trace.errs...)
}
curTrace.finish = trace.finish
}
metrics[trace.Operation] = curTrace
}
for _, name := range []string{
"CreateMultipartUpload",
"CompleteMultipartUpload",
"UploadPart",
"PutObject",
} {
if trace, ok := metrics[name]; ok {
printAttempts(name, trace, config.LogVerbose)
}
}
}()
log.Println("starting upload...")
start := time.Now()
_, err = uploader.Upload(&s3manager.UploadInput{
Bucket: &config.Bucket,
Key: aws.String(filepath.Base(file.Name())),
Body: file,
})
if err != nil {
log.Fatalf("failed to upload object, %v", err)
}
close(traces)
fileInfo, _ := file.Stat()
size := fileInfo.Size()
dur := time.Since(start)
log.Printf("Upload finished, Size: %d, Dur: %s, Throughput: %.5f GB/s",
size, dur, (float64(size)/(float64(dur)/float64(time.Second)))/float64(1e9),
)
<-metricReportDone
}