Skip to content
This repository was archived by the owner on Oct 23, 2024. It is now read-only.

Commit bfcd401

Browse files
authored
Merge pull request #461 from mesosphere/stability-fixes
Stability fixes
2 parents a07e7f0 + 353fa8d commit bfcd401

File tree

2 files changed

+57
-28
lines changed

2 files changed

+57
-28
lines changed

records/generator.go

Lines changed: 42 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ func (rg *RecordGenerator) ParseState(c Config, masters ...string) error {
170170
// find master -- return if error
171171
sj, err := rg.findMaster(masters...)
172172
if err != nil {
173-
logging.Error.Println("no master")
173+
logging.Error.Println("Failed to fetch state.json. Error: ", err)
174174
return err
175175
}
176176
if sj.Leader == "" {
@@ -203,36 +203,34 @@ func (rg *RecordGenerator) findMaster(masters ...string) (state.State, error) {
203203
ip, port, err := getProto(leader)
204204
if err != nil {
205205
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)
206215
}
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)
216216
}
217217

218218
// try each listed mesos master before dying
219-
for i, master := range masters {
219+
for _, master := range masters {
220220
ip, port, err := getProto(master)
221221
if err != nil {
222222
logging.Error.Println(err)
223+
continue
223224
}
224225

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
232229
}
230+
return sj, nil
233231
}
234232

235-
return sj, errors.New("no master")
233+
return sj, errors.New("No more masters eligible for state.json query")
236234
}
237235

238236
// Loads state.json from mesos master
@@ -286,12 +284,21 @@ func (rg *RecordGenerator) loadWrap(ip, port string) (state.State, error) {
286284
if err != nil {
287285
return state.State{}, err
288286
}
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
293299
}
294-
return sj, nil
300+
err = errors.New("Fetched state.json does not contain leader information")
301+
return sj, err
295302
}
296303

297304
// hashes a given name using a truncated sha1 hash
@@ -653,9 +660,17 @@ func (rg *RecordGenerator) insertRR(name, host string, kind rrsKind) (added bool
653660

654661
// leaderIP returns the ip for the mesos master
655662
// 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
659674
}
660675

661676
// return the slave number from a Mesos slave id

records/generator_test.go

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,10 +164,24 @@ func TestMasterRecord(t *testing.T) {
164164
}
165165
}
166166

167+
func TestInvalidLeaderIP(t *testing.T) {
168+
l := "master!144.76.157.37;5050"
169+
170+
ip, err := leaderIP(l)
171+
172+
if err == nil || ip != "" {
173+
t.Error("invalid ip was parsed")
174+
}
175+
}
176+
167177
func TestLeaderIP(t *testing.T) {
168178
l := "[email protected]:5050"
169179

170-
ip := leaderIP(l)
180+
ip, err := leaderIP(l)
181+
182+
if err != nil {
183+
t.Error(err)
184+
}
171185

172186
if ip != "144.76.157.37" {
173187
t.Error("not parsing ip")

0 commit comments

Comments
 (0)