Skip to content

Commit 0fe6b9d

Browse files
authored
node manager use atomic to store node map (#367)
1 parent ee1f8f9 commit 0fe6b9d

File tree

1 file changed

+14
-11
lines changed

1 file changed

+14
-11
lines changed

server/watcher/module_node_manager.go

+14-11
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,13 @@ package watcher
1515

1616
import (
1717
"context"
18-
"github.com/flowbehappy/tigate/pkg/node"
19-
"github.com/pingcap/tiflow/cdc/model"
2018
"sync"
19+
"sync/atomic"
2120
"time"
2221

22+
"github.com/flowbehappy/tigate/pkg/node"
2323
"github.com/pingcap/log"
24+
"github.com/pingcap/tiflow/cdc/model"
2425
"github.com/pingcap/tiflow/pkg/config"
2526
"github.com/pingcap/tiflow/pkg/etcd"
2627
"github.com/pingcap/tiflow/pkg/orchestrator"
@@ -36,7 +37,7 @@ type NodeChangeHandler func(map[node.ID]*node.Info)
3637
type NodeManager struct {
3738
session *concurrency.Session
3839
etcdClient etcd.CDCEtcdClient
39-
nodes map[node.ID]*node.Info
40+
nodes atomic.Pointer[map[node.ID]*node.Info]
4041

4142
nodeChangeHandlers struct {
4243
sync.RWMutex
@@ -48,15 +49,16 @@ func NewNodeManager(
4849
session *concurrency.Session,
4950
etcdClient etcd.CDCEtcdClient,
5051
) *NodeManager {
51-
return &NodeManager{
52+
m := &NodeManager{
5253
session: session,
5354
etcdClient: etcdClient,
54-
nodes: make(map[node.ID]*node.Info),
5555
nodeChangeHandlers: struct {
5656
sync.RWMutex
5757
m map[node.ID]NodeChangeHandler
5858
}{m: make(map[node.ID]NodeChangeHandler)},
5959
}
60+
m.nodes.Store(&map[node.ID]*node.Info{})
61+
return m
6062
}
6163

6264
func (c *NodeManager) Name() string {
@@ -73,22 +75,23 @@ func (c *NodeManager) Tick(
7375
changed := false
7476
allNodes := make(map[node.ID]*node.Info, len(state.Captures))
7577

76-
for _, node := range c.nodes {
77-
if _, exist := state.Captures[model.CaptureID(node.ID)]; !exist {
78+
oldMap := *c.nodes.Load()
79+
for _, info := range oldMap {
80+
if _, exist := state.Captures[model.CaptureID(info.ID)]; !exist {
7881
changed = true
7982
}
8083
}
8184

8285
for _, capture := range state.Captures {
83-
if _, exist := c.nodes[node.ID(capture.ID)]; !exist {
86+
if _, exist := oldMap[node.ID(capture.ID)]; !exist {
8487
changed = true
8588
}
8689
allNodes[node.ID(capture.ID)] = node.CaptureInfoToNodeInfo(capture)
8790
}
88-
c.nodes = allNodes
91+
c.nodes.Store(&allNodes)
8992
if changed {
9093
log.Info("server change detected")
91-
// handle node change event
94+
// handle info change event
9295
c.nodeChangeHandlers.RLock()
9396
defer c.nodeChangeHandlers.RUnlock()
9497
for _, handler := range c.nodeChangeHandlers.m {
@@ -100,7 +103,7 @@ func (c *NodeManager) Tick(
100103

101104
// GetAliveNodes get all alive captures, the caller mustn't modify the returned map
102105
func (c *NodeManager) GetAliveNodes() map[node.ID]*node.Info {
103-
return c.nodes
106+
return *c.nodes.Load()
104107
}
105108

106109
func (c *NodeManager) Run(ctx context.Context) error {

0 commit comments

Comments
 (0)