Browse code

Vendoring libnetwork

Fix for networkDB garbage collection (PR: https://github.com/docker/libnetwork/pull/1944)
Added extra logs to monitor the netowrkDB status and number of entries per network

Signed-off-by: Flavio Crisciani <flavio.crisciani@docker.com>

Flavio Crisciani authored on 2017/09/25 08:44:16
Showing 14 changed files
... ...
@@ -30,7 +30,7 @@ golang.org/x/sync de49d9dcd27d4f764488181bea099dfe6179bcf0
30 30
 github.com/containerd/continuity 22694c680ee48fb8f50015b44618517e2bde77e8
31 31
 
32 32
 #get libnetwork packages
33
-github.com/docker/libnetwork 60e002dd61885e1cd909582f00f7eb4da634518a
33
+github.com/docker/libnetwork 0f08d31bf0e640e0cdc6d5161227f87602d605c5
34 34
 github.com/docker/go-events 9461782956ad83b30282bf90e31fa6a70c255ba9
35 35
 github.com/armon/go-radix e39d623f12e8e41c7b5529e9a9dd67a1e2261f80
36 36
 github.com/armon/go-metrics eb0af217e5e9747e41dd5303755356b62d28e3ec
... ...
@@ -763,11 +763,7 @@ func (d *driver) createNetwork(config *networkConfiguration) error {
763 763
 
764 764
 	// Apply the prepared list of steps, and abort at the first error.
765 765
 	bridgeSetup.queueStep(setupDeviceUp)
766
-	if err = bridgeSetup.apply(); err != nil {
767
-		return err
768
-	}
769
-
770
-	return nil
766
+	return bridgeSetup.apply()
771 767
 }
772 768
 
773 769
 func (d *driver) DeleteNetwork(nid string) error {
... ...
@@ -169,11 +169,7 @@ func setupIPTablesInternal(bridgeIface string, addr net.Addr, icc, ipmasq, hairp
169 169
 	}
170 170
 
171 171
 	// Set Accept on all non-intercontainer outgoing packets.
172
-	if err := programChainRule(outRule, "ACCEPT NON_ICC OUTGOING", enable); err != nil {
173
-		return err
174
-	}
175
-
176
-	return nil
172
+	return programChainRule(outRule, "ACCEPT NON_ICC OUTGOING", enable)
177 173
 }
178 174
 
179 175
 func programChainRule(rule iptRule, ruleDescr string, insert bool) error {
... ...
@@ -304,10 +300,7 @@ func setupInternalNetworkRules(bridgeIface string, addr net.Addr, icc, insert bo
304 304
 		return err
305 305
 	}
306 306
 	// Set Inter Container Communication.
307
-	if err := setIcc(bridgeIface, icc, insert); err != nil {
308
-		return err
309
-	}
310
-	return nil
307
+	return setIcc(bridgeIface, icc, insert)
311 308
 }
312 309
 
313 310
 func clearEndpointConnections(nlh *netlink.Handle, ep *bridgeEndpoint) {
... ...
@@ -144,11 +144,7 @@ func (d *driver) deleteEndpointFromStore(e *endpoint) error {
144 144
 		return fmt.Errorf("overlay local store not initialized, ep not deleted")
145 145
 	}
146 146
 
147
-	if err := d.localStore.DeleteObjectAtomic(e); err != nil {
148
-		return err
149
-	}
150
-
151
-	return nil
147
+	return d.localStore.DeleteObjectAtomic(e)
152 148
 }
153 149
 
154 150
 func (d *driver) writeEndpointToStore(e *endpoint) error {
... ...
@@ -156,10 +152,7 @@ func (d *driver) writeEndpointToStore(e *endpoint) error {
156 156
 		return fmt.Errorf("overlay local store not initialized, ep not added")
157 157
 	}
158 158
 
159
-	if err := d.localStore.PutObjectAtomic(e); err != nil {
160
-		return err
161
-	}
162
-	return nil
159
+	return d.localStore.PutObjectAtomic(e)
163 160
 }
164 161
 
165 162
 func (ep *endpoint) DataScope() string {
... ...
@@ -134,11 +134,7 @@ func (d *driver) deleteEndpointFromStore(e *endpoint) error {
134 134
 		return fmt.Errorf("overlay local store not initialized, ep not deleted")
135 135
 	}
136 136
 
137
-	if err := d.localStore.DeleteObjectAtomic(e); err != nil {
138
-		return err
139
-	}
140
-
141
-	return nil
137
+	return d.localStore.DeleteObjectAtomic(e)
142 138
 }
143 139
 
144 140
 func (d *driver) writeEndpointToStore(e *endpoint) error {
... ...
@@ -146,10 +142,7 @@ func (d *driver) writeEndpointToStore(e *endpoint) error {
146 146
 		return fmt.Errorf("overlay local store not initialized, ep not added")
147 147
 	}
148 148
 
149
-	if err := d.localStore.PutObjectAtomic(e); err != nil {
150
-		return err
151
-	}
152
-	return nil
149
+	return d.localStore.PutObjectAtomic(e)
153 150
 }
154 151
 
155 152
 func (ep *endpoint) DataScope() string {
... ...
@@ -202,11 +202,7 @@ func (ep *endpoint) Info() EndpointInfo {
202 202
 		return ep
203 203
 	}
204 204
 
205
-	if epi := sb.getEndpoint(ep.ID()); epi != nil {
206
-		return epi
207
-	}
208
-
209
-	return nil
205
+	return sb.getEndpoint(ep.ID())
210 206
 }
211 207
 
212 208
 func (ep *endpoint) Iface() InterfaceInfo {
... ...
@@ -276,11 +276,7 @@ func (c *ChainInfo) Forward(action Action, ip net.IP, port int, proto, destAddr
276 276
 		"--dport", strconv.Itoa(destPort),
277 277
 		"-j", "MASQUERADE",
278 278
 	}
279
-	if err := ProgramRule(Nat, "POSTROUTING", action, args); err != nil {
280
-		return err
281
-	}
282
-
283
-	return nil
279
+	return ProgramRule(Nat, "POSTROUTING", action, args)
284 280
 }
285 281
 
286 282
 // Link adds reciprocal ACCEPT rule for two supplied IP addresses.
... ...
@@ -301,10 +297,7 @@ func (c *ChainInfo) Link(action Action, ip1, ip2 net.IP, port int, proto string,
301 301
 	// reverse
302 302
 	args[7], args[9] = args[9], args[7]
303 303
 	args[10] = "--sport"
304
-	if err := ProgramRule(Filter, c.Name, action, args); err != nil {
305
-		return err
306
-	}
307
-	return nil
304
+	return ProgramRule(Filter, c.Name, action, args)
308 305
 }
309 306
 
310 307
 // ProgramRule adds the rule specified by args only if the
... ...
@@ -134,6 +134,8 @@ func (nDB *NetworkDB) sendTableEvent(event TableEvent_Type, nid string, tname st
134 134
 		TableName: tname,
135 135
 		Key:       key,
136 136
 		Value:     entry.value,
137
+		// The duration in second is a float that below would be truncated
138
+		ResidualReapTime: int32(entry.reapTime.Seconds()),
137 139
 	}
138 140
 
139 141
 	raw, err := encodeMessage(MessageTypeTableEvent, &tEvent)
... ...
@@ -17,11 +17,15 @@ import (
17 17
 )
18 18
 
19 19
 const (
20
-	reapInterval     = 30 * time.Minute
21
-	reapPeriod       = 5 * time.Second
22
-	retryInterval    = 1 * time.Second
23
-	nodeReapInterval = 24 * time.Hour
24
-	nodeReapPeriod   = 2 * time.Hour
20
+	// The garbage collection logic for entries leverage the presence of the network.
21
+	// For this reason the expiration time of the network is put slightly higher than the entry expiration so that
22
+	// there is at least 5 extra cycle to make sure that all the entries are properly deleted before deleting the network.
23
+	reapEntryInterval   = 30 * time.Minute
24
+	reapNetworkInterval = reapEntryInterval + 5*reapPeriod
25
+	reapPeriod          = 5 * time.Second
26
+	retryInterval       = 1 * time.Second
27
+	nodeReapInterval    = 24 * time.Hour
28
+	nodeReapPeriod      = 2 * time.Hour
25 29
 )
26 30
 
27 31
 type logWriter struct{}
... ...
@@ -300,8 +304,9 @@ func (nDB *NetworkDB) reconnectNode() {
300 300
 // the reaper runs. NOTE nDB.reapTableEntries updates the reapTime with a readlock. This
301 301
 // is safe as long as no other concurrent path touches the reapTime field.
302 302
 func (nDB *NetworkDB) reapState() {
303
-	nDB.reapNetworks()
303
+	// The reapTableEntries leverage the presence of the network so garbage collect entries first
304 304
 	nDB.reapTableEntries()
305
+	nDB.reapNetworks()
305 306
 }
306 307
 
307 308
 func (nDB *NetworkDB) reapNetworks() {
... ...
@@ -321,43 +326,51 @@ func (nDB *NetworkDB) reapNetworks() {
321 321
 }
322 322
 
323 323
 func (nDB *NetworkDB) reapTableEntries() {
324
-	var paths []string
325
-
324
+	var nodeNetworks []string
325
+	// This is best effort, if the list of network changes will be picked up in the next cycle
326 326
 	nDB.RLock()
327
-	nDB.indexes[byTable].Walk(func(path string, v interface{}) bool {
328
-		entry, ok := v.(*entry)
329
-		if !ok {
330
-			return false
331
-		}
332
-
333
-		if !entry.deleting {
334
-			return false
335
-		}
336
-		if entry.reapTime > 0 {
337
-			entry.reapTime -= reapPeriod
338
-			return false
339
-		}
340
-		paths = append(paths, path)
341
-		return false
342
-	})
327
+	for nid := range nDB.networks[nDB.config.NodeName] {
328
+		nodeNetworks = append(nodeNetworks, nid)
329
+	}
343 330
 	nDB.RUnlock()
344 331
 
345
-	nDB.Lock()
346
-	for _, path := range paths {
347
-		params := strings.Split(path[1:], "/")
348
-		tname := params[0]
349
-		nid := params[1]
350
-		key := params[2]
351
-
352
-		if _, ok := nDB.indexes[byTable].Delete(fmt.Sprintf("/%s/%s/%s", tname, nid, key)); !ok {
353
-			logrus.Errorf("Could not delete entry in table %s with network id %s and key %s as it does not exist", tname, nid, key)
354
-		}
332
+	cycleStart := time.Now()
333
+	// In order to avoid blocking the database for a long time, apply the garbage collection logic by network
334
+	// The lock is taken at the beginning of the cycle and the deletion is inline
335
+	for _, nid := range nodeNetworks {
336
+		nDB.Lock()
337
+		nDB.indexes[byNetwork].WalkPrefix(fmt.Sprintf("/%s", nid), func(path string, v interface{}) bool {
338
+			// timeCompensation compensate in case the lock took some time to be released
339
+			timeCompensation := time.Since(cycleStart)
340
+			entry, ok := v.(*entry)
341
+			if !ok || !entry.deleting {
342
+				return false
343
+			}
355 344
 
356
-		if _, ok := nDB.indexes[byNetwork].Delete(fmt.Sprintf("/%s/%s/%s", nid, tname, key)); !ok {
357
-			logrus.Errorf("Could not delete entry in network %s with table name %s and key %s as it does not exist", nid, tname, key)
358
-		}
345
+			// In this check we are adding an extra 1 second to guarantee that when the number is truncated to int32 to fit the packet
346
+			// for the tableEvent the number is always strictly > 1 and never 0
347
+			if entry.reapTime > reapPeriod+timeCompensation+time.Second {
348
+				entry.reapTime -= reapPeriod + timeCompensation
349
+				return false
350
+			}
351
+
352
+			params := strings.Split(path[1:], "/")
353
+			nid := params[0]
354
+			tname := params[1]
355
+			key := params[2]
356
+
357
+			okTable, okNetwork := nDB.deleteEntry(nid, tname, key)
358
+			if !okTable {
359
+				logrus.Errorf("Table tree delete failed, entry with key:%s does not exists in the table:%s network:%s", key, tname, nid)
360
+			}
361
+			if !okNetwork {
362
+				logrus.Errorf("Network tree delete failed, entry with key:%s does not exists in the network:%s table:%s", key, nid, tname)
363
+			}
364
+
365
+			return false
366
+		})
367
+		nDB.Unlock()
359 368
 	}
360
-	nDB.Unlock()
361 369
 }
362 370
 
363 371
 func (nDB *NetworkDB) gossip() {
... ...
@@ -406,8 +419,9 @@ func (nDB *NetworkDB) gossip() {
406 406
 		// Collect stats and print the queue info, note this code is here also to have a view of the queues empty
407 407
 		network.qMessagesSent += len(msgs)
408 408
 		if printStats {
409
-			logrus.Infof("NetworkDB stats - Queue net:%s qLen:%d netPeers:%d netMsg/s:%d",
410
-				nid, broadcastQ.NumQueued(), broadcastQ.NumNodes(), network.qMessagesSent/int((nDB.config.StatsPrintPeriod/time.Second)))
409
+			logrus.Infof("NetworkDB stats - netID:%s leaving:%t netPeers:%d entries:%d Queue qLen:%d netMsg/s:%d",
410
+				nid, network.leaving, broadcastQ.NumNodes(), network.entriesNumber, broadcastQ.NumQueued(),
411
+				network.qMessagesSent/int((nDB.config.StatsPrintPeriod/time.Second)))
411 412
 			network.qMessagesSent = 0
412 413
 		}
413 414
 
... ...
@@ -572,6 +586,8 @@ func (nDB *NetworkDB) bulkSyncNode(networks []string, node string, unsolicited b
572 572
 				TableName: params[1],
573 573
 				Key:       params[2],
574 574
 				Value:     entry.value,
575
+				// The duration in second is a float that below would be truncated
576
+				ResidualReapTime: int32(entry.reapTime.Seconds()),
575 577
 			}
576 578
 
577 579
 			msg, err := encodeMessage(MessageTypeTableEvent, &tEvent)
... ...
@@ -1,9 +1,9 @@
1 1
 package networkdb
2 2
 
3 3
 import (
4
-	"fmt"
5 4
 	"net"
6 5
 	"strings"
6
+	"time"
7 7
 
8 8
 	"github.com/gogo/protobuf/proto"
9 9
 	"github.com/sirupsen/logrus"
... ...
@@ -165,7 +165,7 @@ func (nDB *NetworkDB) handleNetworkEvent(nEvent *NetworkEvent) bool {
165 165
 		n.ltime = nEvent.LTime
166 166
 		n.leaving = nEvent.Type == NetworkEventTypeLeave
167 167
 		if n.leaving {
168
-			n.reapTime = reapInterval
168
+			n.reapTime = reapNetworkInterval
169 169
 
170 170
 			// The remote node is leaving the network, but not the gossip cluster.
171 171
 			// Mark all its entries in deleted state, this will guarantee that
... ...
@@ -198,8 +198,7 @@ func (nDB *NetworkDB) handleNetworkEvent(nEvent *NetworkEvent) bool {
198 198
 }
199 199
 
200 200
 func (nDB *NetworkDB) handleTableEvent(tEvent *TableEvent) bool {
201
-	// Update our local clock if the received messages has newer
202
-	// time.
201
+	// Update our local clock if the received messages has newer time.
203 202
 	nDB.tableClock.Witness(tEvent.LTime)
204 203
 
205 204
 	// Ignore the table events for networks that are in the process of going away
... ...
@@ -235,20 +234,26 @@ func (nDB *NetworkDB) handleTableEvent(tEvent *TableEvent) bool {
235 235
 		node:     tEvent.NodeName,
236 236
 		value:    tEvent.Value,
237 237
 		deleting: tEvent.Type == TableEventTypeDelete,
238
+		reapTime: time.Duration(tEvent.ResidualReapTime) * time.Second,
238 239
 	}
239 240
 
240
-	if e.deleting {
241
-		e.reapTime = reapInterval
241
+	// All the entries marked for deletion should have a reapTime set greater than 0
242
+	// This case can happen if the cluster is running different versions of the engine where the old version does not have the
243
+	// field. If that is not the case, this can be a BUG
244
+	if e.deleting && e.reapTime == 0 {
245
+		logrus.Warnf("handleTableEvent object %+v has a 0 reapTime, is the cluster running the same docker engine version?", tEvent)
246
+		e.reapTime = reapEntryInterval
242 247
 	}
243 248
 
244 249
 	nDB.Lock()
245
-	nDB.indexes[byTable].Insert(fmt.Sprintf("/%s/%s/%s", tEvent.TableName, tEvent.NetworkID, tEvent.Key), e)
246
-	nDB.indexes[byNetwork].Insert(fmt.Sprintf("/%s/%s/%s", tEvent.NetworkID, tEvent.TableName, tEvent.Key), e)
250
+	nDB.createOrUpdateEntry(tEvent.NetworkID, tEvent.TableName, tEvent.Key, e)
247 251
 	nDB.Unlock()
248 252
 
249 253
 	if err != nil && tEvent.Type == TableEventTypeDelete {
250
-		// If it is a delete event and we didn't have the entry here don't repropagate
251
-		return true
254
+		// If it is a delete event and we did not have a state for it, don't propagate to the application
255
+		// If the residual reapTime is lower or equal to 1/6 of the total reapTime don't bother broadcasting it around
256
+		// most likely the cluster is already aware of it, if not who will sync with this node will catch the state too.
257
+		return e.reapTime > reapPeriod/6
252 258
 	}
253 259
 
254 260
 	var op opType
... ...
@@ -303,22 +308,17 @@ func (nDB *NetworkDB) handleTableMessage(buf []byte, isBulkSync bool) {
303 303
 		n, ok := nDB.networks[nDB.config.NodeName][tEvent.NetworkID]
304 304
 		nDB.RUnlock()
305 305
 
306
-		if !ok {
307
-			return
308
-		}
309
-
310
-		broadcastQ := n.tableBroadcasts
311
-
312
-		if broadcastQ == nil {
306
+		// if the network is not there anymore, OR we are leaving the network OR the broadcast queue is not present
307
+		if !ok || n.leaving || n.tableBroadcasts == nil {
313 308
 			return
314 309
 		}
315 310
 
316
-		broadcastQ.QueueBroadcast(&tableEventMessage{
311
+		n.tableBroadcasts.QueueBroadcast(&tableEventMessage{
317 312
 			msg:   buf,
318 313
 			id:    tEvent.NetworkID,
319 314
 			tname: tEvent.TableName,
320 315
 			key:   tEvent.Key,
321
-			node:  nDB.config.NodeName,
316
+			node:  tEvent.NodeName,
322 317
 		})
323 318
 	}
324 319
 }
... ...
@@ -141,6 +141,11 @@ type network struct {
141 141
 
142 142
 	// Number of gossip messages sent related to this network during the last stats collection period
143 143
 	qMessagesSent int
144
+
145
+	// Number of entries on the network. This value is the sum of all the entries of all the tables of a specific network.
146
+	// Its use is for statistics purposes. It keep tracks of database size and is printed per network every StatsPrintPeriod
147
+	// interval
148
+	entriesNumber int
144 149
 }
145 150
 
146 151
 // Config represents the configuration of the networdb instance and
... ...
@@ -338,8 +343,7 @@ func (nDB *NetworkDB) CreateEntry(tname, nid, key string, value []byte) error {
338 338
 	}
339 339
 
340 340
 	nDB.Lock()
341
-	nDB.indexes[byTable].Insert(fmt.Sprintf("/%s/%s/%s", tname, nid, key), entry)
342
-	nDB.indexes[byNetwork].Insert(fmt.Sprintf("/%s/%s/%s", nid, tname, key), entry)
341
+	nDB.createOrUpdateEntry(nid, tname, key, entry)
343 342
 	nDB.Unlock()
344 343
 
345 344
 	return nil
... ...
@@ -365,8 +369,7 @@ func (nDB *NetworkDB) UpdateEntry(tname, nid, key string, value []byte) error {
365 365
 	}
366 366
 
367 367
 	nDB.Lock()
368
-	nDB.indexes[byTable].Insert(fmt.Sprintf("/%s/%s/%s", tname, nid, key), entry)
369
-	nDB.indexes[byNetwork].Insert(fmt.Sprintf("/%s/%s/%s", nid, tname, key), entry)
368
+	nDB.createOrUpdateEntry(nid, tname, key, entry)
370 369
 	nDB.Unlock()
371 370
 
372 371
 	return nil
... ...
@@ -402,7 +405,7 @@ func (nDB *NetworkDB) DeleteEntry(tname, nid, key string) error {
402 402
 		node:     nDB.config.NodeName,
403 403
 		value:    value,
404 404
 		deleting: true,
405
-		reapTime: reapInterval,
405
+		reapTime: reapEntryInterval,
406 406
 	}
407 407
 
408 408
 	if err := nDB.sendTableEvent(TableEventTypeDelete, nid, tname, key, entry); err != nil {
... ...
@@ -410,8 +413,7 @@ func (nDB *NetworkDB) DeleteEntry(tname, nid, key string) error {
410 410
 	}
411 411
 
412 412
 	nDB.Lock()
413
-	nDB.indexes[byTable].Insert(fmt.Sprintf("/%s/%s/%s", tname, nid, key), entry)
414
-	nDB.indexes[byNetwork].Insert(fmt.Sprintf("/%s/%s/%s", nid, tname, key), entry)
413
+	nDB.createOrUpdateEntry(nid, tname, key, entry)
415 414
 	nDB.Unlock()
416 415
 
417 416
 	return nil
... ...
@@ -473,10 +475,10 @@ func (nDB *NetworkDB) deleteNodeNetworkEntries(nid, node string) {
473 473
 
474 474
 			entry := &entry{
475 475
 				ltime:    oldEntry.ltime,
476
-				node:     node,
476
+				node:     oldEntry.node,
477 477
 				value:    oldEntry.value,
478 478
 				deleting: true,
479
-				reapTime: reapInterval,
479
+				reapTime: reapEntryInterval,
480 480
 			}
481 481
 
482 482
 			// we arrived at this point in 2 cases:
... ...
@@ -488,12 +490,10 @@ func (nDB *NetworkDB) deleteNodeNetworkEntries(nid, node string) {
488 488
 					// without doing a delete of all the objects
489 489
 					entry.ltime++
490 490
 				}
491
-				nDB.indexes[byTable].Insert(fmt.Sprintf("/%s/%s/%s", tname, nid, key), entry)
492
-				nDB.indexes[byNetwork].Insert(fmt.Sprintf("/%s/%s/%s", nid, tname, key), entry)
491
+				nDB.createOrUpdateEntry(nid, tname, key, entry)
493 492
 			} else {
494 493
 				// the local node is leaving the network, all the entries of remote nodes can be safely removed
495
-				nDB.indexes[byTable].Delete(fmt.Sprintf("/%s/%s/%s", tname, nid, key))
496
-				nDB.indexes[byNetwork].Delete(fmt.Sprintf("/%s/%s/%s", nid, tname, key))
494
+				nDB.deleteEntry(nid, tname, key)
497 495
 			}
498 496
 
499 497
 			nDB.broadcaster.Write(makeEvent(opDelete, tname, nid, key, entry.value))
... ...
@@ -513,8 +513,7 @@ func (nDB *NetworkDB) deleteNodeTableEntries(node string) {
513 513
 		nid := params[1]
514 514
 		key := params[2]
515 515
 
516
-		nDB.indexes[byTable].Delete(fmt.Sprintf("/%s/%s/%s", tname, nid, key))
517
-		nDB.indexes[byNetwork].Delete(fmt.Sprintf("/%s/%s/%s", nid, tname, key))
516
+		nDB.deleteEntry(nid, tname, key)
518 517
 
519 518
 		nDB.broadcaster.Write(makeEvent(opDelete, tname, nid, key, oldEntry.value))
520 519
 		return false
... ...
@@ -558,7 +557,12 @@ func (nDB *NetworkDB) JoinNetwork(nid string) error {
558 558
 		nodeNetworks = make(map[string]*network)
559 559
 		nDB.networks[nDB.config.NodeName] = nodeNetworks
560 560
 	}
561
-	nodeNetworks[nid] = &network{id: nid, ltime: ltime}
561
+	n, ok := nodeNetworks[nid]
562
+	var entries int
563
+	if ok {
564
+		entries = n.entriesNumber
565
+	}
566
+	nodeNetworks[nid] = &network{id: nid, ltime: ltime, entriesNumber: entries}
562 567
 	nodeNetworks[nid].tableBroadcasts = &memberlist.TransmitLimitedQueue{
563 568
 		NumNodes: func() int {
564 569
 			nDB.RLock()
... ...
@@ -567,6 +571,7 @@ func (nDB *NetworkDB) JoinNetwork(nid string) error {
567 567
 		},
568 568
 		RetransmitMult: 4,
569 569
 	}
570
+
570 571
 	nDB.addNetworkNode(nid, nDB.config.NodeName)
571 572
 	networkNodes := nDB.networkNodes[nid]
572 573
 	nDB.Unlock()
... ...
@@ -614,8 +619,9 @@ func (nDB *NetworkDB) LeaveNetwork(nid string) error {
614 614
 		return fmt.Errorf("could not find network %s while trying to leave", nid)
615 615
 	}
616 616
 
617
+	logrus.Debugf("%s: leaving network %s", nDB.config.NodeName, nid)
617 618
 	n.ltime = ltime
618
-	n.reapTime = reapInterval
619
+	n.reapTime = reapNetworkInterval
619 620
 	n.leaving = true
620 621
 	return nil
621 622
 }
... ...
@@ -679,3 +685,33 @@ func (nDB *NetworkDB) updateLocalNetworkTime() {
679 679
 		n.ltime = ltime
680 680
 	}
681 681
 }
682
+
683
+// createOrUpdateEntry this function handles the creation or update of entries into the local
684
+// tree store. It is also used to keep in sync the entries number of the network (all tables are aggregated)
685
+func (nDB *NetworkDB) createOrUpdateEntry(nid, tname, key string, entry interface{}) (bool, bool) {
686
+	_, okTable := nDB.indexes[byTable].Insert(fmt.Sprintf("/%s/%s/%s", tname, nid, key), entry)
687
+	_, okNetwork := nDB.indexes[byNetwork].Insert(fmt.Sprintf("/%s/%s/%s", nid, tname, key), entry)
688
+	if !okNetwork {
689
+		// Add only if it is an insert not an update
690
+		n, ok := nDB.networks[nDB.config.NodeName][nid]
691
+		if ok {
692
+			n.entriesNumber++
693
+		}
694
+	}
695
+	return okTable, okNetwork
696
+}
697
+
698
+// deleteEntry this function handles the deletion of entries into the local tree store.
699
+// It is also used to keep in sync the entries number of the network (all tables are aggregated)
700
+func (nDB *NetworkDB) deleteEntry(nid, tname, key string) (bool, bool) {
701
+	_, okTable := nDB.indexes[byTable].Delete(fmt.Sprintf("/%s/%s/%s", tname, nid, key))
702
+	_, okNetwork := nDB.indexes[byNetwork].Delete(fmt.Sprintf("/%s/%s/%s", nid, tname, key))
703
+	if okNetwork {
704
+		// Remove only if the delete is successful
705
+		n, ok := nDB.networks[nDB.config.NodeName][nid]
706
+		if ok {
707
+			n.entriesNumber--
708
+		}
709
+	}
710
+	return okTable, okNetwork
711
+}
... ...
@@ -1,6 +1,5 @@
1
-// Code generated by protoc-gen-gogo.
1
+// Code generated by protoc-gen-gogo. DO NOT EDIT.
2 2
 // source: networkdb.proto
3
-// DO NOT EDIT!
4 3
 
5 4
 /*
6 5
 	Package networkdb is a generated protocol buffer package.
... ...
@@ -28,9 +27,6 @@ import _ "github.com/gogo/protobuf/gogoproto"
28 28
 import github_com_hashicorp_serf_serf "github.com/hashicorp/serf/serf"
29 29
 
30 30
 import strings "strings"
31
-import github_com_gogo_protobuf_proto "github.com/gogo/protobuf/proto"
32
-import sort "sort"
33
-import strconv "strconv"
34 31
 import reflect "reflect"
35 32
 
36 33
 import io "io"
... ...
@@ -42,7 +38,9 @@ var _ = math.Inf
42 42
 
43 43
 // This is a compile-time assertion to ensure that this generated file
44 44
 // is compatible with the proto package it is being compiled against.
45
-const _ = proto.GoGoProtoPackageIsVersion1
45
+// A compilation error at this line likely means your copy of the
46
+// proto package needs to be updated.
47
+const _ = proto.GoGoProtoPackageIsVersion2 // please upgrade the proto package
46 48
 
47 49
 // MessageType enum defines all the core message types that networkdb
48 50
 // uses to communicate to peers.
... ...
@@ -192,6 +190,20 @@ func (m *GossipMessage) Reset()                    { *m = GossipMessage{} }
192 192
 func (*GossipMessage) ProtoMessage()               {}
193 193
 func (*GossipMessage) Descriptor() ([]byte, []int) { return fileDescriptorNetworkdb, []int{0} }
194 194
 
195
+func (m *GossipMessage) GetType() MessageType {
196
+	if m != nil {
197
+		return m.Type
198
+	}
199
+	return MessageTypeInvalid
200
+}
201
+
202
+func (m *GossipMessage) GetData() []byte {
203
+	if m != nil {
204
+		return m.Data
205
+	}
206
+	return nil
207
+}
208
+
195 209
 // NodeEvent message payload definition.
196 210
 type NodeEvent struct {
197 211
 	Type NodeEvent_Type `protobuf:"varint,1,opt,name=type,proto3,enum=networkdb.NodeEvent_Type" json:"type,omitempty"`
... ...
@@ -207,6 +219,20 @@ func (m *NodeEvent) Reset()                    { *m = NodeEvent{} }
207 207
 func (*NodeEvent) ProtoMessage()               {}
208 208
 func (*NodeEvent) Descriptor() ([]byte, []int) { return fileDescriptorNetworkdb, []int{1} }
209 209
 
210
+func (m *NodeEvent) GetType() NodeEvent_Type {
211
+	if m != nil {
212
+		return m.Type
213
+	}
214
+	return NodeEventTypeInvalid
215
+}
216
+
217
+func (m *NodeEvent) GetNodeName() string {
218
+	if m != nil {
219
+		return m.NodeName
220
+	}
221
+	return ""
222
+}
223
+
210 224
 // NetworkEvent message payload definition.
211 225
 type NetworkEvent struct {
212 226
 	Type NetworkEvent_Type `protobuf:"varint,1,opt,name=type,proto3,enum=networkdb.NetworkEvent_Type" json:"type,omitempty"`
... ...
@@ -224,6 +250,27 @@ func (m *NetworkEvent) Reset()                    { *m = NetworkEvent{} }
224 224
 func (*NetworkEvent) ProtoMessage()               {}
225 225
 func (*NetworkEvent) Descriptor() ([]byte, []int) { return fileDescriptorNetworkdb, []int{2} }
226 226
 
227
+func (m *NetworkEvent) GetType() NetworkEvent_Type {
228
+	if m != nil {
229
+		return m.Type
230
+	}
231
+	return NetworkEventTypeInvalid
232
+}
233
+
234
+func (m *NetworkEvent) GetNodeName() string {
235
+	if m != nil {
236
+		return m.NodeName
237
+	}
238
+	return ""
239
+}
240
+
241
+func (m *NetworkEvent) GetNetworkID() string {
242
+	if m != nil {
243
+		return m.NetworkID
244
+	}
245
+	return ""
246
+}
247
+
227 248
 // NetworkEntry for push pull of networks.
228 249
 type NetworkEntry struct {
229 250
 	// ID of the network
... ...
@@ -241,6 +288,27 @@ func (m *NetworkEntry) Reset()                    { *m = NetworkEntry{} }
241 241
 func (*NetworkEntry) ProtoMessage()               {}
242 242
 func (*NetworkEntry) Descriptor() ([]byte, []int) { return fileDescriptorNetworkdb, []int{3} }
243 243
 
244
+func (m *NetworkEntry) GetNetworkID() string {
245
+	if m != nil {
246
+		return m.NetworkID
247
+	}
248
+	return ""
249
+}
250
+
251
+func (m *NetworkEntry) GetNodeName() string {
252
+	if m != nil {
253
+		return m.NodeName
254
+	}
255
+	return ""
256
+}
257
+
258
+func (m *NetworkEntry) GetLeaving() bool {
259
+	if m != nil {
260
+		return m.Leaving
261
+	}
262
+	return false
263
+}
264
+
244 265
 // NetworkPushpull message payload definition.
245 266
 type NetworkPushPull struct {
246 267
 	// Lamport time when this push pull was initiated.
... ...
@@ -261,6 +329,13 @@ func (m *NetworkPushPull) GetNetworks() []*NetworkEntry {
261 261
 	return nil
262 262
 }
263 263
 
264
+func (m *NetworkPushPull) GetNodeName() string {
265
+	if m != nil {
266
+		return m.NodeName
267
+	}
268
+	return ""
269
+}
270
+
264 271
 // TableEvent message payload definition.
265 272
 type TableEvent struct {
266 273
 	Type TableEvent_Type `protobuf:"varint,1,opt,name=type,proto3,enum=networkdb.TableEvent_Type" json:"type,omitempty"`
... ...
@@ -276,12 +351,63 @@ type TableEvent struct {
276 276
 	Key string `protobuf:"bytes,6,opt,name=key,proto3" json:"key,omitempty"`
277 277
 	// Entry value.
278 278
 	Value []byte `protobuf:"bytes,7,opt,name=value,proto3" json:"value,omitempty"`
279
+	// Residual reap time for the entry before getting deleted in seconds
280
+	ResidualReapTime int32 `protobuf:"varint,8,opt,name=residual_reap_time,json=residualReapTime,proto3" json:"residual_reap_time,omitempty"`
279 281
 }
280 282
 
281 283
 func (m *TableEvent) Reset()                    { *m = TableEvent{} }
282 284
 func (*TableEvent) ProtoMessage()               {}
283 285
 func (*TableEvent) Descriptor() ([]byte, []int) { return fileDescriptorNetworkdb, []int{5} }
284 286
 
287
+func (m *TableEvent) GetType() TableEvent_Type {
288
+	if m != nil {
289
+		return m.Type
290
+	}
291
+	return TableEventTypeInvalid
292
+}
293
+
294
+func (m *TableEvent) GetNodeName() string {
295
+	if m != nil {
296
+		return m.NodeName
297
+	}
298
+	return ""
299
+}
300
+
301
+func (m *TableEvent) GetNetworkID() string {
302
+	if m != nil {
303
+		return m.NetworkID
304
+	}
305
+	return ""
306
+}
307
+
308
+func (m *TableEvent) GetTableName() string {
309
+	if m != nil {
310
+		return m.TableName
311
+	}
312
+	return ""
313
+}
314
+
315
+func (m *TableEvent) GetKey() string {
316
+	if m != nil {
317
+		return m.Key
318
+	}
319
+	return ""
320
+}
321
+
322
+func (m *TableEvent) GetValue() []byte {
323
+	if m != nil {
324
+		return m.Value
325
+	}
326
+	return nil
327
+}
328
+
329
+func (m *TableEvent) GetResidualReapTime() int32 {
330
+	if m != nil {
331
+		return m.ResidualReapTime
332
+	}
333
+	return 0
334
+}
335
+
285 336
 // BulkSync message payload definition.
286 337
 type BulkSyncMessage struct {
287 338
 	// Lamport time when this bulk sync was initiated.
... ...
@@ -302,6 +428,34 @@ func (m *BulkSyncMessage) Reset()                    { *m = BulkSyncMessage{} }
302 302
 func (*BulkSyncMessage) ProtoMessage()               {}
303 303
 func (*BulkSyncMessage) Descriptor() ([]byte, []int) { return fileDescriptorNetworkdb, []int{6} }
304 304
 
305
+func (m *BulkSyncMessage) GetUnsolicited() bool {
306
+	if m != nil {
307
+		return m.Unsolicited
308
+	}
309
+	return false
310
+}
311
+
312
+func (m *BulkSyncMessage) GetNodeName() string {
313
+	if m != nil {
314
+		return m.NodeName
315
+	}
316
+	return ""
317
+}
318
+
319
+func (m *BulkSyncMessage) GetNetworks() []string {
320
+	if m != nil {
321
+		return m.Networks
322
+	}
323
+	return nil
324
+}
325
+
326
+func (m *BulkSyncMessage) GetPayload() []byte {
327
+	if m != nil {
328
+		return m.Payload
329
+	}
330
+	return nil
331
+}
332
+
305 333
 // Compound message payload definition.
306 334
 type CompoundMessage struct {
307 335
 	// A list of simple messages.
... ...
@@ -322,7 +476,7 @@ func (m *CompoundMessage) GetMessages() []*CompoundMessage_SimpleMessage {
322 322
 type CompoundMessage_SimpleMessage struct {
323 323
 	// Bytestring payload of a message constructed using
324 324
 	// other message type definitions.
325
-	Payload []byte `protobuf:"bytes,1,opt,name=Payload,json=payload,proto3" json:"Payload,omitempty"`
325
+	Payload []byte `protobuf:"bytes,1,opt,name=Payload,proto3" json:"Payload,omitempty"`
326 326
 }
327 327
 
328 328
 func (m *CompoundMessage_SimpleMessage) Reset()      { *m = CompoundMessage_SimpleMessage{} }
... ...
@@ -331,6 +485,13 @@ func (*CompoundMessage_SimpleMessage) Descriptor() ([]byte, []int) {
331 331
 	return fileDescriptorNetworkdb, []int{7, 0}
332 332
 }
333 333
 
334
+func (m *CompoundMessage_SimpleMessage) GetPayload() []byte {
335
+	if m != nil {
336
+		return m.Payload
337
+	}
338
+	return nil
339
+}
340
+
334 341
 func init() {
335 342
 	proto.RegisterType((*GossipMessage)(nil), "networkdb.GossipMessage")
336 343
 	proto.RegisterType((*NodeEvent)(nil), "networkdb.NodeEvent")
... ...
@@ -413,7 +574,7 @@ func (this *TableEvent) GoString() string {
413 413
 	if this == nil {
414 414
 		return "nil"
415 415
 	}
416
-	s := make([]string, 0, 11)
416
+	s := make([]string, 0, 12)
417 417
 	s = append(s, "&networkdb.TableEvent{")
418 418
 	s = append(s, "Type: "+fmt.Sprintf("%#v", this.Type)+",\n")
419 419
 	s = append(s, "LTime: "+fmt.Sprintf("%#v", this.LTime)+",\n")
... ...
@@ -422,6 +583,7 @@ func (this *TableEvent) GoString() string {
422 422
 	s = append(s, "TableName: "+fmt.Sprintf("%#v", this.TableName)+",\n")
423 423
 	s = append(s, "Key: "+fmt.Sprintf("%#v", this.Key)+",\n")
424 424
 	s = append(s, "Value: "+fmt.Sprintf("%#v", this.Value)+",\n")
425
+	s = append(s, "ResidualReapTime: "+fmt.Sprintf("%#v", this.ResidualReapTime)+",\n")
425 426
 	s = append(s, "}")
426 427
 	return strings.Join(s, "")
427 428
 }
... ...
@@ -469,197 +631,180 @@ func valueToGoStringNetworkdb(v interface{}, typ string) string {
469 469
 	pv := reflect.Indirect(rv).Interface()
470 470
 	return fmt.Sprintf("func(v %v) *%v { return &v } ( %#v )", typ, typ, pv)
471 471
 }
472
-func extensionToGoStringNetworkdb(e map[int32]github_com_gogo_protobuf_proto.Extension) string {
473
-	if e == nil {
474
-		return "nil"
475
-	}
476
-	s := "map[int32]proto.Extension{"
477
-	keys := make([]int, 0, len(e))
478
-	for k := range e {
479
-		keys = append(keys, int(k))
480
-	}
481
-	sort.Ints(keys)
482
-	ss := []string{}
483
-	for _, k := range keys {
484
-		ss = append(ss, strconv.Itoa(k)+": "+e[int32(k)].GoString())
485
-	}
486
-	s += strings.Join(ss, ",") + "}"
487
-	return s
488
-}
489
-func (m *GossipMessage) Marshal() (data []byte, err error) {
472
+func (m *GossipMessage) Marshal() (dAtA []byte, err error) {
490 473
 	size := m.Size()
491
-	data = make([]byte, size)
492
-	n, err := m.MarshalTo(data)
474
+	dAtA = make([]byte, size)
475
+	n, err := m.MarshalTo(dAtA)
493 476
 	if err != nil {
494 477
 		return nil, err
495 478
 	}
496
-	return data[:n], nil
479
+	return dAtA[:n], nil
497 480
 }
498 481
 
499
-func (m *GossipMessage) MarshalTo(data []byte) (int, error) {
482
+func (m *GossipMessage) MarshalTo(dAtA []byte) (int, error) {
500 483
 	var i int
501 484
 	_ = i
502 485
 	var l int
503 486
 	_ = l
504 487
 	if m.Type != 0 {
505
-		data[i] = 0x8
488
+		dAtA[i] = 0x8
506 489
 		i++
507
-		i = encodeVarintNetworkdb(data, i, uint64(m.Type))
490
+		i = encodeVarintNetworkdb(dAtA, i, uint64(m.Type))
508 491
 	}
509 492
 	if len(m.Data) > 0 {
510
-		data[i] = 0x12
493
+		dAtA[i] = 0x12
511 494
 		i++
512
-		i = encodeVarintNetworkdb(data, i, uint64(len(m.Data)))
513
-		i += copy(data[i:], m.Data)
495
+		i = encodeVarintNetworkdb(dAtA, i, uint64(len(m.Data)))
496
+		i += copy(dAtA[i:], m.Data)
514 497
 	}
515 498
 	return i, nil
516 499
 }
517 500
 
518
-func (m *NodeEvent) Marshal() (data []byte, err error) {
501
+func (m *NodeEvent) Marshal() (dAtA []byte, err error) {
519 502
 	size := m.Size()
520
-	data = make([]byte, size)
521
-	n, err := m.MarshalTo(data)
503
+	dAtA = make([]byte, size)
504
+	n, err := m.MarshalTo(dAtA)
522 505
 	if err != nil {
523 506
 		return nil, err
524 507
 	}
525
-	return data[:n], nil
508
+	return dAtA[:n], nil
526 509
 }
527 510
 
528
-func (m *NodeEvent) MarshalTo(data []byte) (int, error) {
511
+func (m *NodeEvent) MarshalTo(dAtA []byte) (int, error) {
529 512
 	var i int
530 513
 	_ = i
531 514
 	var l int
532 515
 	_ = l
533 516
 	if m.Type != 0 {
534
-		data[i] = 0x8
517
+		dAtA[i] = 0x8
535 518
 		i++
536
-		i = encodeVarintNetworkdb(data, i, uint64(m.Type))
519
+		i = encodeVarintNetworkdb(dAtA, i, uint64(m.Type))
537 520
 	}
538 521
 	if m.LTime != 0 {
539
-		data[i] = 0x10
522
+		dAtA[i] = 0x10
540 523
 		i++
541
-		i = encodeVarintNetworkdb(data, i, uint64(m.LTime))
524
+		i = encodeVarintNetworkdb(dAtA, i, uint64(m.LTime))
542 525
 	}
543 526
 	if len(m.NodeName) > 0 {
544
-		data[i] = 0x1a
527
+		dAtA[i] = 0x1a
545 528
 		i++
546
-		i = encodeVarintNetworkdb(data, i, uint64(len(m.NodeName)))
547
-		i += copy(data[i:], m.NodeName)
529
+		i = encodeVarintNetworkdb(dAtA, i, uint64(len(m.NodeName)))
530
+		i += copy(dAtA[i:], m.NodeName)
548 531
 	}
549 532
 	return i, nil
550 533
 }
551 534
 
552
-func (m *NetworkEvent) Marshal() (data []byte, err error) {
535
+func (m *NetworkEvent) Marshal() (dAtA []byte, err error) {
553 536
 	size := m.Size()
554
-	data = make([]byte, size)
555
-	n, err := m.MarshalTo(data)
537
+	dAtA = make([]byte, size)
538
+	n, err := m.MarshalTo(dAtA)
556 539
 	if err != nil {
557 540
 		return nil, err
558 541
 	}
559
-	return data[:n], nil
542
+	return dAtA[:n], nil
560 543
 }
561 544
 
562
-func (m *NetworkEvent) MarshalTo(data []byte) (int, error) {
545
+func (m *NetworkEvent) MarshalTo(dAtA []byte) (int, error) {
563 546
 	var i int
564 547
 	_ = i
565 548
 	var l int
566 549
 	_ = l
567 550
 	if m.Type != 0 {
568
-		data[i] = 0x8
551
+		dAtA[i] = 0x8
569 552
 		i++
570
-		i = encodeVarintNetworkdb(data, i, uint64(m.Type))
553
+		i = encodeVarintNetworkdb(dAtA, i, uint64(m.Type))
571 554
 	}
572 555
 	if m.LTime != 0 {
573
-		data[i] = 0x10
556
+		dAtA[i] = 0x10
574 557
 		i++
575
-		i = encodeVarintNetworkdb(data, i, uint64(m.LTime))
558
+		i = encodeVarintNetworkdb(dAtA, i, uint64(m.LTime))
576 559
 	}
577 560
 	if len(m.NodeName) > 0 {
578
-		data[i] = 0x1a
561
+		dAtA[i] = 0x1a
579 562
 		i++
580
-		i = encodeVarintNetworkdb(data, i, uint64(len(m.NodeName)))
581
-		i += copy(data[i:], m.NodeName)
563
+		i = encodeVarintNetworkdb(dAtA, i, uint64(len(m.NodeName)))
564
+		i += copy(dAtA[i:], m.NodeName)
582 565
 	}
583 566
 	if len(m.NetworkID) > 0 {
584
-		data[i] = 0x22
567
+		dAtA[i] = 0x22
585 568
 		i++
586
-		i = encodeVarintNetworkdb(data, i, uint64(len(m.NetworkID)))
587
-		i += copy(data[i:], m.NetworkID)
569
+		i = encodeVarintNetworkdb(dAtA, i, uint64(len(m.NetworkID)))
570
+		i += copy(dAtA[i:], m.NetworkID)
588 571
 	}
589 572
 	return i, nil
590 573
 }
591 574
 
592
-func (m *NetworkEntry) Marshal() (data []byte, err error) {
575
+func (m *NetworkEntry) Marshal() (dAtA []byte, err error) {
593 576
 	size := m.Size()
594
-	data = make([]byte, size)
595
-	n, err := m.MarshalTo(data)
577
+	dAtA = make([]byte, size)
578
+	n, err := m.MarshalTo(dAtA)
596 579
 	if err != nil {
597 580
 		return nil, err
598 581
 	}
599
-	return data[:n], nil
582
+	return dAtA[:n], nil
600 583
 }
601 584
 
602
-func (m *NetworkEntry) MarshalTo(data []byte) (int, error) {
585
+func (m *NetworkEntry) MarshalTo(dAtA []byte) (int, error) {
603 586
 	var i int
604 587
 	_ = i
605 588
 	var l int
606 589
 	_ = l
607 590
 	if len(m.NetworkID) > 0 {
608
-		data[i] = 0xa
591
+		dAtA[i] = 0xa
609 592
 		i++
610
-		i = encodeVarintNetworkdb(data, i, uint64(len(m.NetworkID)))
611
-		i += copy(data[i:], m.NetworkID)
593
+		i = encodeVarintNetworkdb(dAtA, i, uint64(len(m.NetworkID)))
594
+		i += copy(dAtA[i:], m.NetworkID)
612 595
 	}
613 596
 	if m.LTime != 0 {
614
-		data[i] = 0x10
597
+		dAtA[i] = 0x10
615 598
 		i++
616
-		i = encodeVarintNetworkdb(data, i, uint64(m.LTime))
599
+		i = encodeVarintNetworkdb(dAtA, i, uint64(m.LTime))
617 600
 	}
618 601
 	if len(m.NodeName) > 0 {
619
-		data[i] = 0x1a
602
+		dAtA[i] = 0x1a
620 603
 		i++
621
-		i = encodeVarintNetworkdb(data, i, uint64(len(m.NodeName)))
622
-		i += copy(data[i:], m.NodeName)
604
+		i = encodeVarintNetworkdb(dAtA, i, uint64(len(m.NodeName)))
605
+		i += copy(dAtA[i:], m.NodeName)
623 606
 	}
624 607
 	if m.Leaving {
625
-		data[i] = 0x20
608
+		dAtA[i] = 0x20
626 609
 		i++
627 610
 		if m.Leaving {
628
-			data[i] = 1
611
+			dAtA[i] = 1
629 612
 		} else {
630
-			data[i] = 0
613
+			dAtA[i] = 0
631 614
 		}
632 615
 		i++
633 616
 	}
634 617
 	return i, nil
635 618
 }
636 619
 
637
-func (m *NetworkPushPull) Marshal() (data []byte, err error) {
620
+func (m *NetworkPushPull) Marshal() (dAtA []byte, err error) {
638 621
 	size := m.Size()
639
-	data = make([]byte, size)
640
-	n, err := m.MarshalTo(data)
622
+	dAtA = make([]byte, size)
623
+	n, err := m.MarshalTo(dAtA)
641 624
 	if err != nil {
642 625
 		return nil, err
643 626
 	}
644
-	return data[:n], nil
627
+	return dAtA[:n], nil
645 628
 }
646 629
 
647
-func (m *NetworkPushPull) MarshalTo(data []byte) (int, error) {
630
+func (m *NetworkPushPull) MarshalTo(dAtA []byte) (int, error) {
648 631
 	var i int
649 632
 	_ = i
650 633
 	var l int
651 634
 	_ = l
652 635
 	if m.LTime != 0 {
653
-		data[i] = 0x8
636
+		dAtA[i] = 0x8
654 637
 		i++
655
-		i = encodeVarintNetworkdb(data, i, uint64(m.LTime))
638
+		i = encodeVarintNetworkdb(dAtA, i, uint64(m.LTime))
656 639
 	}
657 640
 	if len(m.Networks) > 0 {
658 641
 		for _, msg := range m.Networks {
659
-			data[i] = 0x12
642
+			dAtA[i] = 0x12
660 643
 			i++
661
-			i = encodeVarintNetworkdb(data, i, uint64(msg.Size()))
662
-			n, err := msg.MarshalTo(data[i:])
644
+			i = encodeVarintNetworkdb(dAtA, i, uint64(msg.Size()))
645
+			n, err := msg.MarshalTo(dAtA[i:])
663 646
 			if err != nil {
664 647
 				return 0, err
665 648
 			}
... ...
@@ -667,153 +812,158 @@ func (m *NetworkPushPull) MarshalTo(data []byte) (int, error) {
667 667
 		}
668 668
 	}
669 669
 	if len(m.NodeName) > 0 {
670
-		data[i] = 0x1a
670
+		dAtA[i] = 0x1a
671 671
 		i++
672
-		i = encodeVarintNetworkdb(data, i, uint64(len(m.NodeName)))
673
-		i += copy(data[i:], m.NodeName)
672
+		i = encodeVarintNetworkdb(dAtA, i, uint64(len(m.NodeName)))
673
+		i += copy(dAtA[i:], m.NodeName)
674 674
 	}
675 675
 	return i, nil
676 676
 }
677 677
 
678
-func (m *TableEvent) Marshal() (data []byte, err error) {
678
+func (m *TableEvent) Marshal() (dAtA []byte, err error) {
679 679
 	size := m.Size()
680
-	data = make([]byte, size)
681
-	n, err := m.MarshalTo(data)
680
+	dAtA = make([]byte, size)
681
+	n, err := m.MarshalTo(dAtA)
682 682
 	if err != nil {
683 683
 		return nil, err
684 684
 	}
685
-	return data[:n], nil
685
+	return dAtA[:n], nil
686 686
 }
687 687
 
688
-func (m *TableEvent) MarshalTo(data []byte) (int, error) {
688
+func (m *TableEvent) MarshalTo(dAtA []byte) (int, error) {
689 689
 	var i int
690 690
 	_ = i
691 691
 	var l int
692 692
 	_ = l
693 693
 	if m.Type != 0 {
694
-		data[i] = 0x8
694
+		dAtA[i] = 0x8
695 695
 		i++
696
-		i = encodeVarintNetworkdb(data, i, uint64(m.Type))
696
+		i = encodeVarintNetworkdb(dAtA, i, uint64(m.Type))
697 697
 	}
698 698
 	if m.LTime != 0 {
699
-		data[i] = 0x10
699
+		dAtA[i] = 0x10
700 700
 		i++
701
-		i = encodeVarintNetworkdb(data, i, uint64(m.LTime))
701
+		i = encodeVarintNetworkdb(dAtA, i, uint64(m.LTime))
702 702
 	}
703 703
 	if len(m.NodeName) > 0 {
704
-		data[i] = 0x1a
704
+		dAtA[i] = 0x1a
705 705
 		i++
706
-		i = encodeVarintNetworkdb(data, i, uint64(len(m.NodeName)))
707
-		i += copy(data[i:], m.NodeName)
706
+		i = encodeVarintNetworkdb(dAtA, i, uint64(len(m.NodeName)))
707
+		i += copy(dAtA[i:], m.NodeName)
708 708
 	}
709 709
 	if len(m.NetworkID) > 0 {
710
-		data[i] = 0x22
710
+		dAtA[i] = 0x22
711 711
 		i++
712
-		i = encodeVarintNetworkdb(data, i, uint64(len(m.NetworkID)))
713
-		i += copy(data[i:], m.NetworkID)
712
+		i = encodeVarintNetworkdb(dAtA, i, uint64(len(m.NetworkID)))
713
+		i += copy(dAtA[i:], m.NetworkID)
714 714
 	}
715 715
 	if len(m.TableName) > 0 {
716
-		data[i] = 0x2a
716
+		dAtA[i] = 0x2a
717 717
 		i++
718
-		i = encodeVarintNetworkdb(data, i, uint64(len(m.TableName)))
719
-		i += copy(data[i:], m.TableName)
718
+		i = encodeVarintNetworkdb(dAtA, i, uint64(len(m.TableName)))
719
+		i += copy(dAtA[i:], m.TableName)
720 720
 	}
721 721
 	if len(m.Key) > 0 {
722
-		data[i] = 0x32
722
+		dAtA[i] = 0x32
723 723
 		i++
724
-		i = encodeVarintNetworkdb(data, i, uint64(len(m.Key)))
725
-		i += copy(data[i:], m.Key)
724
+		i = encodeVarintNetworkdb(dAtA, i, uint64(len(m.Key)))
725
+		i += copy(dAtA[i:], m.Key)
726 726
 	}
727 727
 	if len(m.Value) > 0 {
728
-		data[i] = 0x3a
728
+		dAtA[i] = 0x3a
729 729
 		i++
730
-		i = encodeVarintNetworkdb(data, i, uint64(len(m.Value)))
731
-		i += copy(data[i:], m.Value)
730
+		i = encodeVarintNetworkdb(dAtA, i, uint64(len(m.Value)))
731
+		i += copy(dAtA[i:], m.Value)
732
+	}
733
+	if m.ResidualReapTime != 0 {
734
+		dAtA[i] = 0x40
735
+		i++
736
+		i = encodeVarintNetworkdb(dAtA, i, uint64(m.ResidualReapTime))
732 737
 	}
733 738
 	return i, nil
734 739
 }
735 740
 
736
-func (m *BulkSyncMessage) Marshal() (data []byte, err error) {
741
+func (m *BulkSyncMessage) Marshal() (dAtA []byte, err error) {
737 742
 	size := m.Size()
738
-	data = make([]byte, size)
739
-	n, err := m.MarshalTo(data)
743
+	dAtA = make([]byte, size)
744
+	n, err := m.MarshalTo(dAtA)
740 745
 	if err != nil {
741 746
 		return nil, err
742 747
 	}
743
-	return data[:n], nil
748
+	return dAtA[:n], nil
744 749
 }
745 750
 
746
-func (m *BulkSyncMessage) MarshalTo(data []byte) (int, error) {
751
+func (m *BulkSyncMessage) MarshalTo(dAtA []byte) (int, error) {
747 752
 	var i int
748 753
 	_ = i
749 754
 	var l int
750 755
 	_ = l
751 756
 	if m.LTime != 0 {
752
-		data[i] = 0x8
757
+		dAtA[i] = 0x8
753 758
 		i++
754
-		i = encodeVarintNetworkdb(data, i, uint64(m.LTime))
759
+		i = encodeVarintNetworkdb(dAtA, i, uint64(m.LTime))
755 760
 	}
756 761
 	if m.Unsolicited {
757
-		data[i] = 0x10
762
+		dAtA[i] = 0x10
758 763
 		i++
759 764
 		if m.Unsolicited {
760
-			data[i] = 1
765
+			dAtA[i] = 1
761 766
 		} else {
762
-			data[i] = 0
767
+			dAtA[i] = 0
763 768
 		}
764 769
 		i++
765 770
 	}
766 771
 	if len(m.NodeName) > 0 {
767
-		data[i] = 0x1a
772
+		dAtA[i] = 0x1a
768 773
 		i++
769
-		i = encodeVarintNetworkdb(data, i, uint64(len(m.NodeName)))
770
-		i += copy(data[i:], m.NodeName)
774
+		i = encodeVarintNetworkdb(dAtA, i, uint64(len(m.NodeName)))
775
+		i += copy(dAtA[i:], m.NodeName)
771 776
 	}
772 777
 	if len(m.Networks) > 0 {
773 778
 		for _, s := range m.Networks {
774
-			data[i] = 0x22
779
+			dAtA[i] = 0x22
775 780
 			i++
776 781
 			l = len(s)
777 782
 			for l >= 1<<7 {
778
-				data[i] = uint8(uint64(l)&0x7f | 0x80)
783
+				dAtA[i] = uint8(uint64(l)&0x7f | 0x80)
779 784
 				l >>= 7
780 785
 				i++
781 786
 			}
782
-			data[i] = uint8(l)
787
+			dAtA[i] = uint8(l)
783 788
 			i++
784
-			i += copy(data[i:], s)
789
+			i += copy(dAtA[i:], s)
785 790
 		}
786 791
 	}
787 792
 	if len(m.Payload) > 0 {
788
-		data[i] = 0x2a
793
+		dAtA[i] = 0x2a
789 794
 		i++
790
-		i = encodeVarintNetworkdb(data, i, uint64(len(m.Payload)))
791
-		i += copy(data[i:], m.Payload)
795
+		i = encodeVarintNetworkdb(dAtA, i, uint64(len(m.Payload)))
796
+		i += copy(dAtA[i:], m.Payload)
792 797
 	}
793 798
 	return i, nil
794 799
 }
795 800
 
796
-func (m *CompoundMessage) Marshal() (data []byte, err error) {
801
+func (m *CompoundMessage) Marshal() (dAtA []byte, err error) {
797 802
 	size := m.Size()
798
-	data = make([]byte, size)
799
-	n, err := m.MarshalTo(data)
803
+	dAtA = make([]byte, size)
804
+	n, err := m.MarshalTo(dAtA)
800 805
 	if err != nil {
801 806
 		return nil, err
802 807
 	}
803
-	return data[:n], nil
808
+	return dAtA[:n], nil
804 809
 }
805 810
 
806
-func (m *CompoundMessage) MarshalTo(data []byte) (int, error) {
811
+func (m *CompoundMessage) MarshalTo(dAtA []byte) (int, error) {
807 812
 	var i int
808 813
 	_ = i
809 814
 	var l int
810 815
 	_ = l
811 816
 	if len(m.Messages) > 0 {
812 817
 		for _, msg := range m.Messages {
813
-			data[i] = 0xa
818
+			dAtA[i] = 0xa
814 819
 			i++
815
-			i = encodeVarintNetworkdb(data, i, uint64(msg.Size()))
816
-			n, err := msg.MarshalTo(data[i:])
820
+			i = encodeVarintNetworkdb(dAtA, i, uint64(msg.Size()))
821
+			n, err := msg.MarshalTo(dAtA[i:])
817 822
 			if err != nil {
818 823
 				return 0, err
819 824
 			}
... ...
@@ -823,55 +973,55 @@ func (m *CompoundMessage) MarshalTo(data []byte) (int, error) {
823 823
 	return i, nil
824 824
 }
825 825
 
826
-func (m *CompoundMessage_SimpleMessage) Marshal() (data []byte, err error) {
826
+func (m *CompoundMessage_SimpleMessage) Marshal() (dAtA []byte, err error) {
827 827
 	size := m.Size()
828
-	data = make([]byte, size)
829
-	n, err := m.MarshalTo(data)
828
+	dAtA = make([]byte, size)
829
+	n, err := m.MarshalTo(dAtA)
830 830
 	if err != nil {
831 831
 		return nil, err
832 832
 	}
833
-	return data[:n], nil
833
+	return dAtA[:n], nil
834 834
 }
835 835
 
836
-func (m *CompoundMessage_SimpleMessage) MarshalTo(data []byte) (int, error) {
836
+func (m *CompoundMessage_SimpleMessage) MarshalTo(dAtA []byte) (int, error) {
837 837
 	var i int
838 838
 	_ = i
839 839
 	var l int
840 840
 	_ = l
841 841
 	if len(m.Payload) > 0 {
842
-		data[i] = 0xa
842
+		dAtA[i] = 0xa
843 843
 		i++
844
-		i = encodeVarintNetworkdb(data, i, uint64(len(m.Payload)))
845
-		i += copy(data[i:], m.Payload)
844
+		i = encodeVarintNetworkdb(dAtA, i, uint64(len(m.Payload)))
845
+		i += copy(dAtA[i:], m.Payload)
846 846
 	}
847 847
 	return i, nil
848 848
 }
849 849
 
850
-func encodeFixed64Networkdb(data []byte, offset int, v uint64) int {
851
-	data[offset] = uint8(v)
852
-	data[offset+1] = uint8(v >> 8)
853
-	data[offset+2] = uint8(v >> 16)
854
-	data[offset+3] = uint8(v >> 24)
855
-	data[offset+4] = uint8(v >> 32)
856
-	data[offset+5] = uint8(v >> 40)
857
-	data[offset+6] = uint8(v >> 48)
858
-	data[offset+7] = uint8(v >> 56)
850
+func encodeFixed64Networkdb(dAtA []byte, offset int, v uint64) int {
851
+	dAtA[offset] = uint8(v)
852
+	dAtA[offset+1] = uint8(v >> 8)
853
+	dAtA[offset+2] = uint8(v >> 16)
854
+	dAtA[offset+3] = uint8(v >> 24)
855
+	dAtA[offset+4] = uint8(v >> 32)
856
+	dAtA[offset+5] = uint8(v >> 40)
857
+	dAtA[offset+6] = uint8(v >> 48)
858
+	dAtA[offset+7] = uint8(v >> 56)
859 859
 	return offset + 8
860 860
 }
861
-func encodeFixed32Networkdb(data []byte, offset int, v uint32) int {
862
-	data[offset] = uint8(v)
863
-	data[offset+1] = uint8(v >> 8)
864
-	data[offset+2] = uint8(v >> 16)
865
-	data[offset+3] = uint8(v >> 24)
861
+func encodeFixed32Networkdb(dAtA []byte, offset int, v uint32) int {
862
+	dAtA[offset] = uint8(v)
863
+	dAtA[offset+1] = uint8(v >> 8)
864
+	dAtA[offset+2] = uint8(v >> 16)
865
+	dAtA[offset+3] = uint8(v >> 24)
866 866
 	return offset + 4
867 867
 }
868
-func encodeVarintNetworkdb(data []byte, offset int, v uint64) int {
868
+func encodeVarintNetworkdb(dAtA []byte, offset int, v uint64) int {
869 869
 	for v >= 1<<7 {
870
-		data[offset] = uint8(v&0x7f | 0x80)
870
+		dAtA[offset] = uint8(v&0x7f | 0x80)
871 871
 		v >>= 7
872 872
 		offset++
873 873
 	}
874
-	data[offset] = uint8(v)
874
+	dAtA[offset] = uint8(v)
875 875
 	return offset + 1
876 876
 }
877 877
 func (m *GossipMessage) Size() (n int) {
... ...
@@ -991,6 +1141,9 @@ func (m *TableEvent) Size() (n int) {
991 991
 	if l > 0 {
992 992
 		n += 1 + l + sovNetworkdb(uint64(l))
993 993
 	}
994
+	if m.ResidualReapTime != 0 {
995
+		n += 1 + sovNetworkdb(uint64(m.ResidualReapTime))
996
+	}
994 997
 	return n
995 998
 }
996 999
 
... ...
@@ -1128,6 +1281,7 @@ func (this *TableEvent) String() string {
1128 1128
 		`TableName:` + fmt.Sprintf("%v", this.TableName) + `,`,
1129 1129
 		`Key:` + fmt.Sprintf("%v", this.Key) + `,`,
1130 1130
 		`Value:` + fmt.Sprintf("%v", this.Value) + `,`,
1131
+		`ResidualReapTime:` + fmt.Sprintf("%v", this.ResidualReapTime) + `,`,
1131 1132
 		`}`,
1132 1133
 	}, "")
1133 1134
 	return s
... ...
@@ -1174,8 +1328,8 @@ func valueToStringNetworkdb(v interface{}) string {
1174 1174
 	pv := reflect.Indirect(rv).Interface()
1175 1175
 	return fmt.Sprintf("*%v", pv)
1176 1176
 }
1177
-func (m *GossipMessage) Unmarshal(data []byte) error {
1178
-	l := len(data)
1177
+func (m *GossipMessage) Unmarshal(dAtA []byte) error {
1178
+	l := len(dAtA)
1179 1179
 	iNdEx := 0
1180 1180
 	for iNdEx < l {
1181 1181
 		preIndex := iNdEx
... ...
@@ -1187,7 +1341,7 @@ func (m *GossipMessage) Unmarshal(data []byte) error {
1187 1187
 			if iNdEx >= l {
1188 1188
 				return io.ErrUnexpectedEOF
1189 1189
 			}
1190
-			b := data[iNdEx]
1190
+			b := dAtA[iNdEx]
1191 1191
 			iNdEx++
1192 1192
 			wire |= (uint64(b) & 0x7F) << shift
1193 1193
 			if b < 0x80 {
... ...
@@ -1215,7 +1369,7 @@ func (m *GossipMessage) Unmarshal(data []byte) error {
1215 1215
 				if iNdEx >= l {
1216 1216
 					return io.ErrUnexpectedEOF
1217 1217
 				}
1218
-				b := data[iNdEx]
1218
+				b := dAtA[iNdEx]
1219 1219
 				iNdEx++
1220 1220
 				m.Type |= (MessageType(b) & 0x7F) << shift
1221 1221
 				if b < 0x80 {
... ...
@@ -1234,7 +1388,7 @@ func (m *GossipMessage) Unmarshal(data []byte) error {
1234 1234
 				if iNdEx >= l {
1235 1235
 					return io.ErrUnexpectedEOF
1236 1236
 				}
1237
-				b := data[iNdEx]
1237
+				b := dAtA[iNdEx]
1238 1238
 				iNdEx++
1239 1239
 				byteLen |= (int(b) & 0x7F) << shift
1240 1240
 				if b < 0x80 {
... ...
@@ -1248,14 +1402,14 @@ func (m *GossipMessage) Unmarshal(data []byte) error {
1248 1248
 			if postIndex > l {
1249 1249
 				return io.ErrUnexpectedEOF
1250 1250
 			}
1251
-			m.Data = append(m.Data[:0], data[iNdEx:postIndex]...)
1251
+			m.Data = append(m.Data[:0], dAtA[iNdEx:postIndex]...)
1252 1252
 			if m.Data == nil {
1253 1253
 				m.Data = []byte{}
1254 1254
 			}
1255 1255
 			iNdEx = postIndex
1256 1256
 		default:
1257 1257
 			iNdEx = preIndex
1258
-			skippy, err := skipNetworkdb(data[iNdEx:])
1258
+			skippy, err := skipNetworkdb(dAtA[iNdEx:])
1259 1259
 			if err != nil {
1260 1260
 				return err
1261 1261
 			}
... ...
@@ -1274,8 +1428,8 @@ func (m *GossipMessage) Unmarshal(data []byte) error {
1274 1274
 	}
1275 1275
 	return nil
1276 1276
 }
1277
-func (m *NodeEvent) Unmarshal(data []byte) error {
1278
-	l := len(data)
1277
+func (m *NodeEvent) Unmarshal(dAtA []byte) error {
1278
+	l := len(dAtA)
1279 1279
 	iNdEx := 0
1280 1280
 	for iNdEx < l {
1281 1281
 		preIndex := iNdEx
... ...
@@ -1287,7 +1441,7 @@ func (m *NodeEvent) Unmarshal(data []byte) error {
1287 1287
 			if iNdEx >= l {
1288 1288
 				return io.ErrUnexpectedEOF
1289 1289
 			}
1290
-			b := data[iNdEx]
1290
+			b := dAtA[iNdEx]
1291 1291
 			iNdEx++
1292 1292
 			wire |= (uint64(b) & 0x7F) << shift
1293 1293
 			if b < 0x80 {
... ...
@@ -1315,7 +1469,7 @@ func (m *NodeEvent) Unmarshal(data []byte) error {
1315 1315
 				if iNdEx >= l {
1316 1316
 					return io.ErrUnexpectedEOF
1317 1317
 				}
1318
-				b := data[iNdEx]
1318
+				b := dAtA[iNdEx]
1319 1319
 				iNdEx++
1320 1320
 				m.Type |= (NodeEvent_Type(b) & 0x7F) << shift
1321 1321
 				if b < 0x80 {
... ...
@@ -1334,7 +1488,7 @@ func (m *NodeEvent) Unmarshal(data []byte) error {
1334 1334
 				if iNdEx >= l {
1335 1335
 					return io.ErrUnexpectedEOF
1336 1336
 				}
1337
-				b := data[iNdEx]
1337
+				b := dAtA[iNdEx]
1338 1338
 				iNdEx++
1339 1339
 				m.LTime |= (github_com_hashicorp_serf_serf.LamportTime(b) & 0x7F) << shift
1340 1340
 				if b < 0x80 {
... ...
@@ -1353,7 +1507,7 @@ func (m *NodeEvent) Unmarshal(data []byte) error {
1353 1353
 				if iNdEx >= l {
1354 1354
 					return io.ErrUnexpectedEOF
1355 1355
 				}
1356
-				b := data[iNdEx]
1356
+				b := dAtA[iNdEx]
1357 1357
 				iNdEx++
1358 1358
 				stringLen |= (uint64(b) & 0x7F) << shift
1359 1359
 				if b < 0x80 {
... ...
@@ -1368,11 +1522,11 @@ func (m *NodeEvent) Unmarshal(data []byte) error {
1368 1368
 			if postIndex > l {
1369 1369
 				return io.ErrUnexpectedEOF
1370 1370
 			}
1371
-			m.NodeName = string(data[iNdEx:postIndex])
1371
+			m.NodeName = string(dAtA[iNdEx:postIndex])
1372 1372
 			iNdEx = postIndex
1373 1373
 		default:
1374 1374
 			iNdEx = preIndex
1375
-			skippy, err := skipNetworkdb(data[iNdEx:])
1375
+			skippy, err := skipNetworkdb(dAtA[iNdEx:])
1376 1376
 			if err != nil {
1377 1377
 				return err
1378 1378
 			}
... ...
@@ -1391,8 +1545,8 @@ func (m *NodeEvent) Unmarshal(data []byte) error {
1391 1391
 	}
1392 1392
 	return nil
1393 1393
 }
1394
-func (m *NetworkEvent) Unmarshal(data []byte) error {
1395
-	l := len(data)
1394
+func (m *NetworkEvent) Unmarshal(dAtA []byte) error {
1395
+	l := len(dAtA)
1396 1396
 	iNdEx := 0
1397 1397
 	for iNdEx < l {
1398 1398
 		preIndex := iNdEx
... ...
@@ -1404,7 +1558,7 @@ func (m *NetworkEvent) Unmarshal(data []byte) error {
1404 1404
 			if iNdEx >= l {
1405 1405
 				return io.ErrUnexpectedEOF
1406 1406
 			}
1407
-			b := data[iNdEx]
1407
+			b := dAtA[iNdEx]
1408 1408
 			iNdEx++
1409 1409
 			wire |= (uint64(b) & 0x7F) << shift
1410 1410
 			if b < 0x80 {
... ...
@@ -1432,7 +1586,7 @@ func (m *NetworkEvent) Unmarshal(data []byte) error {
1432 1432
 				if iNdEx >= l {
1433 1433
 					return io.ErrUnexpectedEOF
1434 1434
 				}
1435
-				b := data[iNdEx]
1435
+				b := dAtA[iNdEx]
1436 1436
 				iNdEx++
1437 1437
 				m.Type |= (NetworkEvent_Type(b) & 0x7F) << shift
1438 1438
 				if b < 0x80 {
... ...
@@ -1451,7 +1605,7 @@ func (m *NetworkEvent) Unmarshal(data []byte) error {
1451 1451
 				if iNdEx >= l {
1452 1452
 					return io.ErrUnexpectedEOF
1453 1453
 				}
1454
-				b := data[iNdEx]
1454
+				b := dAtA[iNdEx]
1455 1455
 				iNdEx++
1456 1456
 				m.LTime |= (github_com_hashicorp_serf_serf.LamportTime(b) & 0x7F) << shift
1457 1457
 				if b < 0x80 {
... ...
@@ -1470,7 +1624,7 @@ func (m *NetworkEvent) Unmarshal(data []byte) error {
1470 1470
 				if iNdEx >= l {
1471 1471
 					return io.ErrUnexpectedEOF
1472 1472
 				}
1473
-				b := data[iNdEx]
1473
+				b := dAtA[iNdEx]
1474 1474
 				iNdEx++
1475 1475
 				stringLen |= (uint64(b) & 0x7F) << shift
1476 1476
 				if b < 0x80 {
... ...
@@ -1485,7 +1639,7 @@ func (m *NetworkEvent) Unmarshal(data []byte) error {
1485 1485
 			if postIndex > l {
1486 1486
 				return io.ErrUnexpectedEOF
1487 1487
 			}
1488
-			m.NodeName = string(data[iNdEx:postIndex])
1488
+			m.NodeName = string(dAtA[iNdEx:postIndex])
1489 1489
 			iNdEx = postIndex
1490 1490
 		case 4:
1491 1491
 			if wireType != 2 {
... ...
@@ -1499,7 +1653,7 @@ func (m *NetworkEvent) Unmarshal(data []byte) error {
1499 1499
 				if iNdEx >= l {
1500 1500
 					return io.ErrUnexpectedEOF
1501 1501
 				}
1502
-				b := data[iNdEx]
1502
+				b := dAtA[iNdEx]
1503 1503
 				iNdEx++
1504 1504
 				stringLen |= (uint64(b) & 0x7F) << shift
1505 1505
 				if b < 0x80 {
... ...
@@ -1514,11 +1668,11 @@ func (m *NetworkEvent) Unmarshal(data []byte) error {
1514 1514
 			if postIndex > l {
1515 1515
 				return io.ErrUnexpectedEOF
1516 1516
 			}
1517
-			m.NetworkID = string(data[iNdEx:postIndex])
1517
+			m.NetworkID = string(dAtA[iNdEx:postIndex])
1518 1518
 			iNdEx = postIndex
1519 1519
 		default:
1520 1520
 			iNdEx = preIndex
1521
-			skippy, err := skipNetworkdb(data[iNdEx:])
1521
+			skippy, err := skipNetworkdb(dAtA[iNdEx:])
1522 1522
 			if err != nil {
1523 1523
 				return err
1524 1524
 			}
... ...
@@ -1537,8 +1691,8 @@ func (m *NetworkEvent) Unmarshal(data []byte) error {
1537 1537
 	}
1538 1538
 	return nil
1539 1539
 }
1540
-func (m *NetworkEntry) Unmarshal(data []byte) error {
1541
-	l := len(data)
1540
+func (m *NetworkEntry) Unmarshal(dAtA []byte) error {
1541
+	l := len(dAtA)
1542 1542
 	iNdEx := 0
1543 1543
 	for iNdEx < l {
1544 1544
 		preIndex := iNdEx
... ...
@@ -1550,7 +1704,7 @@ func (m *NetworkEntry) Unmarshal(data []byte) error {
1550 1550
 			if iNdEx >= l {
1551 1551
 				return io.ErrUnexpectedEOF
1552 1552
 			}
1553
-			b := data[iNdEx]
1553
+			b := dAtA[iNdEx]
1554 1554
 			iNdEx++
1555 1555
 			wire |= (uint64(b) & 0x7F) << shift
1556 1556
 			if b < 0x80 {
... ...
@@ -1578,7 +1732,7 @@ func (m *NetworkEntry) Unmarshal(data []byte) error {
1578 1578
 				if iNdEx >= l {
1579 1579
 					return io.ErrUnexpectedEOF
1580 1580
 				}
1581
-				b := data[iNdEx]
1581
+				b := dAtA[iNdEx]
1582 1582
 				iNdEx++
1583 1583
 				stringLen |= (uint64(b) & 0x7F) << shift
1584 1584
 				if b < 0x80 {
... ...
@@ -1593,7 +1747,7 @@ func (m *NetworkEntry) Unmarshal(data []byte) error {
1593 1593
 			if postIndex > l {
1594 1594
 				return io.ErrUnexpectedEOF
1595 1595
 			}
1596
-			m.NetworkID = string(data[iNdEx:postIndex])
1596
+			m.NetworkID = string(dAtA[iNdEx:postIndex])
1597 1597
 			iNdEx = postIndex
1598 1598
 		case 2:
1599 1599
 			if wireType != 0 {
... ...
@@ -1607,7 +1761,7 @@ func (m *NetworkEntry) Unmarshal(data []byte) error {
1607 1607
 				if iNdEx >= l {
1608 1608
 					return io.ErrUnexpectedEOF
1609 1609
 				}
1610
-				b := data[iNdEx]
1610
+				b := dAtA[iNdEx]
1611 1611
 				iNdEx++
1612 1612
 				m.LTime |= (github_com_hashicorp_serf_serf.LamportTime(b) & 0x7F) << shift
1613 1613
 				if b < 0x80 {
... ...
@@ -1626,7 +1780,7 @@ func (m *NetworkEntry) Unmarshal(data []byte) error {
1626 1626
 				if iNdEx >= l {
1627 1627
 					return io.ErrUnexpectedEOF
1628 1628
 				}
1629
-				b := data[iNdEx]
1629
+				b := dAtA[iNdEx]
1630 1630
 				iNdEx++
1631 1631
 				stringLen |= (uint64(b) & 0x7F) << shift
1632 1632
 				if b < 0x80 {
... ...
@@ -1641,7 +1795,7 @@ func (m *NetworkEntry) Unmarshal(data []byte) error {
1641 1641
 			if postIndex > l {
1642 1642
 				return io.ErrUnexpectedEOF
1643 1643
 			}
1644
-			m.NodeName = string(data[iNdEx:postIndex])
1644
+			m.NodeName = string(dAtA[iNdEx:postIndex])
1645 1645
 			iNdEx = postIndex
1646 1646
 		case 4:
1647 1647
 			if wireType != 0 {
... ...
@@ -1655,7 +1809,7 @@ func (m *NetworkEntry) Unmarshal(data []byte) error {
1655 1655
 				if iNdEx >= l {
1656 1656
 					return io.ErrUnexpectedEOF
1657 1657
 				}
1658
-				b := data[iNdEx]
1658
+				b := dAtA[iNdEx]
1659 1659
 				iNdEx++
1660 1660
 				v |= (int(b) & 0x7F) << shift
1661 1661
 				if b < 0x80 {
... ...
@@ -1665,7 +1819,7 @@ func (m *NetworkEntry) Unmarshal(data []byte) error {
1665 1665
 			m.Leaving = bool(v != 0)
1666 1666
 		default:
1667 1667
 			iNdEx = preIndex
1668
-			skippy, err := skipNetworkdb(data[iNdEx:])
1668
+			skippy, err := skipNetworkdb(dAtA[iNdEx:])
1669 1669
 			if err != nil {
1670 1670
 				return err
1671 1671
 			}
... ...
@@ -1684,8 +1838,8 @@ func (m *NetworkEntry) Unmarshal(data []byte) error {
1684 1684
 	}
1685 1685
 	return nil
1686 1686
 }
1687
-func (m *NetworkPushPull) Unmarshal(data []byte) error {
1688
-	l := len(data)
1687
+func (m *NetworkPushPull) Unmarshal(dAtA []byte) error {
1688
+	l := len(dAtA)
1689 1689
 	iNdEx := 0
1690 1690
 	for iNdEx < l {
1691 1691
 		preIndex := iNdEx
... ...
@@ -1697,7 +1851,7 @@ func (m *NetworkPushPull) Unmarshal(data []byte) error {
1697 1697
 			if iNdEx >= l {
1698 1698
 				return io.ErrUnexpectedEOF
1699 1699
 			}
1700
-			b := data[iNdEx]
1700
+			b := dAtA[iNdEx]
1701 1701
 			iNdEx++
1702 1702
 			wire |= (uint64(b) & 0x7F) << shift
1703 1703
 			if b < 0x80 {
... ...
@@ -1725,7 +1879,7 @@ func (m *NetworkPushPull) Unmarshal(data []byte) error {
1725 1725
 				if iNdEx >= l {
1726 1726
 					return io.ErrUnexpectedEOF
1727 1727
 				}
1728
-				b := data[iNdEx]
1728
+				b := dAtA[iNdEx]
1729 1729
 				iNdEx++
1730 1730
 				m.LTime |= (github_com_hashicorp_serf_serf.LamportTime(b) & 0x7F) << shift
1731 1731
 				if b < 0x80 {
... ...
@@ -1744,7 +1898,7 @@ func (m *NetworkPushPull) Unmarshal(data []byte) error {
1744 1744
 				if iNdEx >= l {
1745 1745
 					return io.ErrUnexpectedEOF
1746 1746
 				}
1747
-				b := data[iNdEx]
1747
+				b := dAtA[iNdEx]
1748 1748
 				iNdEx++
1749 1749
 				msglen |= (int(b) & 0x7F) << shift
1750 1750
 				if b < 0x80 {
... ...
@@ -1759,7 +1913,7 @@ func (m *NetworkPushPull) Unmarshal(data []byte) error {
1759 1759
 				return io.ErrUnexpectedEOF
1760 1760
 			}
1761 1761
 			m.Networks = append(m.Networks, &NetworkEntry{})
1762
-			if err := m.Networks[len(m.Networks)-1].Unmarshal(data[iNdEx:postIndex]); err != nil {
1762
+			if err := m.Networks[len(m.Networks)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
1763 1763
 				return err
1764 1764
 			}
1765 1765
 			iNdEx = postIndex
... ...
@@ -1775,7 +1929,7 @@ func (m *NetworkPushPull) Unmarshal(data []byte) error {
1775 1775
 				if iNdEx >= l {
1776 1776
 					return io.ErrUnexpectedEOF
1777 1777
 				}
1778
-				b := data[iNdEx]
1778
+				b := dAtA[iNdEx]
1779 1779
 				iNdEx++
1780 1780
 				stringLen |= (uint64(b) & 0x7F) << shift
1781 1781
 				if b < 0x80 {
... ...
@@ -1790,11 +1944,11 @@ func (m *NetworkPushPull) Unmarshal(data []byte) error {
1790 1790
 			if postIndex > l {
1791 1791
 				return io.ErrUnexpectedEOF
1792 1792
 			}
1793
-			m.NodeName = string(data[iNdEx:postIndex])
1793
+			m.NodeName = string(dAtA[iNdEx:postIndex])
1794 1794
 			iNdEx = postIndex
1795 1795
 		default:
1796 1796
 			iNdEx = preIndex
1797
-			skippy, err := skipNetworkdb(data[iNdEx:])
1797
+			skippy, err := skipNetworkdb(dAtA[iNdEx:])
1798 1798
 			if err != nil {
1799 1799
 				return err
1800 1800
 			}
... ...
@@ -1813,8 +1967,8 @@ func (m *NetworkPushPull) Unmarshal(data []byte) error {
1813 1813
 	}
1814 1814
 	return nil
1815 1815
 }
1816
-func (m *TableEvent) Unmarshal(data []byte) error {
1817
-	l := len(data)
1816
+func (m *TableEvent) Unmarshal(dAtA []byte) error {
1817
+	l := len(dAtA)
1818 1818
 	iNdEx := 0
1819 1819
 	for iNdEx < l {
1820 1820
 		preIndex := iNdEx
... ...
@@ -1826,7 +1980,7 @@ func (m *TableEvent) Unmarshal(data []byte) error {
1826 1826
 			if iNdEx >= l {
1827 1827
 				return io.ErrUnexpectedEOF
1828 1828
 			}
1829
-			b := data[iNdEx]
1829
+			b := dAtA[iNdEx]
1830 1830
 			iNdEx++
1831 1831
 			wire |= (uint64(b) & 0x7F) << shift
1832 1832
 			if b < 0x80 {
... ...
@@ -1854,7 +2008,7 @@ func (m *TableEvent) Unmarshal(data []byte) error {
1854 1854
 				if iNdEx >= l {
1855 1855
 					return io.ErrUnexpectedEOF
1856 1856
 				}
1857
-				b := data[iNdEx]
1857
+				b := dAtA[iNdEx]
1858 1858
 				iNdEx++
1859 1859
 				m.Type |= (TableEvent_Type(b) & 0x7F) << shift
1860 1860
 				if b < 0x80 {
... ...
@@ -1873,7 +2027,7 @@ func (m *TableEvent) Unmarshal(data []byte) error {
1873 1873
 				if iNdEx >= l {
1874 1874
 					return io.ErrUnexpectedEOF
1875 1875
 				}
1876
-				b := data[iNdEx]
1876
+				b := dAtA[iNdEx]
1877 1877
 				iNdEx++
1878 1878
 				m.LTime |= (github_com_hashicorp_serf_serf.LamportTime(b) & 0x7F) << shift
1879 1879
 				if b < 0x80 {
... ...
@@ -1892,7 +2046,7 @@ func (m *TableEvent) Unmarshal(data []byte) error {
1892 1892
 				if iNdEx >= l {
1893 1893
 					return io.ErrUnexpectedEOF
1894 1894
 				}
1895
-				b := data[iNdEx]
1895
+				b := dAtA[iNdEx]
1896 1896
 				iNdEx++
1897 1897
 				stringLen |= (uint64(b) & 0x7F) << shift
1898 1898
 				if b < 0x80 {
... ...
@@ -1907,7 +2061,7 @@ func (m *TableEvent) Unmarshal(data []byte) error {
1907 1907
 			if postIndex > l {
1908 1908
 				return io.ErrUnexpectedEOF
1909 1909
 			}
1910
-			m.NodeName = string(data[iNdEx:postIndex])
1910
+			m.NodeName = string(dAtA[iNdEx:postIndex])
1911 1911
 			iNdEx = postIndex
1912 1912
 		case 4:
1913 1913
 			if wireType != 2 {
... ...
@@ -1921,7 +2075,7 @@ func (m *TableEvent) Unmarshal(data []byte) error {
1921 1921
 				if iNdEx >= l {
1922 1922
 					return io.ErrUnexpectedEOF
1923 1923
 				}
1924
-				b := data[iNdEx]
1924
+				b := dAtA[iNdEx]
1925 1925
 				iNdEx++
1926 1926
 				stringLen |= (uint64(b) & 0x7F) << shift
1927 1927
 				if b < 0x80 {
... ...
@@ -1936,7 +2090,7 @@ func (m *TableEvent) Unmarshal(data []byte) error {
1936 1936
 			if postIndex > l {
1937 1937
 				return io.ErrUnexpectedEOF
1938 1938
 			}
1939
-			m.NetworkID = string(data[iNdEx:postIndex])
1939
+			m.NetworkID = string(dAtA[iNdEx:postIndex])
1940 1940
 			iNdEx = postIndex
1941 1941
 		case 5:
1942 1942
 			if wireType != 2 {
... ...
@@ -1950,7 +2104,7 @@ func (m *TableEvent) Unmarshal(data []byte) error {
1950 1950
 				if iNdEx >= l {
1951 1951
 					return io.ErrUnexpectedEOF
1952 1952
 				}
1953
-				b := data[iNdEx]
1953
+				b := dAtA[iNdEx]
1954 1954
 				iNdEx++
1955 1955
 				stringLen |= (uint64(b) & 0x7F) << shift
1956 1956
 				if b < 0x80 {
... ...
@@ -1965,7 +2119,7 @@ func (m *TableEvent) Unmarshal(data []byte) error {
1965 1965
 			if postIndex > l {
1966 1966
 				return io.ErrUnexpectedEOF
1967 1967
 			}
1968
-			m.TableName = string(data[iNdEx:postIndex])
1968
+			m.TableName = string(dAtA[iNdEx:postIndex])
1969 1969
 			iNdEx = postIndex
1970 1970
 		case 6:
1971 1971
 			if wireType != 2 {
... ...
@@ -1979,7 +2133,7 @@ func (m *TableEvent) Unmarshal(data []byte) error {
1979 1979
 				if iNdEx >= l {
1980 1980
 					return io.ErrUnexpectedEOF
1981 1981
 				}
1982
-				b := data[iNdEx]
1982
+				b := dAtA[iNdEx]
1983 1983
 				iNdEx++
1984 1984
 				stringLen |= (uint64(b) & 0x7F) << shift
1985 1985
 				if b < 0x80 {
... ...
@@ -1994,7 +2148,7 @@ func (m *TableEvent) Unmarshal(data []byte) error {
1994 1994
 			if postIndex > l {
1995 1995
 				return io.ErrUnexpectedEOF
1996 1996
 			}
1997
-			m.Key = string(data[iNdEx:postIndex])
1997
+			m.Key = string(dAtA[iNdEx:postIndex])
1998 1998
 			iNdEx = postIndex
1999 1999
 		case 7:
2000 2000
 			if wireType != 2 {
... ...
@@ -2008,7 +2162,7 @@ func (m *TableEvent) Unmarshal(data []byte) error {
2008 2008
 				if iNdEx >= l {
2009 2009
 					return io.ErrUnexpectedEOF
2010 2010
 				}
2011
-				b := data[iNdEx]
2011
+				b := dAtA[iNdEx]
2012 2012
 				iNdEx++
2013 2013
 				byteLen |= (int(b) & 0x7F) << shift
2014 2014
 				if b < 0x80 {
... ...
@@ -2022,14 +2176,33 @@ func (m *TableEvent) Unmarshal(data []byte) error {
2022 2022
 			if postIndex > l {
2023 2023
 				return io.ErrUnexpectedEOF
2024 2024
 			}
2025
-			m.Value = append(m.Value[:0], data[iNdEx:postIndex]...)
2025
+			m.Value = append(m.Value[:0], dAtA[iNdEx:postIndex]...)
2026 2026
 			if m.Value == nil {
2027 2027
 				m.Value = []byte{}
2028 2028
 			}
2029 2029
 			iNdEx = postIndex
2030
+		case 8:
2031
+			if wireType != 0 {
2032
+				return fmt.Errorf("proto: wrong wireType = %d for field ResidualReapTime", wireType)
2033
+			}
2034
+			m.ResidualReapTime = 0
2035
+			for shift := uint(0); ; shift += 7 {
2036
+				if shift >= 64 {
2037
+					return ErrIntOverflowNetworkdb
2038
+				}
2039
+				if iNdEx >= l {
2040
+					return io.ErrUnexpectedEOF
2041
+				}
2042
+				b := dAtA[iNdEx]
2043
+				iNdEx++
2044
+				m.ResidualReapTime |= (int32(b) & 0x7F) << shift
2045
+				if b < 0x80 {
2046
+					break
2047
+				}
2048
+			}
2030 2049
 		default:
2031 2050
 			iNdEx = preIndex
2032
-			skippy, err := skipNetworkdb(data[iNdEx:])
2051
+			skippy, err := skipNetworkdb(dAtA[iNdEx:])
2033 2052
 			if err != nil {
2034 2053
 				return err
2035 2054
 			}
... ...
@@ -2048,8 +2221,8 @@ func (m *TableEvent) Unmarshal(data []byte) error {
2048 2048
 	}
2049 2049
 	return nil
2050 2050
 }
2051
-func (m *BulkSyncMessage) Unmarshal(data []byte) error {
2052
-	l := len(data)
2051
+func (m *BulkSyncMessage) Unmarshal(dAtA []byte) error {
2052
+	l := len(dAtA)
2053 2053
 	iNdEx := 0
2054 2054
 	for iNdEx < l {
2055 2055
 		preIndex := iNdEx
... ...
@@ -2061,7 +2234,7 @@ func (m *BulkSyncMessage) Unmarshal(data []byte) error {
2061 2061
 			if iNdEx >= l {
2062 2062
 				return io.ErrUnexpectedEOF
2063 2063
 			}
2064
-			b := data[iNdEx]
2064
+			b := dAtA[iNdEx]
2065 2065
 			iNdEx++
2066 2066
 			wire |= (uint64(b) & 0x7F) << shift
2067 2067
 			if b < 0x80 {
... ...
@@ -2089,7 +2262,7 @@ func (m *BulkSyncMessage) Unmarshal(data []byte) error {
2089 2089
 				if iNdEx >= l {
2090 2090
 					return io.ErrUnexpectedEOF
2091 2091
 				}
2092
-				b := data[iNdEx]
2092
+				b := dAtA[iNdEx]
2093 2093
 				iNdEx++
2094 2094
 				m.LTime |= (github_com_hashicorp_serf_serf.LamportTime(b) & 0x7F) << shift
2095 2095
 				if b < 0x80 {
... ...
@@ -2108,7 +2281,7 @@ func (m *BulkSyncMessage) Unmarshal(data []byte) error {
2108 2108
 				if iNdEx >= l {
2109 2109
 					return io.ErrUnexpectedEOF
2110 2110
 				}
2111
-				b := data[iNdEx]
2111
+				b := dAtA[iNdEx]
2112 2112
 				iNdEx++
2113 2113
 				v |= (int(b) & 0x7F) << shift
2114 2114
 				if b < 0x80 {
... ...
@@ -2128,7 +2301,7 @@ func (m *BulkSyncMessage) Unmarshal(data []byte) error {
2128 2128
 				if iNdEx >= l {
2129 2129
 					return io.ErrUnexpectedEOF
2130 2130
 				}
2131
-				b := data[iNdEx]
2131
+				b := dAtA[iNdEx]
2132 2132
 				iNdEx++
2133 2133
 				stringLen |= (uint64(b) & 0x7F) << shift
2134 2134
 				if b < 0x80 {
... ...
@@ -2143,7 +2316,7 @@ func (m *BulkSyncMessage) Unmarshal(data []byte) error {
2143 2143
 			if postIndex > l {
2144 2144
 				return io.ErrUnexpectedEOF
2145 2145
 			}
2146
-			m.NodeName = string(data[iNdEx:postIndex])
2146
+			m.NodeName = string(dAtA[iNdEx:postIndex])
2147 2147
 			iNdEx = postIndex
2148 2148
 		case 4:
2149 2149
 			if wireType != 2 {
... ...
@@ -2157,7 +2330,7 @@ func (m *BulkSyncMessage) Unmarshal(data []byte) error {
2157 2157
 				if iNdEx >= l {
2158 2158
 					return io.ErrUnexpectedEOF
2159 2159
 				}
2160
-				b := data[iNdEx]
2160
+				b := dAtA[iNdEx]
2161 2161
 				iNdEx++
2162 2162
 				stringLen |= (uint64(b) & 0x7F) << shift
2163 2163
 				if b < 0x80 {
... ...
@@ -2172,7 +2345,7 @@ func (m *BulkSyncMessage) Unmarshal(data []byte) error {
2172 2172
 			if postIndex > l {
2173 2173
 				return io.ErrUnexpectedEOF
2174 2174
 			}
2175
-			m.Networks = append(m.Networks, string(data[iNdEx:postIndex]))
2175
+			m.Networks = append(m.Networks, string(dAtA[iNdEx:postIndex]))
2176 2176
 			iNdEx = postIndex
2177 2177
 		case 5:
2178 2178
 			if wireType != 2 {
... ...
@@ -2186,7 +2359,7 @@ func (m *BulkSyncMessage) Unmarshal(data []byte) error {
2186 2186
 				if iNdEx >= l {
2187 2187
 					return io.ErrUnexpectedEOF
2188 2188
 				}
2189
-				b := data[iNdEx]
2189
+				b := dAtA[iNdEx]
2190 2190
 				iNdEx++
2191 2191
 				byteLen |= (int(b) & 0x7F) << shift
2192 2192
 				if b < 0x80 {
... ...
@@ -2200,14 +2373,14 @@ func (m *BulkSyncMessage) Unmarshal(data []byte) error {
2200 2200
 			if postIndex > l {
2201 2201
 				return io.ErrUnexpectedEOF
2202 2202
 			}
2203
-			m.Payload = append(m.Payload[:0], data[iNdEx:postIndex]...)
2203
+			m.Payload = append(m.Payload[:0], dAtA[iNdEx:postIndex]...)
2204 2204
 			if m.Payload == nil {
2205 2205
 				m.Payload = []byte{}
2206 2206
 			}
2207 2207
 			iNdEx = postIndex
2208 2208
 		default:
2209 2209
 			iNdEx = preIndex
2210
-			skippy, err := skipNetworkdb(data[iNdEx:])
2210
+			skippy, err := skipNetworkdb(dAtA[iNdEx:])
2211 2211
 			if err != nil {
2212 2212
 				return err
2213 2213
 			}
... ...
@@ -2226,8 +2399,8 @@ func (m *BulkSyncMessage) Unmarshal(data []byte) error {
2226 2226
 	}
2227 2227
 	return nil
2228 2228
 }
2229
-func (m *CompoundMessage) Unmarshal(data []byte) error {
2230
-	l := len(data)
2229
+func (m *CompoundMessage) Unmarshal(dAtA []byte) error {
2230
+	l := len(dAtA)
2231 2231
 	iNdEx := 0
2232 2232
 	for iNdEx < l {
2233 2233
 		preIndex := iNdEx
... ...
@@ -2239,7 +2412,7 @@ func (m *CompoundMessage) Unmarshal(data []byte) error {
2239 2239
 			if iNdEx >= l {
2240 2240
 				return io.ErrUnexpectedEOF
2241 2241
 			}
2242
-			b := data[iNdEx]
2242
+			b := dAtA[iNdEx]
2243 2243
 			iNdEx++
2244 2244
 			wire |= (uint64(b) & 0x7F) << shift
2245 2245
 			if b < 0x80 {
... ...
@@ -2267,7 +2440,7 @@ func (m *CompoundMessage) Unmarshal(data []byte) error {
2267 2267
 				if iNdEx >= l {
2268 2268
 					return io.ErrUnexpectedEOF
2269 2269
 				}
2270
-				b := data[iNdEx]
2270
+				b := dAtA[iNdEx]
2271 2271
 				iNdEx++
2272 2272
 				msglen |= (int(b) & 0x7F) << shift
2273 2273
 				if b < 0x80 {
... ...
@@ -2282,13 +2455,13 @@ func (m *CompoundMessage) Unmarshal(data []byte) error {
2282 2282
 				return io.ErrUnexpectedEOF
2283 2283
 			}
2284 2284
 			m.Messages = append(m.Messages, &CompoundMessage_SimpleMessage{})
2285
-			if err := m.Messages[len(m.Messages)-1].Unmarshal(data[iNdEx:postIndex]); err != nil {
2285
+			if err := m.Messages[len(m.Messages)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
2286 2286
 				return err
2287 2287
 			}
2288 2288
 			iNdEx = postIndex
2289 2289
 		default:
2290 2290
 			iNdEx = preIndex
2291
-			skippy, err := skipNetworkdb(data[iNdEx:])
2291
+			skippy, err := skipNetworkdb(dAtA[iNdEx:])
2292 2292
 			if err != nil {
2293 2293
 				return err
2294 2294
 			}
... ...
@@ -2307,8 +2480,8 @@ func (m *CompoundMessage) Unmarshal(data []byte) error {
2307 2307
 	}
2308 2308
 	return nil
2309 2309
 }
2310
-func (m *CompoundMessage_SimpleMessage) Unmarshal(data []byte) error {
2311
-	l := len(data)
2310
+func (m *CompoundMessage_SimpleMessage) Unmarshal(dAtA []byte) error {
2311
+	l := len(dAtA)
2312 2312
 	iNdEx := 0
2313 2313
 	for iNdEx < l {
2314 2314
 		preIndex := iNdEx
... ...
@@ -2320,7 +2493,7 @@ func (m *CompoundMessage_SimpleMessage) Unmarshal(data []byte) error {
2320 2320
 			if iNdEx >= l {
2321 2321
 				return io.ErrUnexpectedEOF
2322 2322
 			}
2323
-			b := data[iNdEx]
2323
+			b := dAtA[iNdEx]
2324 2324
 			iNdEx++
2325 2325
 			wire |= (uint64(b) & 0x7F) << shift
2326 2326
 			if b < 0x80 {
... ...
@@ -2348,7 +2521,7 @@ func (m *CompoundMessage_SimpleMessage) Unmarshal(data []byte) error {
2348 2348
 				if iNdEx >= l {
2349 2349
 					return io.ErrUnexpectedEOF
2350 2350
 				}
2351
-				b := data[iNdEx]
2351
+				b := dAtA[iNdEx]
2352 2352
 				iNdEx++
2353 2353
 				byteLen |= (int(b) & 0x7F) << shift
2354 2354
 				if b < 0x80 {
... ...
@@ -2362,14 +2535,14 @@ func (m *CompoundMessage_SimpleMessage) Unmarshal(data []byte) error {
2362 2362
 			if postIndex > l {
2363 2363
 				return io.ErrUnexpectedEOF
2364 2364
 			}
2365
-			m.Payload = append(m.Payload[:0], data[iNdEx:postIndex]...)
2365
+			m.Payload = append(m.Payload[:0], dAtA[iNdEx:postIndex]...)
2366 2366
 			if m.Payload == nil {
2367 2367
 				m.Payload = []byte{}
2368 2368
 			}
2369 2369
 			iNdEx = postIndex
2370 2370
 		default:
2371 2371
 			iNdEx = preIndex
2372
-			skippy, err := skipNetworkdb(data[iNdEx:])
2372
+			skippy, err := skipNetworkdb(dAtA[iNdEx:])
2373 2373
 			if err != nil {
2374 2374
 				return err
2375 2375
 			}
... ...
@@ -2388,8 +2561,8 @@ func (m *CompoundMessage_SimpleMessage) Unmarshal(data []byte) error {
2388 2388
 	}
2389 2389
 	return nil
2390 2390
 }
2391
-func skipNetworkdb(data []byte) (n int, err error) {
2392
-	l := len(data)
2391
+func skipNetworkdb(dAtA []byte) (n int, err error) {
2392
+	l := len(dAtA)
2393 2393
 	iNdEx := 0
2394 2394
 	for iNdEx < l {
2395 2395
 		var wire uint64
... ...
@@ -2400,7 +2573,7 @@ func skipNetworkdb(data []byte) (n int, err error) {
2400 2400
 			if iNdEx >= l {
2401 2401
 				return 0, io.ErrUnexpectedEOF
2402 2402
 			}
2403
-			b := data[iNdEx]
2403
+			b := dAtA[iNdEx]
2404 2404
 			iNdEx++
2405 2405
 			wire |= (uint64(b) & 0x7F) << shift
2406 2406
 			if b < 0x80 {
... ...
@@ -2418,7 +2591,7 @@ func skipNetworkdb(data []byte) (n int, err error) {
2418 2418
 					return 0, io.ErrUnexpectedEOF
2419 2419
 				}
2420 2420
 				iNdEx++
2421
-				if data[iNdEx-1] < 0x80 {
2421
+				if dAtA[iNdEx-1] < 0x80 {
2422 2422
 					break
2423 2423
 				}
2424 2424
 			}
... ...
@@ -2435,7 +2608,7 @@ func skipNetworkdb(data []byte) (n int, err error) {
2435 2435
 				if iNdEx >= l {
2436 2436
 					return 0, io.ErrUnexpectedEOF
2437 2437
 				}
2438
-				b := data[iNdEx]
2438
+				b := dAtA[iNdEx]
2439 2439
 				iNdEx++
2440 2440
 				length |= (int(b) & 0x7F) << shift
2441 2441
 				if b < 0x80 {
... ...
@@ -2458,7 +2631,7 @@ func skipNetworkdb(data []byte) (n int, err error) {
2458 2458
 					if iNdEx >= l {
2459 2459
 						return 0, io.ErrUnexpectedEOF
2460 2460
 					}
2461
-					b := data[iNdEx]
2461
+					b := dAtA[iNdEx]
2462 2462
 					iNdEx++
2463 2463
 					innerWire |= (uint64(b) & 0x7F) << shift
2464 2464
 					if b < 0x80 {
... ...
@@ -2469,7 +2642,7 @@ func skipNetworkdb(data []byte) (n int, err error) {
2469 2469
 				if innerWireType == 4 {
2470 2470
 					break
2471 2471
 				}
2472
-				next, err := skipNetworkdb(data[start:])
2472
+				next, err := skipNetworkdb(dAtA[start:])
2473 2473
 				if err != nil {
2474 2474
 					return 0, err
2475 2475
 				}
... ...
@@ -2493,62 +2666,68 @@ var (
2493 2493
 	ErrIntOverflowNetworkdb   = fmt.Errorf("proto: integer overflow")
2494 2494
 )
2495 2495
 
2496
+func init() { proto.RegisterFile("networkdb.proto", fileDescriptorNetworkdb) }
2497
+
2496 2498
 var fileDescriptorNetworkdb = []byte{
2497
-	// 887 bytes of a gzipped FileDescriptorProto
2498
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xcc, 0x96, 0xc1, 0x6e, 0xe3, 0x44,
2499
-	0x18, 0xc7, 0xeb, 0xc4, 0x49, 0xe3, 0xaf, 0x0d, 0x1b, 0xbc, 0xdd, 0xad, 0xd7, 0x0b, 0x49, 0x31,
2500
-	0xcb, 0x2a, 0x44, 0xe0, 0xa2, 0xee, 0x13, 0x24, 0xb1, 0x05, 0xd9, 0xf5, 0x3a, 0x91, 0x93, 0x14,
2501
-	0x71, 0x8a, 0x9c, 0x78, 0x48, 0xac, 0x3a, 0xb6, 0x15, 0x3b, 0x45, 0x39, 0x81, 0x38, 0xad, 0x78,
2502
-	0x07, 0x4e, 0xcb, 0x99, 0x07, 0xe0, 0xc0, 0x89, 0xc3, 0x8a, 0x13, 0xdc, 0x10, 0x87, 0x8a, 0xee,
2503
-	0x13, 0xf0, 0x08, 0x8c, 0xc7, 0x76, 0x32, 0x4e, 0xa3, 0x5e, 0x40, 0xc0, 0xc1, 0xad, 0x67, 0xe6,
2504
-	0xe7, 0xcf, 0xdf, 0xf7, 0x9f, 0xff, 0xe7, 0x09, 0xdc, 0x71, 0x51, 0xf8, 0x85, 0xb7, 0xb8, 0xb0,
2505
-	0xc6, 0xb2, 0xbf, 0xf0, 0x42, 0x8f, 0xe7, 0xd6, 0x13, 0xe2, 0xd1, 0xd4, 0x9b, 0x7a, 0x64, 0xf6,
2506
-	0x34, 0xba, 0x8b, 0x01, 0xa9, 0x0b, 0xe5, 0x8f, 0xbd, 0x20, 0xb0, 0xfd, 0xe7, 0x28, 0x08, 0xcc,
2507
-	0x29, 0xe2, 0x1b, 0xc0, 0x86, 0x2b, 0x1f, 0x09, 0xcc, 0x09, 0x53, 0x7f, 0xe3, 0xec, 0xbe, 0xbc,
2508
-	0x89, 0x98, 0x10, 0x03, 0xbc, 0x6a, 0x10, 0x86, 0xe7, 0x81, 0xb5, 0xcc, 0xd0, 0x14, 0x72, 0x98,
2509
-	0x3d, 0x34, 0xc8, 0xbd, 0xf4, 0x32, 0x07, 0x9c, 0xee, 0x59, 0x48, 0xbd, 0x44, 0x6e, 0xc8, 0x7f,
2510
-	0x98, 0x89, 0xf6, 0x80, 0x8a, 0xb6, 0x66, 0x64, 0x2a, 0x60, 0x07, 0x8a, 0xce, 0x28, 0xb4, 0xe7,
2511
-	0x88, 0x84, 0x64, 0x5b, 0x67, 0xaf, 0xae, 0x6a, 0x7b, 0xbf, 0x5f, 0xd5, 0x1a, 0x53, 0x3b, 0x9c,
2512
-	0x2d, 0xc7, 0xf2, 0xc4, 0x9b, 0x9f, 0xce, 0xcc, 0x60, 0x66, 0x4f, 0xbc, 0x85, 0x7f, 0x1a, 0xa0,
2513
-	0xc5, 0xe7, 0xe4, 0x8f, 0xac, 0x99, 0x73, 0xdf, 0x5b, 0x84, 0x03, 0xfc, 0xa4, 0x51, 0x70, 0xa2,
2514
-	0x7f, 0xfc, 0x43, 0xe0, 0x5c, 0xfc, 0x8a, 0x91, 0x6b, 0xe2, 0x68, 0x79, 0x1c, 0x8d, 0x33, 0x4a,
2515
-	0xd1, 0x84, 0x8e, 0xc7, 0xd2, 0x97, 0xc0, 0x46, 0x6f, 0xe5, 0xdf, 0x83, 0xfd, 0x8e, 0x7e, 0xde,
2516
-	0xd4, 0x3a, 0x4a, 0x65, 0x4f, 0x14, 0xbe, 0xf9, 0xf6, 0xe4, 0x68, 0x9d, 0x56, 0xb4, 0xde, 0x71,
2517
-	0x2f, 0x4d, 0xc7, 0xb6, 0xf8, 0x1a, 0xb0, 0x4f, 0xbb, 0x1d, 0xbd, 0xc2, 0x88, 0xf7, 0x30, 0xf3,
2518
-	0x66, 0x86, 0x79, 0xea, 0xd9, 0x2e, 0xff, 0x0e, 0x14, 0x34, 0xb5, 0x79, 0xae, 0x56, 0x72, 0xe2,
2519
-	0x7d, 0x4c, 0xf0, 0x19, 0x42, 0x43, 0xe6, 0x25, 0x12, 0x0f, 0x5f, 0xbc, 0xac, 0xee, 0xfd, 0xf0,
2520
-	0x5d, 0x95, 0xbc, 0x58, 0xba, 0xce, 0xc1, 0xa1, 0x1e, 0x6b, 0x11, 0x0b, 0xf5, 0x51, 0x46, 0xa8,
2521
-	0xb7, 0x68, 0xa1, 0x28, 0xec, 0x3f, 0xd0, 0x8a, 0xff, 0x00, 0x20, 0x49, 0x66, 0x64, 0x5b, 0x02,
2522
-	0x1b, 0xad, 0xb6, 0xca, 0xaf, 0xaf, 0x6a, 0x5c, 0x92, 0x58, 0x47, 0x31, 0x52, 0x97, 0x75, 0x2c,
2523
-	0xe9, 0x05, 0x93, 0x48, 0x5b, 0xa7, 0xa5, 0x7d, 0x88, 0x45, 0x39, 0xa6, 0x0b, 0xa1, 0xd5, 0x95,
2524
-	0xd6, 0xea, 0xc6, 0x3b, 0xb0, 0x85, 0x11, 0x81, 0x1f, 0x6d, 0x04, 0x7e, 0x80, 0xa1, 0x7b, 0xdb,
2525
-	0xd0, 0x2e, 0x8d, 0x7f, 0x64, 0x36, 0x1a, 0xbb, 0xe1, 0x62, 0xb5, 0x55, 0x09, 0x73, 0x7b, 0x25,
2526
-	0xff, 0x9a, 0xbe, 0x02, 0xec, 0x3b, 0x38, 0x7b, 0xdb, 0x9d, 0x12, 0x71, 0x4b, 0x46, 0x3a, 0x94,
2527
-	0xbe, 0x67, 0xe0, 0x4e, 0x92, 0x5a, 0x6f, 0x19, 0xcc, 0x7a, 0x4b, 0xc7, 0xa1, 0xb2, 0x62, 0xfe,
2528
-	0x6e, 0x56, 0x4f, 0xa0, 0x94, 0x54, 0x1b, 0xe0, 0x12, 0xf3, 0xf5, 0x83, 0xb3, 0xe3, 0x1d, 0xb6,
2529
-	0x8b, 0x94, 0x33, 0xd6, 0xe0, 0xed, 0x6d, 0xf5, 0x73, 0x1e, 0x60, 0x60, 0x8e, 0x9d, 0xa4, 0xf9,
2530
-	0xe5, 0x8c, 0xa7, 0x45, 0x2a, 0xf8, 0x06, 0xfa, 0xdf, 0x3b, 0x9a, 0x7f, 0x1b, 0x20, 0x8c, 0xd2,
2531
-	0x8d, 0x63, 0x15, 0x48, 0x2c, 0x8e, 0xcc, 0x90, 0x60, 0x15, 0xc8, 0x5f, 0xa0, 0x95, 0x50, 0x24,
2532
-	0xf3, 0xd1, 0x2d, 0x7f, 0x04, 0x05, 0x6c, 0xec, 0x25, 0x12, 0xf6, 0xc9, 0x67, 0x31, 0x1e, 0x44,
2533
-	0x9b, 0x19, 0x37, 0xc6, 0x63, 0xba, 0x31, 0x88, 0x99, 0x37, 0x6a, 0xd0, 0x6d, 0xf1, 0x08, 0x8a,
2534
-	0x6d, 0x43, 0x6d, 0x0e, 0xd4, 0xb4, 0x31, 0xb2, 0x58, 0x7b, 0x81, 0xcc, 0x10, 0x45, 0xd4, 0xb0,
2535
-	0xa7, 0x44, 0x54, 0x6e, 0x17, 0x35, 0xf4, 0xad, 0x84, 0x52, 0x54, 0x4d, 0xc5, 0x54, 0x7e, 0x17,
2536
-	0xa5, 0x20, 0x07, 0x85, 0xdb, 0xed, 0xf3, 0x2b, 0x76, 0x5f, 0x6b, 0xe9, 0x5c, 0xf4, 0x57, 0xee,
2537
-	0x24, 0x3d, 0x1c, 0xfe, 0x41, 0xf7, 0x9d, 0xc0, 0xc1, 0xd2, 0x0d, 0x3c, 0xc7, 0x9e, 0xd8, 0x21,
2538
-	0xb2, 0xc8, 0x8e, 0x97, 0x0c, 0x7a, 0xea, 0xf6, 0x3d, 0x14, 0x29, 0xf3, 0xb2, 0xd8, 0xbc, 0x1c,
2539
-	0xe5, 0x51, 0xdc, 0x51, 0xbe, 0xb9, 0x72, 0x3c, 0xd3, 0x22, 0xdb, 0x75, 0x68, 0xa4, 0x43, 0xe9,
2540
-	0x6b, 0x5c, 0x53, 0xdb, 0xc3, 0xb9, 0x2c, 0x5d, 0x2b, 0xad, 0x49, 0x81, 0xd2, 0x3c, 0xbe, 0x0d,
2541
-	0x70, 0x55, 0x51, 0x1b, 0xd4, 0x29, 0xa7, 0x6e, 0xd1, 0x72, 0xdf, 0x9e, 0xfb, 0x0e, 0x4a, 0x46,
2542
-	0xc6, 0xfa, 0x49, 0xf1, 0x7d, 0x28, 0x67, 0x96, 0xa2, 0x24, 0x7a, 0x49, 0x12, 0x4c, 0x26, 0x89,
2543
-	0xc6, 0x4f, 0x39, 0x38, 0xa0, 0xce, 0x52, 0xfe, 0x5d, 0xda, 0x10, 0xe4, 0xf8, 0xa0, 0x56, 0x53,
2544
-	0x37, 0xc8, 0x50, 0xd6, 0xd5, 0xc1, 0xa7, 0x5d, 0xe3, 0xd9, 0x48, 0x3d, 0x57, 0xf5, 0x01, 0x36,
2545
-	0x05, 0xf9, 0xa8, 0x52, 0x68, 0xe6, 0x3c, 0x69, 0xc0, 0xc1, 0xa0, 0xd9, 0xd2, 0xd4, 0x84, 0x4e,
2546
-	0x3e, 0x9b, 0x14, 0x4d, 0xf5, 0xe9, 0x63, 0xe0, 0x7a, 0xc3, 0xfe, 0x27, 0xa3, 0xde, 0x50, 0xd3,
2547
-	0xb0, 0x41, 0x8e, 0x31, 0x79, 0x97, 0x22, 0xd7, 0xdf, 0x1e, 0xcc, 0xb5, 0x86, 0xda, 0xb3, 0x51,
2548
-	0xff, 0x33, 0xbd, 0x5d, 0x61, 0x6f, 0x70, 0xa9, 0x59, 0xf0, 0xa9, 0x5a, 0x6a, 0x77, 0x9f, 0xf7,
2549
-	0xba, 0x43, 0x5d, 0xa9, 0x14, 0x6e, 0x60, 0xa9, 0xa2, 0xf8, 0x84, 0x00, 0xbd, 0xab, 0xa4, 0x19,
2550
-	0x16, 0x63, 0x63, 0xd2, 0xf5, 0xa4, 0x87, 0xa8, 0x78, 0x37, 0x31, 0x26, 0x2d, 0x5b, 0x4b, 0xf8,
2551
-	0xed, 0xba, 0xba, 0xf7, 0xe7, 0x75, 0x95, 0xf9, 0xea, 0x75, 0x95, 0x79, 0x85, 0xaf, 0x5f, 0xf0,
2552
-	0xf5, 0x07, 0xbe, 0xc6, 0x45, 0xf2, 0xd3, 0xe6, 0xc9, 0x5f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x21,
2553
-	0x78, 0x72, 0xc3, 0x0e, 0x09, 0x00, 0x00,
2499
+	// 953 bytes of a gzipped FileDescriptorProto
2500
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x96, 0xcd, 0x6e, 0xe3, 0x54,
2501
+	0x14, 0xc7, 0x7b, 0xf3, 0xd5, 0xe4, 0x34, 0xa5, 0xe6, 0x4e, 0x67, 0xc6, 0xe3, 0x81, 0xc4, 0x98,
2502
+	0x99, 0x2a, 0x53, 0x41, 0x8a, 0x3a, 0x4f, 0xd0, 0x24, 0x16, 0x64, 0x26, 0xe3, 0x44, 0x6e, 0x52,
2503
+	0xc4, 0x2a, 0xba, 0xad, 0x2f, 0xa9, 0x55, 0xc7, 0xb6, 0x6c, 0x27, 0x28, 0x2b, 0x10, 0xab, 0x51,
2504
+	0x16, 0xbc, 0x41, 0x56, 0xc3, 0x9a, 0x07, 0x40, 0x2c, 0x59, 0xcc, 0x82, 0x05, 0xec, 0x10, 0x8b,
2505
+	0x88, 0xe6, 0x09, 0x78, 0x04, 0xe4, 0x6b, 0x3b, 0xb9, 0x49, 0xab, 0x91, 0x10, 0x23, 0xc1, 0x26,
2506
+	0xb9, 0x1f, 0xbf, 0x1c, 0x9f, 0xf3, 0xf7, 0xff, 0xdc, 0x1b, 0xd8, 0xb3, 0x69, 0xf0, 0x95, 0xe3,
2507
+	0x5d, 0x19, 0xe7, 0x55, 0xd7, 0x73, 0x02, 0x07, 0x17, 0x96, 0x0b, 0xd2, 0xfe, 0xc0, 0x19, 0x38,
2508
+	0x6c, 0xf5, 0x28, 0x1c, 0x45, 0x80, 0xd2, 0x86, 0xdd, 0x4f, 0x1d, 0xdf, 0x37, 0xdd, 0x17, 0xd4,
2509
+	0xf7, 0xc9, 0x80, 0xe2, 0x43, 0xc8, 0x04, 0x13, 0x97, 0x8a, 0x48, 0x46, 0x95, 0x77, 0x8e, 0xef,
2510
+	0x55, 0x57, 0x11, 0x63, 0xa2, 0x3b, 0x71, 0xa9, 0xce, 0x18, 0x8c, 0x21, 0x63, 0x90, 0x80, 0x88,
2511
+	0x29, 0x19, 0x55, 0x8a, 0x3a, 0x1b, 0x2b, 0xaf, 0x52, 0x50, 0xd0, 0x1c, 0x83, 0xaa, 0x63, 0x6a,
2512
+	0x07, 0xf8, 0xe3, 0xb5, 0x68, 0x0f, 0xb8, 0x68, 0x4b, 0xa6, 0xca, 0x05, 0x6c, 0x42, 0xce, 0xea,
2513
+	0x07, 0xe6, 0x90, 0xb2, 0x90, 0x99, 0xda, 0xf1, 0xeb, 0x79, 0x79, 0xeb, 0x8f, 0x79, 0xf9, 0x70,
2514
+	0x60, 0x06, 0x97, 0xa3, 0xf3, 0xea, 0x85, 0x33, 0x3c, 0xba, 0x24, 0xfe, 0xa5, 0x79, 0xe1, 0x78,
2515
+	0xee, 0x91, 0x4f, 0xbd, 0x2f, 0xd9, 0x47, 0xb5, 0x45, 0x86, 0xae, 0xe3, 0x05, 0x5d, 0x73, 0x48,
2516
+	0xf5, 0xac, 0x15, 0x7e, 0xe1, 0x87, 0x50, 0xb0, 0x1d, 0x83, 0xf6, 0x6d, 0x32, 0xa4, 0x62, 0x5a,
2517
+	0x46, 0x95, 0x82, 0x9e, 0x0f, 0x17, 0x34, 0x32, 0xa4, 0xca, 0xd7, 0x90, 0x09, 0x9f, 0x8a, 0x1f,
2518
+	0xc3, 0x76, 0x53, 0x3b, 0x3b, 0x69, 0x35, 0x1b, 0xc2, 0x96, 0x24, 0x4e, 0x67, 0xf2, 0xfe, 0x32,
2519
+	0xad, 0x70, 0xbf, 0x69, 0x8f, 0x89, 0x65, 0x1a, 0xb8, 0x0c, 0x99, 0x67, 0xed, 0xa6, 0x26, 0x20,
2520
+	0xe9, 0xee, 0x74, 0x26, 0xbf, 0xbb, 0xc6, 0x3c, 0x73, 0x4c, 0x1b, 0x7f, 0x00, 0xd9, 0x96, 0x7a,
2521
+	0x72, 0xa6, 0x0a, 0x29, 0xe9, 0xde, 0x74, 0x26, 0xe3, 0x35, 0xa2, 0x45, 0xc9, 0x98, 0x4a, 0xc5,
2522
+	0x97, 0xaf, 0x4a, 0x5b, 0x3f, 0x7e, 0x5f, 0x62, 0x0f, 0x56, 0xae, 0x53, 0x50, 0xd4, 0x22, 0x2d,
2523
+	0x22, 0xa1, 0x3e, 0x59, 0x13, 0xea, 0x3d, 0x5e, 0x28, 0x0e, 0xfb, 0x0f, 0xb4, 0xc2, 0x1f, 0x01,
2524
+	0xc4, 0xc9, 0xf4, 0x4d, 0x43, 0xcc, 0x84, 0xbb, 0xb5, 0xdd, 0xc5, 0xbc, 0x5c, 0x88, 0x13, 0x6b,
2525
+	0x36, 0xf4, 0xc4, 0x65, 0x4d, 0x43, 0x79, 0x89, 0x62, 0x69, 0x2b, 0xbc, 0xb4, 0x0f, 0xa7, 0x33,
2526
+	0xf9, 0x3e, 0x5f, 0x08, 0xaf, 0xae, 0xb2, 0x54, 0x37, 0x7a, 0x03, 0x1b, 0x18, 0x13, 0xf8, 0xd1,
2527
+	0x4a, 0xe0, 0x07, 0xd3, 0x99, 0x7c, 0x77, 0x13, 0xba, 0x4d, 0xe3, 0x5f, 0xd0, 0x4a, 0x63, 0x3b,
2528
+	0xf0, 0x26, 0x1b, 0x95, 0xa0, 0x37, 0x57, 0xf2, 0x36, 0xf5, 0x7d, 0x72, 0x43, 0xdf, 0x5a, 0x71,
2529
+	0x31, 0x2f, 0xe7, 0xb5, 0x58, 0x63, 0x4e, 0x6d, 0x11, 0xb6, 0x2d, 0x4a, 0xc6, 0xa6, 0x3d, 0x60,
2530
+	0x52, 0xe7, 0xf5, 0x64, 0xaa, 0xfc, 0x84, 0x60, 0x2f, 0x4e, 0xb4, 0x33, 0xf2, 0x2f, 0x3b, 0x23,
2531
+	0xcb, 0xe2, 0x72, 0x44, 0xff, 0x36, 0xc7, 0xa7, 0x90, 0x8f, 0x6b, 0xf7, 0xc5, 0x94, 0x9c, 0xae,
2532
+	0xec, 0x1c, 0xdf, 0xbf, 0xc5, 0x84, 0xa1, 0x8e, 0xfa, 0x12, 0xfc, 0x07, 0x85, 0x29, 0xdf, 0x65,
2533
+	0x00, 0xba, 0xe4, 0xdc, 0x8a, 0x0f, 0x86, 0xea, 0x9a, 0xdf, 0x25, 0xee, 0x51, 0x2b, 0xe8, 0x7f,
2534
+	0xef, 0x76, 0xfc, 0x3e, 0x40, 0x10, 0xa6, 0x1b, 0xc5, 0xca, 0xb2, 0x58, 0x05, 0xb6, 0xc2, 0x82,
2535
+	0x09, 0x90, 0xbe, 0xa2, 0x13, 0x31, 0xc7, 0xd6, 0xc3, 0x21, 0xde, 0x87, 0xec, 0x98, 0x58, 0x23,
2536
+	0x2a, 0x6e, 0xb3, 0x23, 0x33, 0x9a, 0xe0, 0x1a, 0x60, 0x8f, 0xfa, 0xa6, 0x31, 0x22, 0x56, 0xdf,
2537
+	0xa3, 0xc4, 0x8d, 0x0a, 0xcd, 0xcb, 0xa8, 0x92, 0xad, 0xed, 0x2f, 0xe6, 0x65, 0x41, 0x8f, 0x77,
2538
+	0x75, 0x4a, 0x5c, 0x56, 0x8a, 0xe0, 0x6d, 0xac, 0x28, 0x3f, 0x24, 0x8d, 0x77, 0xc0, 0x37, 0x1e,
2539
+	0x6b, 0x96, 0x95, 0xa2, 0x7c, 0xdb, 0x3d, 0x82, 0x5c, 0x5d, 0x57, 0x4f, 0xba, 0x6a, 0xd2, 0x78,
2540
+	0xeb, 0x58, 0xdd, 0xa3, 0x24, 0xa0, 0x21, 0xd5, 0xeb, 0x34, 0x42, 0x2a, 0x75, 0x1b, 0xd5, 0x73,
2541
+	0x8d, 0x98, 0x6a, 0xa8, 0x2d, 0xb5, 0xab, 0x0a, 0xe9, 0xdb, 0xa8, 0x06, 0xb5, 0x68, 0xb0, 0xd9,
2542
+	0x9e, 0xbf, 0x21, 0xd8, 0xab, 0x8d, 0xac, 0xab, 0xd3, 0x89, 0x7d, 0x91, 0x5c, 0x3e, 0x6f, 0xd1,
2543
+	0xcf, 0x32, 0xec, 0x8c, 0x6c, 0xdf, 0xb1, 0xcc, 0x0b, 0x33, 0xa0, 0x06, 0x73, 0x4d, 0x5e, 0xe7,
2544
+	0x97, 0xde, 0xec, 0x03, 0x89, 0x6b, 0x87, 0x8c, 0x9c, 0x66, 0x7b, 0x89, 0xeb, 0x45, 0xd8, 0x76,
2545
+	0xc9, 0xc4, 0x72, 0x88, 0xc1, 0x5e, 0x79, 0x51, 0x4f, 0xa6, 0xca, 0xb7, 0x08, 0xf6, 0xea, 0xce,
2546
+	0xd0, 0x75, 0x46, 0xb6, 0x91, 0xd4, 0xd4, 0x80, 0xfc, 0x30, 0x1a, 0xfa, 0x22, 0x62, 0x8d, 0x55,
2547
+	0xe1, 0xdc, 0xbe, 0x41, 0x57, 0x4f, 0xcd, 0xa1, 0x6b, 0xd1, 0x78, 0xa6, 0x2f, 0x7f, 0x29, 0x3d,
2548
+	0x81, 0xdd, 0xb5, 0xad, 0x30, 0x89, 0x4e, 0x9c, 0x04, 0x8a, 0x92, 0x88, 0xa7, 0x87, 0x3f, 0xa7,
2549
+	0x60, 0x87, 0xbb, 0xab, 0xf1, 0x87, 0xbc, 0x21, 0xd8, 0xf5, 0xc4, 0xed, 0x26, 0x6e, 0xa8, 0xc2,
2550
+	0xae, 0xa6, 0x76, 0x3f, 0x6f, 0xeb, 0xcf, 0xfb, 0xea, 0x99, 0xaa, 0x75, 0x05, 0x14, 0x1d, 0xda,
2551
+	0x1c, 0xba, 0x76, 0x5f, 0x1d, 0xc2, 0x4e, 0xf7, 0xa4, 0xd6, 0x52, 0x63, 0x3a, 0x3e, 0x96, 0x39,
2552
+	0x9a, 0xeb, 0xf5, 0x03, 0x28, 0x74, 0x7a, 0xa7, 0x9f, 0xf5, 0x3b, 0xbd, 0x56, 0x4b, 0x48, 0x4b,
2553
+	0xf7, 0xa7, 0x33, 0xf9, 0x0e, 0x47, 0x2e, 0x4f, 0xb3, 0x03, 0x28, 0xd4, 0x7a, 0xad, 0xe7, 0xfd,
2554
+	0xd3, 0x2f, 0xb4, 0xba, 0x90, 0xb9, 0xc1, 0x25, 0x66, 0xc1, 0x8f, 0x21, 0x5f, 0x6f, 0xbf, 0xe8,
2555
+	0xb4, 0x7b, 0x5a, 0x43, 0xc8, 0xde, 0xc0, 0x12, 0x45, 0x71, 0x05, 0x40, 0x6b, 0x37, 0x92, 0x0c,
2556
+	0x73, 0x91, 0x31, 0xf9, 0x7a, 0x92, 0x4b, 0x5a, 0xba, 0x13, 0x1b, 0x93, 0x97, 0xad, 0x26, 0xfe,
2557
+	0x7e, 0x5d, 0xda, 0xfa, 0xeb, 0xba, 0x84, 0xbe, 0x59, 0x94, 0xd0, 0xeb, 0x45, 0x09, 0xfd, 0xba,
2558
+	0x28, 0xa1, 0x3f, 0x17, 0x25, 0x74, 0x9e, 0x63, 0x7f, 0x9d, 0x9e, 0xfe, 0x1d, 0x00, 0x00, 0xff,
2559
+	0xff, 0x92, 0x82, 0xdb, 0x1a, 0x6e, 0x09, 0x00, 0x00,
2554 2560
 }
... ...
@@ -109,7 +109,7 @@ message NetworkEntry {
109 109
 	// network event was recorded.
110 110
 	uint64 l_time = 2 [(gogoproto.customtype) = "github.com/hashicorp/serf/serf.LamportTime", (gogoproto.nullable) = false];
111 111
 	// Source node name where this network attachment happened.
112
-	string node_name = 3;
112
+	string node_name = 3 [(gogoproto.customname) = "NodeName"];
113 113
 	// Indicates if a leave from this network is in progress.
114 114
 	bool leaving = 4;
115 115
 }
... ...
@@ -119,6 +119,8 @@ message NetworkPushPull {
119 119
 	// Lamport time when this push pull was initiated.
120 120
 	uint64 l_time = 1 [(gogoproto.customtype) = "github.com/hashicorp/serf/serf.LamportTime", (gogoproto.nullable) = false];
121 121
 	repeated NetworkEntry networks = 2;
122
+	// Name of the node sending this push pull payload.
123
+	string node_name = 3 [(gogoproto.customname) = "NodeName"];
122 124
 }
123 125
 
124 126
 // TableEvent message payload definition.
... ...
@@ -152,6 +154,8 @@ message TableEvent {
152 152
 	string key = 6;
153 153
 	// Entry value.
154 154
 	bytes value = 7;
155
+	// Residual reap time for the entry before getting deleted in seconds
156
+	int32 residual_reap_time = 8 [(gogoproto.customname) = "ResidualReapTime"];;
155 157
 }
156 158
 
157 159
 // BulkSync message payload definition.
... ...
@@ -180,4 +184,4 @@ message CompoundMessage {
180 180
 
181 181
 	// A list of simple messages.
182 182
 	repeated SimpleMessage messages = 1;
183
-}
184 183
\ No newline at end of file
184
+}
... ...
@@ -67,11 +67,7 @@ func (sb *sandbox) setupResolutionFiles() error {
67 67
 		return err
68 68
 	}
69 69
 
70
-	if err := sb.setupDNS(); err != nil {
71
-		return err
72
-	}
73
-
74
-	return nil
70
+	return sb.setupDNS()
75 71
 }
76 72
 
77 73
 func (sb *sandbox) buildHostsFile() error {