-
Notifications
You must be signed in to change notification settings - Fork 0
/
Gossip.fs
45 lines (34 loc) · 1.19 KB
/
Gossip.fs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
module Gossip
open System
open Akka.Actor
open Akka.FSharp
let mutable actorRef : IActorRef list = []
let startGossip (actorRefArr: IActorRef[]) rumor =
let median = (actorRefArr.Length-1)/2
// fill actorRef with all actors in network for lookups
for i in 0..actorRefArr.Length-1 do
actorRef <- actorRef @ [actorRefArr.[i]]
Console.WriteLine("Sending initial rumor...")
actorRef.[median] <! rumor
let getRandNum min max =
let rand = Random()
rand.Next(min, max)
let gossipSend (neighbors: int[]) rumor =
let index = getRandNum 0 neighbors.Length
let target = actorRef.[neighbors.[index]]
target <! rumor
let gossipActor (neighbors: int[]) (mailbox : Actor<'a>) =
let mutable counter = 0
let rec loop () =
actor {
let! msg = mailbox.Receive()
gossipSend neighbors msg
counter <- counter + 1
// terminate actor if rumor has been heard 10 times
if counter < 50 then
// let listener know this node has heard the rumor
if counter = 1 then
mailbox.Context.Parent <! msg
return! loop()
}
loop()