in distributed-data/src/multi-jvm/scala/org/apache/pekko/cluster/ddata/ReplicatorMapDeltaSpec.scala [88:178]
def generateOperations(onNode: RoleName): Vector[Op] = {
val rnd = ThreadLocalRandom.current()
def consistency(): WriteConsistency = {
rnd.nextInt(100) match {
case n if n < 90 => WriteLocal
case n if n < 95 => writeTwo
case n if n < 100 => writeMajority
}
}
def rndPnCounterkey(): (PNCounterMapKey[String], String) = {
rnd.nextInt(3) match {
case 0 => KeyA
case 1 => KeyB
case 2 => KeyC
}
}
def rndOrSetkeyVD(): (ORMultiMapKey[String, String], String) = {
rnd.nextInt(3) match {
case 0 => KeyD
case 1 => KeyE
case 2 => KeyF
}
}
def rndOrSetkeyNoVD(): (ORMultiMapKey[String, String], String) = {
rnd.nextInt(3) match {
case 0 => KeyG
case 1 => KeyH
case 2 => KeyI
}
}
def rndOrSetkeyOM(): (ORMapKey[String, ORSet[String]], String) = {
rnd.nextInt(3) match {
case 0 => KeyJ
case 1 => KeyK
case 2 => KeyL
}
}
var availableForRemove = Set.empty[String]
def rndAddElement(): String = {
// lower case a - j
val s = (97 + rnd.nextInt(10)).toChar.toString
availableForRemove += s
s
}
def rndRemoveElement(): String = {
if (availableForRemove.isEmpty)
"a"
else
availableForRemove.toVector(rnd.nextInt(availableForRemove.size))
}
(0 to (50 + rnd.nextInt(10))).map { _ =>
rnd.nextInt(6) match {
case 0 => Delay(rnd.nextInt(500))
case 1 => Incr(rndPnCounterkey(), rnd.nextInt(100), consistency())
case 2 => Decr(rndPnCounterkey(), rnd.nextInt(10), consistency())
case 3 =>
// ORMultiMap.withValueDeltas
val key = rndOrSetkeyVD()
// only removals for KeyF on node first
if (key == KeyF && onNode == first && rnd.nextBoolean())
RemoveVD(key, rndRemoveElement(), consistency())
else
AddVD(key, rndAddElement(), consistency())
case 4 =>
// ORMultiMap - vanilla variant - without Value Deltas
val key = rndOrSetkeyNoVD()
// only removals for KeyI on node first
if (key == KeyI && onNode == first && rnd.nextBoolean())
RemoveNoVD(key, rndRemoveElement(), consistency())
else
AddNoVD(key, rndAddElement(), consistency())
case 5 =>
// Vanilla ORMap - with ORSet inside
val key = rndOrSetkeyOM()
// only removals for KeyL on node first
if (key == KeyL && onNode == first && rnd.nextBoolean())
RemoveOM(key, rndRemoveElement(), consistency())
else
AddOM(key, rndAddElement(), consistency())
}
}.toVector
}