name_url_map.go 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. package main
  2. import (
  3. "net/url"
  4. "path"
  5. )
  6. // we map node name to url
  7. type nodeInfo struct {
  8. raftVersion string
  9. raftURL string
  10. etcdURL string
  11. }
  12. var namesMap = make(map[string]*nodeInfo)
  13. // nameToEtcdURL maps node name to its etcd http address
  14. func nameToEtcdURL(name string) (string, bool) {
  15. if info, ok := namesMap[name]; ok {
  16. // first try to read from the map
  17. return info.etcdURL, true
  18. }
  19. // if fails, try to recover from etcd storage
  20. return readURL(name, "etcd")
  21. }
  22. // nameToRaftURL maps node name to its raft http address
  23. func nameToRaftURL(name string) (string, bool) {
  24. if info, ok := namesMap[name]; ok {
  25. // first try to read from the map
  26. return info.raftURL, true
  27. }
  28. // if fails, try to recover from etcd storage
  29. return readURL(name, "raft")
  30. }
  31. // addNameToURL add a name that maps to raftURL and etcdURL
  32. func addNameToURL(name string, version string, raftURL string, etcdURL string) {
  33. namesMap[name] = &nodeInfo{
  34. raftVersion: raftVersion,
  35. raftURL: raftURL,
  36. etcdURL: etcdURL,
  37. }
  38. }
  39. func readURL(nodeName string, urlName string) (string, bool) {
  40. // if fails, try to recover from etcd storage
  41. key := path.Join("/_etcd/machines", nodeName)
  42. resps, err := etcdStore.RawGet(key)
  43. if err != nil {
  44. return "", false
  45. }
  46. m, err := url.ParseQuery(resps[0].Value)
  47. if err != nil {
  48. panic("Failed to parse machines entry")
  49. }
  50. url := m[urlName][0]
  51. return url, true
  52. }