Browse code

Fix reapTime logic in NetworkDB

- Added remainingReapTime field in the table event.
Wihtout it a node that did not have a state for the element
was marking the element for deletion setting the max reapTime.
This was creating the possibility to keep the entry being resync
between nodes forever avoding the purpose of the reap time
itself.

- On broadcast of the table event the node owner was rewritten
with the local node name, this was not correct because the owner
should continue to remain the original one of the message

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

Flavio Crisciani authored on 2017/09/20 05:42:35
Showing 8 changed files
... ...
@@ -38,3 +38,4 @@ cmd/dnet/dnet
38 38
 
39 39
 libnetworkbuild.created
40 40
 test/networkDb/testMain
41
+test/networkDb/gossipdb
... ...
@@ -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)
... ...
@@ -349,11 +349,11 @@ func (nDB *NetworkDB) reapTableEntries() {
349 349
 		nid := params[1]
350 350
 		key := params[2]
351 351
 
352
-		if _, ok := nDB.indexes[byTable].Delete(fmt.Sprintf("/%s/%s/%s", tname, nid, key)); !ok {
352
+		okTable, okNetwork := nDB.deleteEntry(nid, tname, key)
353
+		if !okTable {
353 354
 			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 355
 		}
355
-
356
-		if _, ok := nDB.indexes[byNetwork].Delete(fmt.Sprintf("/%s/%s/%s", nid, tname, key)); !ok {
356
+		if !okNetwork {
357 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 358
 		}
359 359
 	}
... ...
@@ -406,8 +406,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 - net:%s Entries:%d Queue  qLen:%d netPeers:%d netMsg/s:%d",
410
+				nid, network.entriesNumber, broadcastQ.NumQueued(), broadcastQ.NumNodes(),
411
+				network.qMessagesSent/int((nDB.config.StatsPrintPeriod/time.Second)))
411 412
 			network.qMessagesSent = 0
412 413
 		}
413 414
 
... ...
@@ -572,6 +573,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"
... ...
@@ -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
+	// All the entries marked for deletion should have a reapTime set greater than 0
242
+	// This case can happens if the cluster is running different versions of the engine where the old version does not have the
243
+	// field. In both cases we should raise a warning message
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)
241 246
 		e.reapTime = reapInterval
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 than 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
... ...
@@ -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
... ...
@@ -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()
... ...
@@ -679,3 +684,29 @@ 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 := nDB.networks[nDB.config.NodeName][nid]
691
+		n.entriesNumber++
692
+	}
693
+	return okTable, okNetwork
694
+}
695
+
696
+// deleteEntry this function handles the deletion of entries into the local tree store.
697
+// It is also used to keep in sync the entries number of the network (all tables are aggregated)
698
+func (nDB *NetworkDB) deleteEntry(nid, tname, key string) (bool, bool) {
699
+	_, okTable := nDB.indexes[byTable].Delete(fmt.Sprintf("/%s/%s/%s", tname, nid, key))
700
+	_, okNetwork := nDB.indexes[byNetwork].Delete(fmt.Sprintf("/%s/%s/%s", nid, tname, key))
701
+	if okNetwork {
702
+		// Remove only if the delete is successful
703
+		n := nDB.networks[nDB.config.NodeName][nid]
704
+		n.entriesNumber--
705
+	}
706
+	return okTable, okNetwork
707
+}
... ...
@@ -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
+}
... ...
@@ -1,7 +1,7 @@
1 1
 SERVER
2 2
 
3 3
 cd test/networkdb
4
-env GOOS=linux go build -v server/ndbTester.go && docker build -t fcrisciani/networkdb-test -f server/Dockerfile .
4
+env GOOS=linux go build -v server/testMain.go && docker build -t fcrisciani/networkdb-test .
5 5
 (only for testkit case) docker push fcrisciani/networkdb-test
6 6
 
7 7
 Run server: docker service create --name testdb --network net1 --replicas 3 --env TASK_ID="{{.Task.ID}}" -p mode=host,target=8000 fcrisciani/networkdb-test server 8000