package syncdb import ( "encoding/json" "fmt" "time" "github.com/hashicorp/memberlist" ) var ( members = make(map[string]NodeInfo,0) delay time.Duration ) // delegate is the interface that clients must implement if they want to hook into the gossip layer of Memberlist. type delegate struct{} // NodeMeta is the delegate method, must implement. func (d *delegate) NodeMeta(limit int) []byte { return []byte{} } // LocalState is the delegate method, must implement. func (d *delegate) LocalState(join bool) []byte { return []byte{} } // MergeRemoteState is the delegate method, must implement. func (d *delegate) MergeRemoteState(buf []byte, join bool) { } // GetBroadcasts is the delegate method, must implement. func (d *delegate) GetBroadcasts(overhead, limit int) [][]byte { return [][]byte{} } // eventDelegate is the interface that clients must implement if they want to hook into the gossip layer of Memberlist. type eventDelegate struct{} // NotifyJoin is the eventDelegate method, must implement. func (ed *eventDelegate) NotifyJoin(node *memberlist.Node) { } // NotifyLeave is the eventDelegate method, must implement. func (ed *eventDelegate) NotifyLeave(node *memberlist.Node) { } // NotifyUpdate is the eventDelegate method, must implement. func (ed *eventDelegate) NotifyUpdate(node *memberlist.Node) { } // NotifyMsg is called when a user-data message is received func (d *delegate) NotifyMsg(b []byte) { // logMsg(b) n := NodeInfo{} if err:= json.Unmarshal(b, &n);err ==nil { members[n.NodeID] = n } else { fmt.Println("NotifyMsg msg unmarshal err") } } func logMsg(b []byte) { type nodeInfo struct { NodeName string `json:"name"` Address string `json:"address"` } node := nodeInfo{} if err := json.Unmarshal(b, &node); err != nil { fmt.Println("Umarshal failed:", err) return } fmt.Println(node) } func CreateSearchNode(key string) (*memberlist.Memberlist, error) { conf := memberlist.DefaultLocalConfig() conf.Events = &eventDelegate{} conf.Delegate = &delegate{} conf.BindAddr = BroadcastIP conf.BindPort = BroadcastPort conf.Name = "Cluster-Searcher" keyring, err := memberlist.NewKeyring(nil, []byte(key)) if err != nil { fmt.Printf("Failed to restore keyring: %s", err) return nil, err } conf.Keyring = keyring return memberlist.Create(conf) } func CreateSearchNodeWhitClose(key string, delay time.Duration) map[string]NodeInfo { m, err := CreateSearchNode(key) if err == nil { // fmt.Printf("Local member %s:%d\n", m.LocalNode().Addr, m.LocalNode().Port) time.Sleep(delay) m.Shutdown() } return members } func CloseSearchNode(m *memberlist.Memberlist) error { return m.Shutdown() } func GetSearchNodes() map[string]NodeInfo { return members }