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

Commit 353fa8d

Browse files
Vespiandrewkerrigan
authored andcommitted
Improve stability and error messaging in records/generator
Improve state.json fetch logic error messages Make findMaster method more robust loadWrap method should not assume "Leader" field presence in reply adding error content to log lines, removing unecessary log line added validation and tests for leaderIP
1 parent a07e7f0 commit 353fa8d

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)