|
@@ -141,6 +141,11 @@ type network struct {
|
|
|
|
|
|
// Number of gossip messages sent related to this network during the last stats collection period
|
|
|
qMessagesSent int
|
|
|
+
|
|
|
+ // Number of entries on the network. This value is the sum of all the entries of all the tables of a specific network.
|
|
|
+ // Its use is for statistics purposes. It keep tracks of database size and is printed per network every StatsPrintPeriod
|
|
|
+ // interval
|
|
|
+ entriesNumber int
|
|
|
}
|
|
|
|
|
|
// Config represents the configuration of the networdb instance and
|
|
@@ -338,8 +343,7 @@ func (nDB *NetworkDB) CreateEntry(tname, nid, key string, value []byte) error {
|
|
|
}
|
|
|
|
|
|
nDB.Lock()
|
|
|
- nDB.indexes[byTable].Insert(fmt.Sprintf("/%s/%s/%s", tname, nid, key), entry)
|
|
|
- nDB.indexes[byNetwork].Insert(fmt.Sprintf("/%s/%s/%s", nid, tname, key), entry)
|
|
|
+ nDB.createOrUpdateEntry(nid, tname, key, entry)
|
|
|
nDB.Unlock()
|
|
|
|
|
|
return nil
|
|
@@ -365,8 +369,7 @@ func (nDB *NetworkDB) UpdateEntry(tname, nid, key string, value []byte) error {
|
|
|
}
|
|
|
|
|
|
nDB.Lock()
|
|
|
- nDB.indexes[byTable].Insert(fmt.Sprintf("/%s/%s/%s", tname, nid, key), entry)
|
|
|
- nDB.indexes[byNetwork].Insert(fmt.Sprintf("/%s/%s/%s", nid, tname, key), entry)
|
|
|
+ nDB.createOrUpdateEntry(nid, tname, key, entry)
|
|
|
nDB.Unlock()
|
|
|
|
|
|
return nil
|
|
@@ -402,7 +405,7 @@ func (nDB *NetworkDB) DeleteEntry(tname, nid, key string) error {
|
|
|
node: nDB.config.NodeName,
|
|
|
value: value,
|
|
|
deleting: true,
|
|
|
- reapTime: reapInterval,
|
|
|
+ reapTime: reapEntryInterval,
|
|
|
}
|
|
|
|
|
|
if err := nDB.sendTableEvent(TableEventTypeDelete, nid, tname, key, entry); err != nil {
|
|
@@ -410,8 +413,7 @@ func (nDB *NetworkDB) DeleteEntry(tname, nid, key string) error {
|
|
|
}
|
|
|
|
|
|
nDB.Lock()
|
|
|
- nDB.indexes[byTable].Insert(fmt.Sprintf("/%s/%s/%s", tname, nid, key), entry)
|
|
|
- nDB.indexes[byNetwork].Insert(fmt.Sprintf("/%s/%s/%s", nid, tname, key), entry)
|
|
|
+ nDB.createOrUpdateEntry(nid, tname, key, entry)
|
|
|
nDB.Unlock()
|
|
|
|
|
|
return nil
|
|
@@ -473,10 +475,10 @@ func (nDB *NetworkDB) deleteNodeNetworkEntries(nid, node string) {
|
|
|
|
|
|
entry := &entry{
|
|
|
ltime: oldEntry.ltime,
|
|
|
- node: node,
|
|
|
+ node: oldEntry.node,
|
|
|
value: oldEntry.value,
|
|
|
deleting: true,
|
|
|
- reapTime: reapInterval,
|
|
|
+ reapTime: reapEntryInterval,
|
|
|
}
|
|
|
|
|
|
// we arrived at this point in 2 cases:
|
|
@@ -488,12 +490,10 @@ func (nDB *NetworkDB) deleteNodeNetworkEntries(nid, node string) {
|
|
|
// without doing a delete of all the objects
|
|
|
entry.ltime++
|
|
|
}
|
|
|
- nDB.indexes[byTable].Insert(fmt.Sprintf("/%s/%s/%s", tname, nid, key), entry)
|
|
|
- nDB.indexes[byNetwork].Insert(fmt.Sprintf("/%s/%s/%s", nid, tname, key), entry)
|
|
|
+ nDB.createOrUpdateEntry(nid, tname, key, entry)
|
|
|
} else {
|
|
|
// the local node is leaving the network, all the entries of remote nodes can be safely removed
|
|
|
- nDB.indexes[byTable].Delete(fmt.Sprintf("/%s/%s/%s", tname, nid, key))
|
|
|
- nDB.indexes[byNetwork].Delete(fmt.Sprintf("/%s/%s/%s", nid, tname, key))
|
|
|
+ nDB.deleteEntry(nid, tname, key)
|
|
|
}
|
|
|
|
|
|
nDB.broadcaster.Write(makeEvent(opDelete, tname, nid, key, entry.value))
|
|
@@ -513,8 +513,7 @@ func (nDB *NetworkDB) deleteNodeTableEntries(node string) {
|
|
|
nid := params[1]
|
|
|
key := params[2]
|
|
|
|
|
|
- nDB.indexes[byTable].Delete(fmt.Sprintf("/%s/%s/%s", tname, nid, key))
|
|
|
- nDB.indexes[byNetwork].Delete(fmt.Sprintf("/%s/%s/%s", nid, tname, key))
|
|
|
+ nDB.deleteEntry(nid, tname, key)
|
|
|
|
|
|
nDB.broadcaster.Write(makeEvent(opDelete, tname, nid, key, oldEntry.value))
|
|
|
return false
|
|
@@ -558,7 +557,12 @@ func (nDB *NetworkDB) JoinNetwork(nid string) error {
|
|
|
nodeNetworks = make(map[string]*network)
|
|
|
nDB.networks[nDB.config.NodeName] = nodeNetworks
|
|
|
}
|
|
|
- nodeNetworks[nid] = &network{id: nid, ltime: ltime}
|
|
|
+ n, ok := nodeNetworks[nid]
|
|
|
+ var entries int
|
|
|
+ if ok {
|
|
|
+ entries = n.entriesNumber
|
|
|
+ }
|
|
|
+ nodeNetworks[nid] = &network{id: nid, ltime: ltime, entriesNumber: entries}
|
|
|
nodeNetworks[nid].tableBroadcasts = &memberlist.TransmitLimitedQueue{
|
|
|
NumNodes: func() int {
|
|
|
nDB.RLock()
|
|
@@ -567,6 +571,7 @@ func (nDB *NetworkDB) JoinNetwork(nid string) error {
|
|
|
},
|
|
|
RetransmitMult: 4,
|
|
|
}
|
|
|
+
|
|
|
nDB.addNetworkNode(nid, nDB.config.NodeName)
|
|
|
networkNodes := nDB.networkNodes[nid]
|
|
|
nDB.Unlock()
|
|
@@ -614,8 +619,9 @@ 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)
|
|
|
n.ltime = ltime
|
|
|
- n.reapTime = reapInterval
|
|
|
+ n.reapTime = reapNetworkInterval
|
|
|
n.leaving = true
|
|
|
return nil
|
|
|
}
|
|
@@ -679,3 +685,33 @@ func (nDB *NetworkDB) updateLocalNetworkTime() {
|
|
|
n.ltime = ltime
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+// createOrUpdateEntry this function handles the creation or update of entries into the local
|
|
|
+// tree store. It is also used to keep in sync the entries number of the network (all tables are aggregated)
|
|
|
+func (nDB *NetworkDB) createOrUpdateEntry(nid, tname, key string, entry interface{}) (bool, bool) {
|
|
|
+ _, okTable := nDB.indexes[byTable].Insert(fmt.Sprintf("/%s/%s/%s", tname, nid, key), entry)
|
|
|
+ _, 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]
|
|
|
+ if ok {
|
|
|
+ n.entriesNumber++
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return okTable, okNetwork
|
|
|
+}
|
|
|
+
|
|
|
+// deleteEntry this function handles the deletion of entries into the local tree store.
|
|
|
+// It is also used to keep in sync the entries number of the network (all tables are aggregated)
|
|
|
+func (nDB *NetworkDB) deleteEntry(nid, tname, key string) (bool, bool) {
|
|
|
+ _, okTable := nDB.indexes[byTable].Delete(fmt.Sprintf("/%s/%s/%s", tname, nid, key))
|
|
|
+ _, 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]
|
|
|
+ if ok {
|
|
|
+ n.entriesNumber--
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return okTable, okNetwork
|
|
|
+}
|