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( address: Address, network: Network, initialValue: TimedPayload, val infectStrategy: InfectStrategy = InfectStrategy.PUSHPULL, bufferSize: Int = 1 ) : EpidemicNode, TimedEpidemicPacket>( address, network, initialValue, bufferSize ) { override fun receivePushOrReply(packet: TimedEpidemicPacket) { val receivedValue = packet.payload if (nodeValue.timestamp < receivedValue.timestamp) changeValue(receivedValue) } override fun receivePull(packet: TimedEpidemicPacket) { 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> { return TimedEpidemicPacket( address, receiverAddress, nodeValue, type ) } companion object { const val DELTA = 100L fun createPushNode( address: Address, network: Network, initialValue: TimedPayload, bufferSize: Int = 1 ) = DbNode(address, network, initialValue, InfectStrategy.PUSH, bufferSize) fun createPullNode( address: Address, network: Network, initialValue: TimedPayload, bufferSize: Int = 1 ) = DbNode(address, network, initialValue, InfectStrategy.PULL, bufferSize) fun createPushPullNode( address: Address, network: Network, initialValue: TimedPayload, bufferSize: Int = 1 ) = DbNode(address, network, initialValue, InfectStrategy.PUSHPULL, bufferSize) } }