@@ -37,17 +37,20 @@ import (
37
37
)
38
38
39
39
var (
40
- l * logger.Logger
41
- flags = flag .NewFlagSet (os .Args [0 ], flag .ContinueOnError )
42
- flagP = flags .Int ("p" , runtime .GOMAXPROCS (0 ), "run `N` processes in parallel" )
43
- flagTimeout = flags .Duration ("timeout" , 0 , "timeout each process after `duration`" )
44
- _ = flags .Bool ("kill" , true , "kill timed out processes if true, otherwise just print pid (to attach with gdb)" )
45
- flagFailure = flags .String ("failure" , "" , "fail only if output matches `regexp`" )
46
- flagIgnore = flags .String ("ignore" , "" , "ignore failure if output matches `regexp`" )
47
- flagMaxTime = flags .Duration ("maxtime" , 0 , "maximum time to run" )
48
- flagMaxRuns = flags .Int ("maxruns" , 0 , "maximum number of runs" )
49
- _ = flags .Int ("maxfails" , 1 , "maximum number of failures" )
50
- flagStderr = flags .Bool ("stderr" , true , "output failures to STDERR instead of to a temp file" )
40
+ l * logger.Logger
41
+ flags = flag .NewFlagSet (os .Args [0 ], flag .ContinueOnError )
42
+ flagP = flags .Int ("p" , runtime .GOMAXPROCS (0 ), "run `N` processes in parallel" )
43
+ flagTimeout = flags .Duration ("timeout" , 0 , "timeout each process after `duration`" )
44
+ flagFailure = flags .String ("failure" , "" , "fail only if output matches `regexp`" )
45
+ flagIgnore = flags .String ("ignore" , "" , "ignore failure if output matches `regexp`" )
46
+ flagMaxTime = flags .Duration ("maxtime" , 0 , "maximum time to run" )
47
+ flagMaxRuns = flags .Int ("maxruns" , 0 , "maximum number of runs" )
48
+ flagStderr = flags .Bool ("stderr" , true , "output failures to STDERR instead of to a temp file" )
49
+ flagTestBin = flags .String ("testbin" , "" , "location of the test binary" )
50
+ flagStressBin = flags .String ("stressbin" , "bin.docker_amd64/stress" , "location of the stress binary" )
51
+ flagLibDir = flags .String ("libdir" , "lib.docker_amd64" , "location of the directory containing the built geos directories" )
52
+ _ = flags .Bool ("kill" , true , "kill timed out processes if true, otherwise just print pid (to attach with gdb)" )
53
+ _ = flags .Int ("maxfails" , 1 , "maximum number of failures" )
51
54
)
52
55
53
56
func init () {
@@ -65,6 +68,70 @@ func init() {
65
68
}
66
69
}
67
70
71
+ func verifySourcesAndArtifactsExist (pkg , localTestBin string ) error {
72
+ // Verify that the given package exists.
73
+ fi , err := os .Stat (pkg )
74
+ if err != nil {
75
+ return errors .Wrapf (err , "the pkg flag %q is not a directory relative to the current working directory" , pkg )
76
+ }
77
+ if ! fi .Mode ().IsDir () {
78
+ return fmt .Errorf ("the pkg flag %q is not a directory relative to the current working directory" , pkg )
79
+ }
80
+
81
+ // Verify that the test binary exists.
82
+ fi , err = os .Stat (localTestBin )
83
+ if err != nil {
84
+ return errors .Wrapf (err , "test binary %q does not exist" , localTestBin )
85
+ }
86
+ if ! fi .Mode ().IsRegular () {
87
+ return fmt .Errorf ("test binary %q is not a file" , localTestBin )
88
+ }
89
+
90
+ return nil
91
+ }
92
+
93
+ func verifyFlags () error {
94
+ if * flagP <= 0 || * flagTimeout < 0 || len (flags .Args ()) == 0 {
95
+ var b bytes.Buffer
96
+ flags .SetOutput (& b )
97
+ flags .Usage ()
98
+ return errors .Newf ("%s" , b .String ())
99
+ }
100
+ if * flagFailure != "" {
101
+ if _ , err := regexp .Compile (* flagFailure ); err != nil {
102
+ return errors .Wrap (err , "bad failure regexp" )
103
+ }
104
+ }
105
+ if * flagIgnore != "" {
106
+ if _ , err := regexp .Compile (* flagIgnore ); err != nil {
107
+ return errors .Wrap (err , "bad ignore regexp" )
108
+ }
109
+ }
110
+ return nil
111
+ }
112
+
113
+ func getStressSpecificArgs () (ret []string ) {
114
+ flags .Visit (func (f * flag.Flag ) {
115
+ if f .Name != "testbin" && f .Name != "stressbin" && f .Name != "libdir" {
116
+ ret = append (ret , fmt .Sprintf ("-%s=%s" , f .Name , f .Value ))
117
+ }
118
+ })
119
+ return ret
120
+ }
121
+
122
+ func getTestArgs () (ret []string ) {
123
+ if len (os .Args ) > 3 {
124
+ flagsAndArgs := os .Args [3 :]
125
+ for i , arg := range flagsAndArgs {
126
+ if arg == "--" {
127
+ ret = flagsAndArgs [i + 1 :]
128
+ break
129
+ }
130
+ }
131
+ }
132
+ return ret
133
+ }
134
+
68
135
func roundToSeconds (d time.Duration ) time.Duration {
69
136
return time .Duration (d .Seconds ()+ 0.5 ) * time .Second
70
137
}
@@ -79,84 +146,48 @@ func run() error {
79
146
flags .PrintDefaults ()
80
147
}
81
148
82
- if len (os .Args ) < 2 {
149
+ if len (os .Args ) < 3 {
83
150
var b bytes.Buffer
84
151
flags .SetOutput (& b )
85
152
flags .Usage ()
86
153
return errors .Newf ("%s" , b .String ())
87
154
}
88
155
89
- cluster := os .Args [1 ]
90
- if err := flags .Parse (os .Args [2 :]); err != nil {
156
+ if err := flags .Parse (os .Args [3 :]); err != nil {
91
157
return err
92
158
}
93
159
160
+ cluster := os .Args [1 ]
94
161
if ! * flagStderr {
95
162
return errors .New ("-stderr=false is unsupported, please tee to a file (or implement the feature)" )
96
163
}
97
164
98
165
pkg := os .Args [2 ]
99
166
localTestBin := filepath .Base (pkg ) + ".test"
100
- {
101
- fi , err := os .Stat (pkg )
102
- if err != nil {
103
- return errors .Wrapf (err , "the pkg flag %q is not a directory relative to the current working directory" , pkg )
104
- }
105
- if ! fi .Mode ().IsDir () {
106
- return fmt .Errorf ("the pkg flag %q is not a directory relative to the current working directory" , pkg )
107
- }
108
-
109
- // Verify that the test binary exists.
110
- fi , err = os .Stat (localTestBin )
111
- if err != nil {
112
- return errors .Wrapf (err , "test binary %q does not exist" , localTestBin )
113
- }
114
- if ! fi .Mode ().IsRegular () {
115
- return fmt .Errorf ("test binary %q is not a file" , localTestBin )
116
- }
117
- }
118
- flagsAndArgs := os .Args [3 :]
119
- stressArgs := flagsAndArgs
120
- var testArgs []string
121
- for i , arg := range flagsAndArgs {
122
- if arg == "--" {
123
- stressArgs = flagsAndArgs [:i ]
124
- testArgs = flagsAndArgs [i + 1 :]
125
- break
126
- }
167
+ if * flagTestBin != "" {
168
+ localTestBin = * flagTestBin
127
169
}
128
170
129
- if * flagP <= 0 || * flagTimeout < 0 || len (flags .Args ()) == 0 {
130
- var b bytes.Buffer
131
- flags .SetOutput (& b )
132
- flags .Usage ()
133
- return errors .Newf ("%s" , b .String ())
134
- }
135
- if * flagFailure != "" {
136
- if _ , err := regexp .Compile (* flagFailure ); err != nil {
137
- return errors .Wrap (err , "bad failure regexp" )
138
- }
171
+ if err := verifySourcesAndArtifactsExist (pkg , localTestBin ); err != nil {
172
+ return err
139
173
}
140
- if * flagIgnore != "" {
141
- if _ , err := regexp .Compile (* flagIgnore ); err != nil {
142
- return errors .Wrap (err , "bad ignore regexp" )
143
- }
174
+
175
+ if err := verifyFlags (); err != nil {
176
+ return err
144
177
}
145
178
146
179
statuses , err := roachprod .Status (context .Background (), l , cluster , "" )
147
180
if err != nil {
148
181
return err
149
182
}
150
- nodes := len (statuses )
183
+ numNodes := len (statuses )
151
184
152
- const stressBin = "bin.docker_amd64/stress"
153
- if err := roachprod .Put (context .Background (), l , cluster , stressBin , "stress" , true ); err != nil {
185
+ if err := roachprod .Put (context .Background (), l , cluster , * flagStressBin , "stress" , true ); err != nil {
154
186
return err
155
187
}
156
188
157
- const localLibDir = "lib.docker_amd64/"
158
- if fi , err := os .Stat (localLibDir ); err == nil && fi .IsDir () {
159
- if err := roachprod .Put (context .Background (), l , cluster , localLibDir , "lib" , true ); err != nil {
189
+ if fi , err := os .Stat (* flagLibDir ); err == nil && fi .IsDir () {
190
+ if err := roachprod .Put (context .Background (), l , cluster , * flagLibDir , "lib" , true ); err != nil {
160
191
return err
161
192
}
162
193
}
@@ -174,7 +205,7 @@ func run() error {
174
205
return errors .Wrap (err , "failed to copy testdata" )
175
206
}
176
207
}
177
- testBin := filepath .Join (pkg , localTestBin )
208
+ testBin := filepath .Join (pkg , filepath . Base ( localTestBin ) )
178
209
if err := roachprod .Put (context .Background (), l , cluster , localTestBin , testBin , true ); err != nil {
179
210
return errors .Wrap (err , "failed to copy testdata" )
180
211
}
@@ -220,8 +251,8 @@ func run() error {
220
251
221
252
statusRE := regexp .MustCompile (`(\d+) runs (so far|completed), (\d+) failures, over .*` )
222
253
223
- wg .Add (nodes )
224
- for i := 1 ; i <= nodes ; i ++ {
254
+ wg .Add (numNodes )
255
+ for i := 1 ; i <= numNodes ; i ++ {
225
256
go func (i int ) {
226
257
stdoutR , stdoutW := io .Pipe ()
227
258
defer func () {
@@ -266,11 +297,12 @@ func run() error {
266
297
}()
267
298
268
299
cmdArray := []string {
269
- fmt .Sprintf ("cd %s; GOTRACEBACK=all ~/stress %s ./%s %s" ,
300
+ fmt .Sprintf ("cd %s; GOTRACEBACK=all ~/%s %s ./%s %s" ,
270
301
pkg ,
271
- strings .Join (stressArgs , " " ),
302
+ filepath .Base (* flagStressBin ),
303
+ strings .Join (getStressSpecificArgs (), " " ),
272
304
filepath .Base (testBin ),
273
- strings .Join (testArgs , " " )),
305
+ strings .Join (getTestArgs () , " " )),
274
306
}
275
307
if err := roachprodRun (fmt .Sprintf ("%s:%d" , cluster , i ), cmdArray ); err != nil {
276
308
error (err .Error ())
0 commit comments