From 6ef6050a854cb9a20bef8005a5f2a8463374ef17 Mon Sep 17 00:00:00 2001
From: chenshijun <csj_sky@126.com>
Date: 星期二, 06 八月 2019 17:05:34 +0800
Subject: [PATCH] Merge branch 'master' of http://192.168.1.14:10010/r/syncdb

---
 searcher.go |  110 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 110 insertions(+), 0 deletions(-)

diff --git a/searcher.go b/searcher.go
new file mode 100644
index 0000000..afd2daa
--- /dev/null
+++ b/searcher.go
@@ -0,0 +1,110 @@
+package syncdb
+
+import (
+	"encoding/json"
+	"fmt"
+	"time"
+
+	"github.com/hashicorp/memberlist"
+)
+
+var (
+	members [][]byte
+	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)
+	members = append(members, b)
+}
+
+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) [][]byte {
+	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() [][]byte {
+	return members
+}

--
Gitblit v1.8.0