74 lines
1.9 KiB
Kotlin
74 lines
1.9 KiB
Kotlin
package drills.drill09.gossip
|
|
|
|
import util.network.epidemic.EpidemicNode
|
|
import util.network.epidemic.packet.EpidemicPacket
|
|
import util.network.epidemic.packet.FeedbackEpidemicPacket
|
|
import util.network.simulator.Address
|
|
import util.network.simulator.Network
|
|
import kotlin.random.Random
|
|
|
|
class QueryNode<T>(
|
|
address: Address,
|
|
network: Network,
|
|
initialValue: T,
|
|
bufferSize: Int = 1
|
|
) : EpidemicNode<T, FeedbackEpidemicPacket<T>>(
|
|
address, network, initialValue, bufferSize
|
|
) {
|
|
private var queryValue: T = nodeValue
|
|
private var random = Random(System.currentTimeMillis())
|
|
|
|
override fun makeInfectionPacket(
|
|
receiverAddress: Address,
|
|
type: EpidemicPacket.Type
|
|
): EpidemicPacket<T> {
|
|
return FeedbackEpidemicPacket(
|
|
address,
|
|
receiverAddress,
|
|
queryValue,
|
|
type,
|
|
false
|
|
)
|
|
}
|
|
|
|
override fun receivePushOrReply(packet: FeedbackEpidemicPacket<T>) {
|
|
//println(packet)
|
|
if (nodeState == State.REMOVED)
|
|
return
|
|
|
|
if (nodeState == State.SUSCEPTIBLE) {
|
|
// println("susceptible")
|
|
nodeState = State.INFECTED
|
|
|
|
queryValue = packet.payload
|
|
sendPush(1)
|
|
|
|
if (packet.payload == nodeValue)
|
|
println("find on node $address")
|
|
} else {
|
|
if (packet.isFeedback && random.nextBoolean()) {
|
|
nodeState = State.REMOVED
|
|
println("removed")
|
|
|
|
}
|
|
|
|
send(
|
|
FeedbackEpidemicPacket(
|
|
address,
|
|
packet.senderAddress,
|
|
queryValue,
|
|
EpidemicPacket.Type.PUSH,
|
|
true
|
|
)
|
|
)
|
|
}
|
|
}
|
|
|
|
override fun receivePull(packet: FeedbackEpidemicPacket<T>) {
|
|
TODO("Not yet implemented")
|
|
}
|
|
|
|
override fun infect() {
|
|
Thread.interrupted()
|
|
}
|
|
} |