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

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)
}
}