name_url_map.go 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  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 nodeName == "" {
  41. return "", false
  42. }
  43. // convert nodeName to url from etcd storage
  44. key := path.Join("/_etcd/machines", nodeName)
  45. e, err := etcdStore.Get(key, false, false, 0, 0)
  46. if err != nil {
  47. return "", false
  48. }
  49. m, err := url.ParseQuery(e.Value)
  50. if err != nil {
  51. panic("Failed to parse machines entry")
  52. }
  53. url := m[urlName][0]
  54. return url, true
  55. }