@@ -170,7 +170,7 @@ func (rg *RecordGenerator) ParseState(c Config, masters ...string) error {
170
170
// find master -- return if error
171
171
sj , err := rg .findMaster (masters ... )
172
172
if err != nil {
173
- logging .Error .Println ("no master" )
173
+ logging .Error .Println ("Failed to fetch state.json. Error: " , err )
174
174
return err
175
175
}
176
176
if sj .Leader == "" {
@@ -203,36 +203,34 @@ func (rg *RecordGenerator) findMaster(masters ...string) (state.State, error) {
203
203
ip , port , err := getProto (leader )
204
204
if err != nil {
205
205
logging .Error .Println (err )
206
+ } else {
207
+ if sj , err = rg .loadWrap (ip , port ); err == nil {
208
+ return sj , nil
209
+ }
210
+ logging .Error .Println ("Failed to fetch state.json from leader. Error: " , err )
211
+ if len (masters ) == 0 {
212
+ return sj , errors .New ("No more masters to try" )
213
+ }
214
+ logging .Error .Println ("Falling back to remaining masters: " , masters )
206
215
}
207
-
208
- if sj , err = rg .loadWrap (ip , port ); err == nil && sj .Leader != "" {
209
- return sj , nil
210
- }
211
- logging .Verbose .Println ("Warning: Zookeeper is wrong about leader, or request failed" )
212
- if len (masters ) == 0 {
213
- return sj , errors .New ("no master" )
214
- }
215
- logging .Verbose .Println ("Warning: falling back to Masters config field: " , masters )
216
216
}
217
217
218
218
// try each listed mesos master before dying
219
- for i , master := range masters {
219
+ for _ , master := range masters {
220
220
ip , port , err := getProto (master )
221
221
if err != nil {
222
222
logging .Error .Println (err )
223
+ continue
223
224
}
224
225
225
- if sj , err = rg .loadWrap (ip , port ); err == nil && sj .Leader == "" {
226
- logging .VeryVerbose .Println ("Warning: not a leader - trying next one" )
227
- if len (masters )- 1 == i {
228
- return sj , errors .New ("no master" )
229
- }
230
- } else {
231
- return sj , nil
226
+ if sj , err = rg .loadWrap (ip , port ); err != nil {
227
+ logging .Error .Println ("Failed to fetch state.json - trying next one. Error: " , err )
228
+ continue
232
229
}
230
+ return sj , nil
233
231
}
234
232
235
- return sj , errors .New ("no master " )
233
+ return sj , errors .New ("No more masters eligible for state.json query " )
236
234
}
237
235
238
236
// Loads state.json from mesos master
@@ -286,12 +284,21 @@ func (rg *RecordGenerator) loadWrap(ip, port string) (state.State, error) {
286
284
if err != nil {
287
285
return state.State {}, err
288
286
}
289
- if rip := leaderIP (sj .Leader ); rip != ip {
290
- logging .VeryVerbose .Println ("Warning: master changed to " + ip )
291
- sj , err = rg .loadFromMaster (rip , port )
292
- return sj , err
287
+ if sj .Leader != "" {
288
+ var stateLeaderIP string
289
+
290
+ stateLeaderIP , err = leaderIP (sj .Leader )
291
+ if err != nil {
292
+ return sj , err
293
+ }
294
+ if stateLeaderIP != ip {
295
+ logging .VeryVerbose .Println ("Warning: master changed to " + stateLeaderIP )
296
+ return rg .loadFromMaster (stateLeaderIP , port )
297
+ }
298
+ return sj , nil
293
299
}
294
- return sj , nil
300
+ err = errors .New ("Fetched state.json does not contain leader information" )
301
+ return sj , err
295
302
}
296
303
297
304
// hashes a given name using a truncated sha1 hash
@@ -653,9 +660,17 @@ func (rg *RecordGenerator) insertRR(name, host string, kind rrsKind) (added bool
653
660
654
661
// leaderIP returns the ip for the mesos master
655
662
// input format master@ip:port
656
- func leaderIP (leader string ) string {
657
- pair := strings .Split (leader , "@" )[1 ]
658
- return strings .Split (pair , ":" )[0 ]
663
+ func leaderIP (leader string ) (string , error ) {
664
+ nameAddressPair := strings .Split (leader , "@" )
665
+ if len (nameAddressPair ) != 2 {
666
+ return "" , errors .New ("Invalid leader address: " + leader )
667
+ }
668
+ hostPort := nameAddressPair [1 ]
669
+ host , _ , err := net .SplitHostPort (hostPort )
670
+ if err != nil {
671
+ return "" , err
672
+ }
673
+ return host , nil
659
674
}
660
675
661
676
// return the slave number from a Mesos slave id
0 commit comments