PageRenderTime 43ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 0ms

/src/pkg/member/member.go

http://github.com/ha/doozerd
Go | 57 lines | 48 code | 9 blank | 0 comment | 11 complexity | 85bcdb61777eccb682f0615928e2814b MD5 | raw file
Possible License(s): MIT
  1. package member
  2. import (
  3. "doozer/consensus"
  4. "doozer/store"
  5. "log"
  6. )
  7. var (
  8. calGlob = store.MustCompileGlob("/ctl/cal/*")
  9. )
  10. func Clean(c chan string, st *store.Store, p consensus.Proposer) {
  11. for addr := range c {
  12. _, g := st.Snap()
  13. name := getName(addr, g)
  14. if name != "" {
  15. go func() {
  16. clearSlot(p, g, name)
  17. removeInfo(p, g, name)
  18. }()
  19. }
  20. }
  21. }
  22. func getName(addr string, g store.Getter) string {
  23. for _, name := range store.Getdir(g, "/ctl/node") {
  24. if store.GetString(g, "/ctl/node/"+name+"/addr") == addr {
  25. return name
  26. }
  27. }
  28. return ""
  29. }
  30. func clearSlot(p consensus.Proposer, g store.Getter, name string) {
  31. store.Walk(g, calGlob, func(path, body string, rev int64) bool {
  32. if body == name {
  33. consensus.Set(p, path, nil, rev)
  34. }
  35. return false
  36. })
  37. }
  38. func removeInfo(p consensus.Proposer, g store.Getter, name string) {
  39. glob, err := store.CompileGlob("/ctl/node/" + name + "/**")
  40. if err != nil {
  41. log.Println(err)
  42. return
  43. }
  44. store.Walk(g, glob, func(path, _ string, rev int64) bool {
  45. consensus.Del(p, path, rev)
  46. return false
  47. })
  48. }