Skip to content

Commit 6cd9346

Browse files
[Perf] adding perf tests back (Azure#17323)
* adding perf tests * build errors
1 parent 833f881 commit 6cd9346

File tree

7 files changed

+499
-0
lines changed

7 files changed

+499
-0
lines changed
Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
1+
// Copyright (c) Microsoft Corporation. All rights reserved.
2+
// Licensed under the MIT License. See License.txt in the project root for license information.
3+
4+
package main
5+
6+
import (
7+
"bytes"
8+
"context"
9+
"flag"
10+
"fmt"
11+
"io"
12+
"os"
13+
14+
"github.com/Azure/azure-sdk-for-go/sdk/internal/perf"
15+
"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob"
16+
)
17+
18+
type downloadTestOptions struct {
19+
size int
20+
}
21+
22+
var downloadTestOpts downloadTestOptions = downloadTestOptions{size: 10240}
23+
24+
// downloadTestRegister is called once per process
25+
func downloadTestRegister() {
26+
flag.IntVar(&downloadTestOpts.size, "size", 10240, "Size in bytes of data to be transferred in upload or download tests. Default is 10240.")
27+
}
28+
29+
type downloadTestGlobal struct {
30+
perf.PerfTestOptions
31+
containerName string
32+
blobName string
33+
}
34+
35+
// NewDownloadTest is called once per process
36+
func NewDownloadTest(ctx context.Context, options perf.PerfTestOptions) (perf.GlobalPerfTest, error) {
37+
d := &downloadTestGlobal{
38+
PerfTestOptions: options,
39+
containerName: "downloadcontainer",
40+
blobName: "downloadblob",
41+
}
42+
43+
connStr, ok := os.LookupEnv("AZURE_STORAGE_CONNECTION_STRING")
44+
if !ok {
45+
return nil, fmt.Errorf("the environment variable 'AZURE_STORAGE_CONNECTION_STRING' could not be found")
46+
}
47+
48+
containerClient, err := azblob.NewContainerClientFromConnectionString(connStr, d.containerName, nil)
49+
if err != nil {
50+
return nil, err
51+
}
52+
_, err = containerClient.Create(context.Background(), nil)
53+
if err != nil {
54+
return nil, err
55+
}
56+
57+
blobClient, err := containerClient.NewBlockBlobClient(d.blobName)
58+
if err != nil {
59+
return nil, err
60+
}
61+
62+
data, err := perf.NewRandomStream(downloadTestOpts.size)
63+
if err != nil {
64+
return nil, err
65+
}
66+
67+
_, err = blobClient.Upload(context.Background(), data, nil)
68+
if err != nil {
69+
return nil, err
70+
}
71+
72+
return d, nil
73+
}
74+
75+
func (d *downloadTestGlobal) GlobalCleanup(ctx context.Context) error {
76+
connStr, ok := os.LookupEnv("AZURE_STORAGE_CONNECTION_STRING")
77+
if !ok {
78+
return fmt.Errorf("the environment variable 'AZURE_STORAGE_CONNECTION_STRING' could not be found")
79+
}
80+
81+
containerClient, err := azblob.NewContainerClientFromConnectionString(connStr, d.containerName, nil)
82+
if err != nil {
83+
return err
84+
}
85+
86+
_, err = containerClient.Delete(context.Background(), nil)
87+
return err
88+
}
89+
90+
type downloadPerfTest struct {
91+
*downloadTestGlobal
92+
perf.PerfTestOptions
93+
data io.ReadSeekCloser
94+
blobClient *azblob.BlockBlobClient
95+
}
96+
97+
// NewPerfTest is called once per goroutine
98+
func (g *downloadTestGlobal) NewPerfTest(ctx context.Context, options *perf.PerfTestOptions) (perf.PerfTest, error) {
99+
d := &downloadPerfTest{
100+
downloadTestGlobal: g,
101+
PerfTestOptions: *options,
102+
}
103+
104+
connStr, ok := os.LookupEnv("AZURE_STORAGE_CONNECTION_STRING")
105+
if !ok {
106+
return nil, fmt.Errorf("the environment variable 'AZURE_STORAGE_CONNECTION_STRING' could not be found")
107+
}
108+
109+
containerClient, err := azblob.NewContainerClientFromConnectionString(connStr, d.downloadTestGlobal.containerName, &azblob.ClientOptions{
110+
Transporter: d.PerfTestOptions.Transporter,
111+
})
112+
if err != nil {
113+
return nil, err
114+
}
115+
bc, err := containerClient.NewBlockBlobClient(d.blobName)
116+
if err != nil {
117+
return nil, err
118+
}
119+
d.blobClient = bc
120+
121+
data, err := perf.NewRandomStream(downloadTestOpts.size)
122+
if err != nil {
123+
return nil, err
124+
}
125+
d.data = data
126+
127+
return d, err
128+
}
129+
130+
func (d *downloadPerfTest) Run(ctx context.Context) error {
131+
get, err := d.blobClient.Download(ctx, nil)
132+
if err != nil {
133+
return err
134+
}
135+
downloadedData := &bytes.Buffer{}
136+
reader := get.Body(nil)
137+
_, err = downloadedData.ReadFrom(reader)
138+
if err != nil {
139+
return err
140+
}
141+
return reader.Close()
142+
}
143+
144+
func (*downloadPerfTest) Cleanup(ctx context.Context) error {
145+
return nil
146+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
module github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/testdata/perf
2+
3+
go 1.17
4+
5+
replace github.com/Azure/azure-sdk-for-go/sdk/internal => ../../../../internal
6+
7+
replace github.com/Azure/azure-sdk-for-go/sdk/storage/azblob => ../../.
8+
9+
require github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.2.0
10+
11+
require github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.3
12+
13+
require (
14+
github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1 // indirect
15+
golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d // indirect
16+
golang.org/x/text v0.3.7 // indirect
17+
)
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1 h1:qoVeMsc9/fh/yhxVaA0obYjVH/oI/ihrOoMwsLS9KSA=
2+
github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1/go.mod h1:fBF9PQNqB8scdgpZ3ufzaLntG0AG7C1WjPMsiFOmfHM=
3+
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
4+
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
5+
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
6+
github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko=
7+
github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI=
8+
github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ=
9+
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
10+
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
11+
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
12+
github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8=
13+
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
14+
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
15+
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
16+
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
17+
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
18+
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
19+
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
20+
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
21+
golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
22+
golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
23+
golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d h1:20cMwl2fHAzkJMEA+8J4JgqBQcQGzbisXo31MIeenXI=
24+
golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
25+
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
26+
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
27+
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
28+
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
29+
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
30+
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
31+
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
32+
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
33+
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
34+
golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
35+
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
36+
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
37+
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
38+
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
39+
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
40+
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
41+
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
42+
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
43+
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
44+
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo=
45+
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
// Copyright (c) Microsoft Corporation. All rights reserved.
2+
// Licensed under the MIT License. See License.txt in the project root for license information.
3+
4+
package main
5+
6+
import (
7+
"bytes"
8+
"context"
9+
"flag"
10+
"fmt"
11+
"os"
12+
13+
"github.com/Azure/azure-sdk-for-go/sdk/internal/perf"
14+
"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob"
15+
)
16+
17+
type listTestOptions struct {
18+
count int
19+
}
20+
21+
var listTestOpts listTestOptions = listTestOptions{count: 100}
22+
23+
// uploadTestRegister is called once per process
24+
func listTestRegister() {
25+
flag.IntVar(&listTestOpts.count, "num-blobs", 100, "Number of blobs to list.")
26+
}
27+
28+
type listTestGlobal struct {
29+
perf.PerfTestOptions
30+
containerName string
31+
blobName string
32+
}
33+
34+
// NewListTest is called once per process
35+
func NewListTest(ctx context.Context, options perf.PerfTestOptions) (perf.GlobalPerfTest, error) {
36+
l := &listTestGlobal{
37+
PerfTestOptions: options,
38+
containerName: "listcontainer",
39+
blobName: "listblob",
40+
}
41+
connStr, ok := os.LookupEnv("AZURE_STORAGE_CONNECTION_STRING")
42+
if !ok {
43+
return nil, fmt.Errorf("the environment variable 'AZURE_STORAGE_CONNECTION_STRING' could not be found")
44+
}
45+
46+
containerClient, err := azblob.NewContainerClientFromConnectionString(connStr, l.containerName, nil)
47+
if err != nil {
48+
return nil, err
49+
}
50+
_, err = containerClient.Create(context.Background(), nil)
51+
if err != nil {
52+
return nil, err
53+
}
54+
55+
for i := 0; i < 100; i++ {
56+
blobClient, err := containerClient.NewBlockBlobClient(fmt.Sprintf("%s%d", l.blobName, i))
57+
if err != nil {
58+
return nil, err
59+
}
60+
_, err = blobClient.Upload(
61+
context.Background(),
62+
NopCloser(bytes.NewReader([]byte(""))),
63+
nil,
64+
)
65+
if err != nil {
66+
return nil, err
67+
}
68+
}
69+
70+
return l, nil
71+
}
72+
73+
func (l *listTestGlobal) GlobalCleanup(ctx context.Context) error {
74+
connStr, ok := os.LookupEnv("AZURE_STORAGE_CONNECTION_STRING")
75+
if !ok {
76+
return fmt.Errorf("the environment variable 'AZURE_STORAGE_CONNECTION_STRING' could not be found")
77+
}
78+
79+
containerClient, err := azblob.NewContainerClientFromConnectionString(connStr, l.containerName, nil)
80+
if err != nil {
81+
return err
82+
}
83+
84+
_, err = containerClient.Delete(context.Background(), nil)
85+
return err
86+
}
87+
88+
type listPerfTest struct {
89+
*listTestGlobal
90+
perf.PerfTestOptions
91+
containerClient *azblob.ContainerClient
92+
}
93+
94+
// NewPerfTest is called once per goroutine
95+
func (g *listTestGlobal) NewPerfTest(ctx context.Context, options *perf.PerfTestOptions) (perf.PerfTest, error) {
96+
u := &listPerfTest{
97+
listTestGlobal: g,
98+
PerfTestOptions: *options,
99+
}
100+
101+
connStr, ok := os.LookupEnv("AZURE_STORAGE_CONNECTION_STRING")
102+
if !ok {
103+
return nil, fmt.Errorf("the environment variable 'AZURE_STORAGE_CONNECTION_STRING' could not be found")
104+
}
105+
106+
containerClient, err := azblob.NewContainerClientFromConnectionString(
107+
connStr,
108+
u.listTestGlobal.containerName,
109+
&azblob.ClientOptions{
110+
Transporter: u.PerfTestOptions.Transporter,
111+
},
112+
)
113+
if err != nil {
114+
return nil, err
115+
}
116+
u.containerClient = containerClient
117+
118+
return u, nil
119+
}
120+
121+
func (m *listPerfTest) Run(ctx context.Context) error {
122+
c := int32(listTestOpts.count)
123+
pager := m.containerClient.ListBlobsFlat(&azblob.ContainerListBlobFlatSegmentOptions{
124+
Maxresults: &c,
125+
})
126+
for pager.NextPage(context.Background()) {
127+
}
128+
return pager.Err()
129+
}
130+
131+
func (m *listPerfTest) Cleanup(ctx context.Context) error {
132+
return nil
133+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
// Copyright (c) Microsoft Corporation. All rights reserved.
2+
// Licensed under the MIT License.
3+
4+
package main
5+
6+
import (
7+
"github.com/Azure/azure-sdk-for-go/sdk/internal/perf"
8+
)
9+
10+
func main() {
11+
perf.Run(map[string]perf.PerfMethods{
12+
"UploadBlobTest": {Register: uploadTestRegister, New: NewUploadTest},
13+
"ListBlobTest": {Register: listTestRegister, New: NewListTest},
14+
"DownloadBlobTest": {Register: downloadTestRegister, New: NewDownloadTest},
15+
})
16+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
// Copyright (c) Microsoft Corporation. All rights reserved.
2+
// Licensed under the MIT License.
3+
4+
package main
5+
6+
import (
7+
"io"
8+
)
9+
10+
type nopCloser struct {
11+
io.ReadSeeker
12+
}
13+
14+
func (n nopCloser) Close() error {
15+
return nil
16+
}
17+
18+
// NopCloser returns a ReadSeekCloser with a no-op close method wrapping the provided io.ReadSeeker.
19+
func NopCloser(rs io.ReadSeeker) io.ReadSeekCloser {
20+
return nopCloser{rs}
21+
}

0 commit comments

Comments
 (0)