Welcome to mirror list, hosted at ThFree Co, Russian Federation.

main.go « gossip-test « cmd - gitlab.com/gitlab-org/gitaly.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: b01e2d6060d3e8ae2f0d9aed4451240448347105 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
package main

import (
	"flag"
	"fmt"
	"log"
	"os"
	"strings"
	"sync/atomic"
	"time"

	"github.com/hashicorp/memberlist"
)

type Delegate struct {
	Value int32
	Port  int
}

func (d *Delegate) NodeMeta(limit int) []byte {
	log.Printf("NodeMeta called")
	return []byte(fmt.Sprintf("localhost:%d:%d", d.Port, atomic.LoadInt32(&d.Value)))
}

func (d Delegate) NotifyMsg([]byte) {
	log.Printf("NotifyMsg called")
}

func (d Delegate) GetBroadcasts(overhead, limit int) [][]byte {
	return nil
}

func (d Delegate) LocalState(join bool) []byte {
	log.Printf("LocalState called")
	return []byte(fmt.Sprintf("port=%d", d.Port))
}

func (d Delegate) MergeRemoteState(buf []byte, join bool) {
	log.Printf("MergeRemoteState called")
}

func main() {
	listenPort := flag.Int("port", 0, "listening port")
	bootstrapAddr := flag.String("join", "", "list of addresses to join")
	flag.Parse()

	hostname, err := os.Hostname()
	if err != nil {
		log.Fatalf("get hostname: %q", err)
	}

	cfg := memberlist.DefaultLocalConfig()

	delegate := &Delegate{Port: *listenPort}
	cfg.Delegate = delegate
	cfg.Name = fmt.Sprintf("%s:%d", hostname, *listenPort)
	cfg.BindAddr = "127.0.0.1"
	cfg.BindPort = *listenPort
	cfg.AdvertiseAddr = cfg.BindAddr
	cfg.AdvertisePort = cfg.BindPort
	list, err := memberlist.Create(cfg)
	if err != nil {
		log.Fatalf("create list: %q", err)
	}

	if *bootstrapAddr != "" {
		if _, err := list.Join(strings.Split(*bootstrapAddr, ",")); err != nil {
			log.Fatal("join: %q", err)
		}
	}

	for range time.NewTicker(5 * time.Second).C {
		for _, member := range list.Members() {
			log.Printf("%q: %q", member.Name, member.Meta)
		}

		list.UpdateNode(time.Second)
		atomic.AddInt32(&delegate.Value, 1)
	}
}