|
@@ -11,6 +11,7 @@ import (
|
|
|
"time"
|
|
|
|
|
|
"github.com/armon/go-radix"
|
|
|
+ "github.com/docker/docker/pkg/stringid"
|
|
|
"github.com/docker/go-events"
|
|
|
"github.com/docker/libnetwork/types"
|
|
|
"github.com/hashicorp/memberlist"
|
|
@@ -151,8 +152,11 @@ type network struct {
|
|
|
// Config represents the configuration of the networdb instance and
|
|
|
// can be passed by the caller.
|
|
|
type Config struct {
|
|
|
- // NodeName is the cluster wide unique name for this node.
|
|
|
- NodeName string
|
|
|
+ // NodeID is the node unique identifier of the node when is part of the cluster
|
|
|
+ NodeID string
|
|
|
+
|
|
|
+ // Hostname is the node hostname.
|
|
|
+ Hostname string
|
|
|
|
|
|
// BindAddr is the IP on which networkdb listens. It can be
|
|
|
// 0.0.0.0 to listen on all addresses on the host.
|
|
@@ -210,7 +214,8 @@ type entry struct {
|
|
|
func DefaultConfig() *Config {
|
|
|
hostname, _ := os.Hostname()
|
|
|
return &Config{
|
|
|
- NodeName: hostname,
|
|
|
+ NodeID: stringid.TruncateID(stringid.GenerateRandomID()),
|
|
|
+ Hostname: hostname,
|
|
|
BindAddr: "0.0.0.0",
|
|
|
PacketBufferSize: 1400,
|
|
|
StatsPrintPeriod: 5 * time.Minute,
|
|
@@ -236,6 +241,7 @@ func New(c *Config) (*NetworkDB, error) {
|
|
|
nDB.indexes[byTable] = radix.New()
|
|
|
nDB.indexes[byNetwork] = radix.New()
|
|
|
|
|
|
+ logrus.Debugf("New memberlist node - Node:%v will use memberlist nodeID:%v", c.Hostname, c.NodeID)
|
|
|
if err := nDB.clusterInit(); err != nil {
|
|
|
return nil, err
|
|
|
}
|
|
@@ -259,7 +265,7 @@ func (nDB *NetworkDB) Join(members []string) error {
|
|
|
// stopping timers, canceling goroutines etc.
|
|
|
func (nDB *NetworkDB) Close() {
|
|
|
if err := nDB.clusterLeave(); err != nil {
|
|
|
- logrus.Errorf("Could not close DB %s: %v", nDB.config.NodeName, err)
|
|
|
+ logrus.Errorf("%v(%v) Could not close DB: %v", nDB.config.Hostname, nDB.config.NodeID, err)
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -334,7 +340,7 @@ func (nDB *NetworkDB) CreateEntry(tname, nid, key string, value []byte) error {
|
|
|
|
|
|
entry := &entry{
|
|
|
ltime: nDB.tableClock.Increment(),
|
|
|
- node: nDB.config.NodeName,
|
|
|
+ node: nDB.config.NodeID,
|
|
|
value: value,
|
|
|
}
|
|
|
|
|
@@ -360,7 +366,7 @@ func (nDB *NetworkDB) UpdateEntry(tname, nid, key string, value []byte) error {
|
|
|
|
|
|
entry := &entry{
|
|
|
ltime: nDB.tableClock.Increment(),
|
|
|
- node: nDB.config.NodeName,
|
|
|
+ node: nDB.config.NodeID,
|
|
|
value: value,
|
|
|
}
|
|
|
|
|
@@ -402,7 +408,7 @@ func (nDB *NetworkDB) DeleteEntry(tname, nid, key string) error {
|
|
|
|
|
|
entry := &entry{
|
|
|
ltime: nDB.tableClock.Increment(),
|
|
|
- node: nDB.config.NodeName,
|
|
|
+ node: nDB.config.NodeID,
|
|
|
value: value,
|
|
|
deleting: true,
|
|
|
reapTime: reapEntryInterval,
|
|
@@ -451,7 +457,7 @@ func (nDB *NetworkDB) deleteNetworkEntriesForNode(deletedNode string) {
|
|
|
// entries owned by remote nodes, we will accept them and we notify the application
|
|
|
func (nDB *NetworkDB) deleteNodeNetworkEntries(nid, node string) {
|
|
|
// Indicates if the delete is triggered for the local node
|
|
|
- isNodeLocal := node == nDB.config.NodeName
|
|
|
+ isNodeLocal := node == nDB.config.NodeID
|
|
|
|
|
|
nDB.indexes[byNetwork].WalkPrefix(fmt.Sprintf("/%s", nid),
|
|
|
func(path string, v interface{}) bool {
|
|
@@ -552,10 +558,10 @@ func (nDB *NetworkDB) JoinNetwork(nid string) error {
|
|
|
ltime := nDB.networkClock.Increment()
|
|
|
|
|
|
nDB.Lock()
|
|
|
- nodeNetworks, ok := nDB.networks[nDB.config.NodeName]
|
|
|
+ nodeNetworks, ok := nDB.networks[nDB.config.NodeID]
|
|
|
if !ok {
|
|
|
nodeNetworks = make(map[string]*network)
|
|
|
- nDB.networks[nDB.config.NodeName] = nodeNetworks
|
|
|
+ nDB.networks[nDB.config.NodeID] = nodeNetworks
|
|
|
}
|
|
|
n, ok := nodeNetworks[nid]
|
|
|
var entries int
|
|
@@ -571,8 +577,7 @@ func (nDB *NetworkDB) JoinNetwork(nid string) error {
|
|
|
},
|
|
|
RetransmitMult: 4,
|
|
|
}
|
|
|
-
|
|
|
- nDB.addNetworkNode(nid, nDB.config.NodeName)
|
|
|
+ nDB.addNetworkNode(nid, nDB.config.NodeID)
|
|
|
networkNodes := nDB.networkNodes[nid]
|
|
|
nDB.Unlock()
|
|
|
|
|
@@ -580,7 +585,7 @@ func (nDB *NetworkDB) JoinNetwork(nid string) error {
|
|
|
return fmt.Errorf("failed to send leave network event for %s: %v", nid, err)
|
|
|
}
|
|
|
|
|
|
- logrus.Debugf("%s: joined network %s", nDB.config.NodeName, nid)
|
|
|
+ logrus.Debugf("%v(%v): joined network %s", nDB.config.Hostname, nDB.config.NodeID, nid)
|
|
|
if _, err := nDB.bulkSync(networkNodes, true); err != nil {
|
|
|
logrus.Errorf("Error bulk syncing while joining network %s: %v", nid, err)
|
|
|
}
|
|
@@ -604,12 +609,12 @@ func (nDB *NetworkDB) LeaveNetwork(nid string) error {
|
|
|
defer nDB.Unlock()
|
|
|
|
|
|
// Remove myself from the list of the nodes participating to the network
|
|
|
- nDB.deleteNetworkNode(nid, nDB.config.NodeName)
|
|
|
+ nDB.deleteNetworkNode(nid, nDB.config.NodeID)
|
|
|
|
|
|
// Update all the local entries marking them for deletion and delete all the remote entries
|
|
|
- nDB.deleteNodeNetworkEntries(nid, nDB.config.NodeName)
|
|
|
+ nDB.deleteNodeNetworkEntries(nid, nDB.config.NodeID)
|
|
|
|
|
|
- nodeNetworks, ok := nDB.networks[nDB.config.NodeName]
|
|
|
+ nodeNetworks, ok := nDB.networks[nDB.config.NodeID]
|
|
|
if !ok {
|
|
|
return fmt.Errorf("could not find self node for network %s while trying to leave", nid)
|
|
|
}
|
|
@@ -619,7 +624,7 @@ func (nDB *NetworkDB) LeaveNetwork(nid string) error {
|
|
|
return fmt.Errorf("could not find network %s while trying to leave", nid)
|
|
|
}
|
|
|
|
|
|
- logrus.Debugf("%s: leaving network %s", nDB.config.NodeName, nid)
|
|
|
+ logrus.Debugf("%v(%v): leaving network %s", nDB.config.Hostname, nDB.config.NodeID, nid)
|
|
|
n.ltime = ltime
|
|
|
n.reapTime = reapNetworkInterval
|
|
|
n.leaving = true
|
|
@@ -665,7 +670,7 @@ func (nDB *NetworkDB) findCommonNetworks(nodeName string) []string {
|
|
|
defer nDB.RUnlock()
|
|
|
|
|
|
var networks []string
|
|
|
- for nid := range nDB.networks[nDB.config.NodeName] {
|
|
|
+ for nid := range nDB.networks[nDB.config.NodeID] {
|
|
|
if n, ok := nDB.networks[nodeName][nid]; ok {
|
|
|
if !n.leaving {
|
|
|
networks = append(networks, nid)
|
|
@@ -681,7 +686,7 @@ func (nDB *NetworkDB) updateLocalNetworkTime() {
|
|
|
defer nDB.Unlock()
|
|
|
|
|
|
ltime := nDB.networkClock.Increment()
|
|
|
- for _, n := range nDB.networks[nDB.config.NodeName] {
|
|
|
+ for _, n := range nDB.networks[nDB.config.NodeID] {
|
|
|
n.ltime = ltime
|
|
|
}
|
|
|
}
|
|
@@ -693,7 +698,7 @@ func (nDB *NetworkDB) createOrUpdateEntry(nid, tname, key string, entry interfac
|
|
|
_, okNetwork := nDB.indexes[byNetwork].Insert(fmt.Sprintf("/%s/%s/%s", nid, tname, key), entry)
|
|
|
if !okNetwork {
|
|
|
// Add only if it is an insert not an update
|
|
|
- n, ok := nDB.networks[nDB.config.NodeName][nid]
|
|
|
+ n, ok := nDB.networks[nDB.config.NodeID][nid]
|
|
|
if ok {
|
|
|
n.entriesNumber++
|
|
|
}
|
|
@@ -708,7 +713,7 @@ func (nDB *NetworkDB) deleteEntry(nid, tname, key string) (bool, bool) {
|
|
|
_, okNetwork := nDB.indexes[byNetwork].Delete(fmt.Sprintf("/%s/%s/%s", nid, tname, key))
|
|
|
if okNetwork {
|
|
|
// Remove only if the delete is successful
|
|
|
- n, ok := nDB.networks[nDB.config.NodeName][nid]
|
|
|
+ n, ok := nDB.networks[nDB.config.NodeID][nid]
|
|
|
if ok {
|
|
|
n.entriesNumber--
|
|
|
}
|