mirror of
https://github.com/moby/moby.git
synced 2022-11-09 12:21:53 -05:00
128 lines
2.4 KiB
Go
128 lines
2.4 KiB
Go
|
package networkdb
|
||
|
|
||
|
import (
|
||
|
"github.com/hashicorp/memberlist"
|
||
|
"github.com/hashicorp/serf/serf"
|
||
|
)
|
||
|
|
||
|
type networkEventType uint8
|
||
|
|
||
|
const (
|
||
|
networkJoin networkEventType = 1 + iota
|
||
|
networkLeave
|
||
|
)
|
||
|
|
||
|
type networkEventData struct {
|
||
|
Event networkEventType
|
||
|
LTime serf.LamportTime
|
||
|
NodeName string
|
||
|
NetworkID string
|
||
|
}
|
||
|
|
||
|
type networkEventMessage struct {
|
||
|
id string
|
||
|
node string
|
||
|
msg []byte
|
||
|
}
|
||
|
|
||
|
func (m *networkEventMessage) Invalidates(other memberlist.Broadcast) bool {
|
||
|
otherm := other.(*networkEventMessage)
|
||
|
return m.id == otherm.id && m.node == otherm.node
|
||
|
}
|
||
|
|
||
|
func (m *networkEventMessage) Message() []byte {
|
||
|
return m.msg
|
||
|
}
|
||
|
|
||
|
func (m *networkEventMessage) Finished() {
|
||
|
}
|
||
|
|
||
|
func (nDB *NetworkDB) sendNetworkEvent(nid string, event networkEventType, ltime serf.LamportTime) error {
|
||
|
nEvent := networkEventData{
|
||
|
Event: event,
|
||
|
LTime: ltime,
|
||
|
NodeName: nDB.config.NodeName,
|
||
|
NetworkID: nid,
|
||
|
}
|
||
|
|
||
|
raw, err := encodeMessage(networkEventMsg, &nEvent)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
nDB.networkBroadcasts.QueueBroadcast(&networkEventMessage{
|
||
|
msg: raw,
|
||
|
id: nid,
|
||
|
node: nDB.config.NodeName,
|
||
|
})
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
type tableEventType uint8
|
||
|
|
||
|
const (
|
||
|
tableEntryCreate tableEventType = 1 + iota
|
||
|
tableEntryUpdate
|
||
|
tableEntryDelete
|
||
|
)
|
||
|
|
||
|
type tableEventData struct {
|
||
|
Event tableEventType
|
||
|
LTime serf.LamportTime
|
||
|
NetworkID string
|
||
|
TableName string
|
||
|
NodeName string
|
||
|
Value []byte
|
||
|
Key string
|
||
|
}
|
||
|
|
||
|
type tableEventMessage struct {
|
||
|
id string
|
||
|
tname string
|
||
|
key string
|
||
|
msg []byte
|
||
|
node string
|
||
|
}
|
||
|
|
||
|
func (m *tableEventMessage) Invalidates(other memberlist.Broadcast) bool {
|
||
|
otherm := other.(*tableEventMessage)
|
||
|
return m.id == otherm.id && m.tname == otherm.tname && m.key == otherm.key
|
||
|
}
|
||
|
|
||
|
func (m *tableEventMessage) Message() []byte {
|
||
|
return m.msg
|
||
|
}
|
||
|
|
||
|
func (m *tableEventMessage) Finished() {
|
||
|
}
|
||
|
|
||
|
func (nDB *NetworkDB) sendTableEvent(event tableEventType, nid string, tname string, key string, entry *entry) error {
|
||
|
tEvent := tableEventData{
|
||
|
Event: event,
|
||
|
LTime: entry.ltime,
|
||
|
NodeName: nDB.config.NodeName,
|
||
|
NetworkID: nid,
|
||
|
TableName: tname,
|
||
|
Key: key,
|
||
|
Value: entry.value,
|
||
|
}
|
||
|
|
||
|
raw, err := encodeMessage(tableEventMsg, &tEvent)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
nDB.RLock()
|
||
|
broadcastQ := nDB.networks[nDB.config.NodeName][nid].tableBroadcasts
|
||
|
nDB.RUnlock()
|
||
|
|
||
|
broadcastQ.QueueBroadcast(&tableEventMessage{
|
||
|
msg: raw,
|
||
|
id: nid,
|
||
|
tname: tname,
|
||
|
key: key,
|
||
|
node: nDB.config.NodeName,
|
||
|
})
|
||
|
return nil
|
||
|
}
|