My implementation of gossip-gloomers - the fly.io distributed systems challenge (https://fly.io/dist-sys/)
1package main
2
3import (
4 "log"
5 "log/slog"
6 "sync"
7
8 maelstrom "github.com/jepsen-io/maelstrom/demo/go"
9)
10
11func main() {
12 slog.Info("starting server")
13 n := maelstrom.NewNode()
14
15 server := newServer(n)
16
17 if err := server.run(); err != nil {
18 log.Fatal(err)
19 }
20}
21
22type server struct {
23 node *maelstrom.Node
24
25 neighbours *neigbours
26
27 ids []int
28 mu sync.Mutex
29}
30
31func newServer(node *maelstrom.Node) *server {
32 server := server{
33 node: node,
34 neighbours: &neigbours{},
35 }
36 node.Handle("echo", server.handleEcho)
37 node.Handle("generate", server.handleGenerate)
38 node.Handle("broadcast", server.handleBroadcast)
39 node.Handle("read", server.handleRead)
40 node.Handle("topology", server.handleTopology)
41
42 return &server
43}
44
45func (s *server) run() error {
46 return s.node.Run()
47}
48
49type neigbours struct {
50 nodes []string
51 mu sync.Mutex
52}
53
54func (n *neigbours) addNeighbours(nodes []string) {
55 n.mu.Lock()
56 defer n.mu.Unlock()
57 n.nodes = nodes
58}
59
60func (n *neigbours) getNeighbours() []string {
61 n.mu.Lock()
62 defer n.mu.Unlock()
63 return n.nodes
64}