mirror of
https://github.com/logos-storage/swarmsim.git
synced 2026-01-07 16:23:09 +00:00
refactor engine loop
This commit is contained in:
parent
7548c545f8
commit
614d372e52
@ -16,13 +16,13 @@ type
|
|||||||
PeerDescriptor* = ref object of RootObj
|
PeerDescriptor* = ref object of RootObj
|
||||||
peerId*: int
|
peerId*: int
|
||||||
lastSeen*: uint64
|
lastSeen*: uint64
|
||||||
expiry: AwaitableHandle
|
expiryTimer: AwaitableHandle
|
||||||
|
|
||||||
type ArrayShuffler = proc (arr: var seq[PeerDescriptor]): void
|
type ArrayShuffler = proc (arr: var seq[PeerDescriptor]): void
|
||||||
|
|
||||||
type
|
type
|
||||||
DHTTracker* = ref object of Protocol
|
DHTTracker* = ref object of Protocol
|
||||||
expiry*: Duration
|
expiryTimer*: Duration
|
||||||
maxPeers*: uint
|
maxPeers*: uint
|
||||||
peers: OrderedTable[int, PeerDescriptor]
|
peers: OrderedTable[int, PeerDescriptor]
|
||||||
shuffler: ArrayShuffler
|
shuffler: ArrayShuffler
|
||||||
@ -33,7 +33,7 @@ type
|
|||||||
SampleSwarm* = ref object of Message
|
SampleSwarm* = ref object of Message
|
||||||
numPeers: uint
|
numPeers: uint
|
||||||
|
|
||||||
PeerExpiry* = ref object of SchedulableEvent
|
ExpiryTimer* = ref object of SchedulableEvent
|
||||||
peerId*: int
|
peerId*: int
|
||||||
tracker: DHTTracker
|
tracker: DHTTracker
|
||||||
|
|
||||||
@ -48,11 +48,11 @@ proc new*(
|
|||||||
T: type DHTTracker,
|
T: type DHTTracker,
|
||||||
maxPeers: uint,
|
maxPeers: uint,
|
||||||
shuffler: ArrayShuffler = RandomShuffler,
|
shuffler: ArrayShuffler = RandomShuffler,
|
||||||
expiry: Duration = DHTTracker.defaultExpiry,
|
expiryTimer: Duration = DHTTracker.defaultExpiry,
|
||||||
): DHTTracker =
|
): DHTTracker =
|
||||||
DHTTracker(
|
DHTTracker(
|
||||||
# This should in general be safe as those are always positive.
|
# This should in general be safe as those are always positive.
|
||||||
expiry: expiry,
|
expiryTimer: expiryTimer,
|
||||||
maxPeers: maxPeers,
|
maxPeers: maxPeers,
|
||||||
shuffler: shuffler,
|
shuffler: shuffler,
|
||||||
peers: initOrderedTable[int, PeerDescriptor](),
|
peers: initOrderedTable[int, PeerDescriptor](),
|
||||||
@ -61,6 +61,19 @@ proc new*(
|
|||||||
|
|
||||||
proc peers*(self: DHTTracker): seq[PeerDescriptor] = self.peers.values.toSeq()
|
proc peers*(self: DHTTracker): seq[PeerDescriptor] = self.peers.values.toSeq()
|
||||||
|
|
||||||
|
proc cancelExpiryTimer(self: DHTTracker, peerId: int) =
|
||||||
|
self.peers[peerId].expiryTimer.schedulable.cancel()
|
||||||
|
|
||||||
|
proc createExpiryTimer(self: DHTTracker, peerId: int,
|
||||||
|
engine: EventDrivenEngine): AwaitableHandle =
|
||||||
|
let expiryTimer = ExpiryTimer(
|
||||||
|
peerId: peerId,
|
||||||
|
tracker: self,
|
||||||
|
time: engine.currentTime + uint64(self.expiryTimer.inSeconds())
|
||||||
|
)
|
||||||
|
|
||||||
|
engine.awaitableSchedule(expiryTimer)
|
||||||
|
|
||||||
proc oldestInsertion(self: DHTTracker): int =
|
proc oldestInsertion(self: DHTTracker): int =
|
||||||
# We maintain the invariant that the first element to have been inserted
|
# We maintain the invariant that the first element to have been inserted
|
||||||
# must be the oldest. We can therefore return the first element in the
|
# must be the oldest. We can therefore return the first element in the
|
||||||
@ -74,27 +87,20 @@ proc addPeer(self: DHTTracker, message: PeerAnnouncement,
|
|||||||
let peerId = message.peerId
|
let peerId = message.peerId
|
||||||
|
|
||||||
if peerId in self.peers:
|
if peerId in self.peers:
|
||||||
self.peers[peerId].expiry.schedulable.cancel()
|
self.cancelExpiryTimer(peerId)
|
||||||
|
|
||||||
elif uint(len(self.peers)) == self.maxPeers:
|
elif uint(len(self.peers)) == self.maxPeers:
|
||||||
let oldest = self.oldestInsertion()
|
let oldest = self.oldestInsertion()
|
||||||
self.peers[oldest].expiry.schedulable.cancel()
|
self.cancelExpiryTimer(oldest)
|
||||||
self.peers.del(oldest)
|
self.peers.del(oldest)
|
||||||
|
|
||||||
let expiry = PeerExpiry(
|
self.peers[peerId] = PeerDescriptor(
|
||||||
peerId: message.peerId,
|
|
||||||
tracker: self,
|
|
||||||
time: engine.currentTime + uint64(self.expiry.inSeconds())
|
|
||||||
)
|
|
||||||
|
|
||||||
let descriptor = PeerDescriptor(
|
|
||||||
peerId: message.peerId,
|
peerId: message.peerId,
|
||||||
lastSeen: engine.currentTime,
|
lastSeen: engine.currentTime,
|
||||||
expiry: engine.awaitableSchedule(expiry))
|
expiryTimer: self.createExpiryTimer(peerId, engine)
|
||||||
|
)
|
||||||
|
|
||||||
self.peers[peerId] = descriptor
|
method atScheduledTime*(self: ExpiryTimer, engine: EventDrivenEngine): void =
|
||||||
|
|
||||||
method atScheduledTime*(self: PeerExpiry, engine: EventDrivenEngine): void =
|
|
||||||
self.tracker.peers.del(self.peerId)
|
self.tracker.peers.del(self.peerId)
|
||||||
|
|
||||||
proc sampleSwarm(self: DHTTracker, message: SampleSwarm, network: Network) =
|
proc sampleSwarm(self: DHTTracker, message: SampleSwarm, network: Network) =
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user