1+ package ds3_integration
2+
3+ import (
4+ "testing"
5+ "sync"
6+ "log"
7+ "fmt"
8+ "runtime/debug"
9+ "spectra/ds3_go_sdk/ds3"
10+ "spectra/ds3_go_sdk/ds3_utils/ds3Testing"
11+ "spectra/ds3_go_sdk/ds3/models"
12+ "spectra/ds3_go_sdk/ds3_integration/utils"
13+ "spectra/ds3_go_sdk/ds3/networking"
14+ "os"
15+ "spectra/ds3_go_sdk/ds3/buildclient"
16+ "net/url"
17+ )
18+
19+ func putFileWithClient (name string , offset int64 , jobId string , content * []byte , group * sync.WaitGroup , t * testing.T ) {
20+ defer group .Done ()
21+ log .Printf ("Putting file %s" , name )
22+
23+ _ , err := client .PutObject (models .NewPutObjectRequest (testBucket , name , ds3 .BuildByteReaderWithSizeDecorator (* content )).
24+ WithOffset (offset ).
25+ WithJob (jobId ))
26+
27+ if err != nil {
28+ t .Errorf ("Unexpected error when putting file '%s': '%s'." , name , err .Error ())
29+ debug .PrintStack ()
30+ t .Fail ()
31+ }
32+ }
33+
34+ func TestConcurrentClientUsage (t * testing.T ) {
35+ defer testutils .DeleteBucketContents (client , testBucket )
36+
37+ content , err := testutils .LoadBook (testutils .BookTitles [0 ])
38+ ds3Testing .AssertNilError (t , err )
39+
40+ size := int64 (len (content ))
41+
42+ // create a job for putting n instances of file
43+ n := 30
44+
45+ var ds3Objects []models.Ds3PutObject
46+ for i := 0 ; i < n ; i ++ {
47+ ds3Objects = append (ds3Objects , models.Ds3PutObject { Name :fmt .Sprintf ("file%d" , i ), Size :size })
48+ }
49+
50+ bulkPut , err := client .PutBulkJobSpectraS3 (models .NewPutBulkJobSpectraS3Request (testBucket , ds3Objects ))
51+ ds3Testing .AssertNilError (t , err )
52+
53+ // launch go routines to put files concurrently
54+ var group sync.WaitGroup
55+ group .Add (n )
56+
57+ for _ , chunk := range bulkPut .MasterObjectList .Objects {
58+ allocateChunk , allocateErr := client .AllocateJobChunkSpectraS3 (models .NewAllocateJobChunkSpectraS3Request (chunk .ChunkId ))
59+ ds3Testing .AssertNilError (t , allocateErr )
60+ for _ , obj := range allocateChunk .Objects .Objects {
61+ go putFileWithClient (* obj .Name , obj .Offset , bulkPut .MasterObjectList .JobId , & content , & group , t )
62+ }
63+ }
64+
65+ group .Wait ()
66+ }
67+
68+ func putFileWithSendNetwork (name string , offset int64 , jobId string , content * []byte , bucketName string , group * sync.WaitGroup , t * testing.T , network networking.Network , info * networking.ConnectionInfo ) {
69+ defer group .Done ()
70+
71+ // manually create http request
72+ httpRequest , err := networking .NewHttpRequestBuilder ().
73+ WithHttpVerb (ds3 .HTTP_VERB_PUT ).
74+ WithPath ("/" + bucketName + "/" + name ).
75+ WithOptionalQueryParam ("job" , & jobId ).
76+ WithOptionalQueryParam ("offset" , networking .Int64PtrToStrPtr (& offset )).
77+ WithReader (ds3 .BuildByteReaderWithSizeDecorator (* content )).
78+ WithChecksum (models .NewNoneChecksum ()).
79+ WithHeaders (make (map [string ]string )).
80+ Build (info )
81+
82+ //networkRetryDecorator := networking.NewNetworkRetryDecorator(network, 5)
83+ t .Logf ("Created request to for file '%s' to url '%s'" , name , httpRequest .URL .String ())
84+ response , err := network .Invoke (httpRequest )
85+ if err != nil {
86+ t .Errorf ("Unexpected error when putting file '%s': '%s'." , name , err .Error ())
87+ debug .PrintStack ()
88+ t .Fail ()
89+ }
90+
91+ _ , err = models .NewPutObjectResponse (response )
92+ if err != nil {
93+ t .Errorf ("Unexpected error when putting file '%s': '%s'." , name , err .Error ())
94+ debug .PrintStack ()
95+ t .Fail ()
96+ }
97+ }
98+
99+ func TestConcurrentSendNetworkUsage (t * testing.T ) {
100+ defer testutils .DeleteBucketContents (client , testBucket )
101+
102+ content , err := testutils .LoadBook (testutils .BookTitles [0 ])
103+ ds3Testing .AssertNilError (t , err )
104+
105+ size := int64 (len (content ))
106+
107+ // create a job for putting n instances of file
108+ n := 30
109+
110+ var ds3Objects []models.Ds3PutObject
111+ for i := 0 ; i < n ; i ++ {
112+ ds3Objects = append (ds3Objects , models.Ds3PutObject { Name :fmt .Sprintf ("file%d" , i ), Size :size })
113+ }
114+
115+ bulkPut , err := client .PutBulkJobSpectraS3 (models .NewPutBulkJobSpectraS3Request (testBucket , ds3Objects ))
116+ ds3Testing .AssertNilError (t , err )
117+
118+ // launch go routines to put files concurrently
119+ var group sync.WaitGroup
120+ group .Add (n )
121+
122+ //Retrieve the environment variables
123+ endpoint := os .Getenv (buildclient .EndpointEnv )
124+ accessKey := os .Getenv (buildclient .AccessKeyEnv )
125+ secretKey := os .Getenv (buildclient .SecretKeyEnv )
126+
127+ endpointUrl , err := url .Parse (endpoint )
128+ ds3Testing .AssertNilError (t , err )
129+ info := networking.ConnectionInfo {
130+ Endpoint : endpointUrl ,
131+ Credentials : & networking.Credentials {AccessId : accessKey , Key : secretKey },
132+ Proxy : nil }
133+
134+ network := networking .NewSendNetwork (& info )
135+
136+ for _ , chunk := range bulkPut .MasterObjectList .Objects {
137+ //TODO Try get available job chunks ready for client processing instead
138+ allocateChunk , allocateErr := client .AllocateJobChunkSpectraS3 (models .NewAllocateJobChunkSpectraS3Request (chunk .ChunkId ))
139+ ds3Testing .AssertNilError (t , allocateErr )
140+ for _ , obj := range allocateChunk .Objects .Objects {
141+ go putFileWithSendNetwork (* obj .Name , obj .Offset , bulkPut .MasterObjectList .JobId , & content , testBucket , & group , t , network , & info )
142+ }
143+ }
144+
145+ group .Wait ()
146+ }
0 commit comments