85 lines
2.5 KiB
Kotlin
85 lines
2.5 KiB
Kotlin
package drills.drill09.dbreplica
|
|
|
|
import util.network.epidemic.TimedPayload
|
|
import util.network.epidemic.EpidemicNode
|
|
import util.network.epidemic.packet.EpidemicPacket
|
|
import util.network.epidemic.packet.TimedEpidemicPacket
|
|
import util.network.simulator.Address
|
|
import util.network.simulator.Network
|
|
|
|
class DbNode<T>(
|
|
address: Address,
|
|
network: Network,
|
|
initialValue: TimedPayload<T>,
|
|
val infectStrategy: InfectStrategy = InfectStrategy.PUSHPULL,
|
|
bufferSize: Int = 1
|
|
) : EpidemicNode<TimedPayload<T>, TimedEpidemicPacket<T>>(
|
|
address, network, initialValue, bufferSize
|
|
) {
|
|
override fun receivePushOrReply(packet: TimedEpidemicPacket<T>) {
|
|
val receivedValue = packet.payload
|
|
|
|
if (nodeValue.timestamp < receivedValue.timestamp)
|
|
changeValue(receivedValue)
|
|
}
|
|
|
|
override fun receivePull(packet: TimedEpidemicPacket<T>) {
|
|
val receivedValue = packet.payload
|
|
|
|
if (nodeValue.timestamp > receivedValue.timestamp)
|
|
send(
|
|
makeInfectionPacket(
|
|
packet.senderAddress,
|
|
EpidemicPacket.Type.REPLY
|
|
)
|
|
)
|
|
}
|
|
|
|
override fun infect() {
|
|
when (infectStrategy) {
|
|
InfectStrategy.PUSH -> sendPushToRandom()
|
|
InfectStrategy.PULL -> sendPullToRandom()
|
|
InfectStrategy.PUSHPULL -> sendPushPullToRandom()
|
|
}
|
|
|
|
Thread.sleep(DELTA)
|
|
}
|
|
|
|
override fun makeInfectionPacket(
|
|
receiverAddress: Address,
|
|
type: EpidemicPacket.Type
|
|
): EpidemicPacket<TimedPayload<T>> {
|
|
return TimedEpidemicPacket(
|
|
address,
|
|
receiverAddress,
|
|
nodeValue,
|
|
type
|
|
)
|
|
}
|
|
|
|
companion object {
|
|
const val DELTA = 100L
|
|
|
|
fun <T> createPushNode(
|
|
address: Address,
|
|
network: Network,
|
|
initialValue: TimedPayload<T>,
|
|
bufferSize: Int = 1
|
|
) = DbNode(address, network, initialValue, InfectStrategy.PUSH, bufferSize)
|
|
|
|
fun <T> createPullNode(
|
|
address: Address,
|
|
network: Network,
|
|
initialValue: TimedPayload<T>,
|
|
bufferSize: Int = 1
|
|
) = DbNode(address, network, initialValue, InfectStrategy.PULL, bufferSize)
|
|
|
|
fun <T> createPushPullNode(
|
|
address: Address,
|
|
network: Network,
|
|
initialValue: TimedPayload<T>,
|
|
bufferSize: Int = 1
|
|
) = DbNode(address, network, initialValue, InfectStrategy.PUSHPULL, bufferSize)
|
|
}
|
|
}
|