52 lines
1.5 KiB
Kotlin
52 lines
1.5 KiB
Kotlin
package util.network.epidemic.consinstence
|
|
|
|
import util.network.epidemic.TimePayload
|
|
import util.network.epidemic.EpidemicNode
|
|
import util.network.epidemic.EpidemicPacket
|
|
import util.network.epidemic.EpidemicPacketPrototype
|
|
import util.network.epidemic.replay.ReplayPacketPrototype
|
|
import util.network.simulator.Address
|
|
import util.network.simulator.Network
|
|
|
|
class DbNode<T>(
|
|
address: Address,
|
|
network: Network,
|
|
initialValue: TimePayload<T>,
|
|
bufferSize: Int = 1
|
|
) : EpidemicNode<TimePayload<T>, EpidemicPacket<TimePayload<T>>>(
|
|
address, network, initialValue, bufferSize
|
|
) {
|
|
override fun receivePushOrReply(packet: EpidemicPacket<TimePayload<T>>) {
|
|
val receivedValue = packet.payload
|
|
|
|
if (nodeValue.timestamp < receivedValue.timestamp)
|
|
changeValue(receivedValue)
|
|
}
|
|
|
|
override fun receivePull(packet: EpidemicPacket<TimePayload<T>>) {
|
|
val receivedValue = packet.payload
|
|
|
|
if (nodeValue.timestamp > receivedValue.timestamp)
|
|
send(
|
|
EpidemicPacket(
|
|
address,
|
|
packet.senderAddress,
|
|
nodeValue,
|
|
EpidemicPacket.Type.REPLY
|
|
)
|
|
)
|
|
}
|
|
|
|
override fun infect() {
|
|
sendPushPull()
|
|
Thread.sleep(100)
|
|
}
|
|
|
|
override fun makeInfectionPrototypePacket(type: EpidemicPacket.Type): EpidemicPacketPrototype<TimePayload<T>> {
|
|
return EpidemicPacketPrototype(
|
|
address,
|
|
nodeValue,
|
|
type
|
|
)
|
|
}
|
|
} |