Bug #15717
closedgetListenAddr behavior with multiple instances on same host
Description
Setting the listen port for keepstore through the legacy config doesn't seem to work, it seems like instead it randomly picks a port to bind to from InternalURLs and if it is in use, it fails, and (in arvbox) it goes into a crash-restart loop until it happens to picks the 2nd port that's still available
Looking at the code, it just adds the legacy "Listen" to InternalURLs, for that to do the right thing, the keepstore InternalURLs needs to be empty to start with.
In getListenAddr in lib/service/cmd.go, it has different behavior depending on the text of the error, in particular, if there are two ports defined for the same host (eg 25107 and 25108) it will fail if it can't bind 25107 and not try to bind 25108.
} else if strings.Contains(err.Error(), "cannot assign requested address") { continue } else if strings.Contains(err.Error(), "address already in use") { return url, err
Updated by Tom Clegg about 5 years ago
- continue trying other entries
- if all entries fail, and one or more errors were "address already in use", then report "address(es) already in use" as the error -- rather than the generic "not configured for this host" error that's returned by the current code when all fail but none were handled by that "address already in use" condition
Updated by Peter Amstutz about 5 years ago
Updated by Tom Clegg about 5 years ago
LGTM, thanks.
(nit -- you can call len() and append to a nil slice, so "var errors []string" might be a better habit for slices that might not need to be allocated at all)