lm-sistemi-software-distrib.../src/main/kotlin/drills/drill09/dbreplica/DbNode.kt

54 lines
1.4 KiB
Kotlin

package drills.drill09.dbreplica
import util.network.epidemic.TimePayload
import util.network.epidemic.EpidemicNode
import util.network.epidemic.EpidemicPacket
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 makeInfectionPacket(
receiverAddress: Address,
type: EpidemicPacket.Type
): EpidemicPacket<TimePayload<T>> {
return EpidemicPacket(
address,
receiverAddress,
nodeValue,
type
)
}
}