|
| 1 | +--------------------------- MODULE DoubledBigTest ------------------------------ |
| 2 | +EXTENDS storage, utils |
| 3 | + |
| 4 | +CONSTANTS b1, b2, b3, b4 |
| 5 | + |
| 6 | +StoragesC == {"s1", "s2", "s3", "s4"} |
| 7 | +ReplicaSetsC == {"rs1", "rs2", "rs3"} |
| 8 | +BucketIdsC == {b1, b2, b3, b4} |
| 9 | +StorageAssignmentsC == [rs1 |-> {"s1", "s2"}, |
| 10 | + rs2 |-> {"s3"}, |
| 11 | + rs3 |-> {"s4"}] |
| 12 | +BucketAssignmentsC == [rs1 |-> {b1}, |
| 13 | + rs2 |-> {b2}, |
| 14 | + rs3 |-> {b3, b4}] |
| 15 | +MasterAssignmentsC == [rs1 |-> {"s1"}, |
| 16 | + rs2 |-> {"s3"}, |
| 17 | + rs3 |-> {"s4"}] |
| 18 | + |
| 19 | +(***************************************************************************) |
| 20 | +(* CONSTRAINTS *) |
| 21 | +(***************************************************************************) |
| 22 | + |
| 23 | +MAX_TOTAL_SENDS == 3 |
| 24 | + |
| 25 | +\* 1. Limit total bucket sends - prevent endless transfers. |
| 26 | +SendLimitConstraint == |
| 27 | + LET totalSends == |
| 28 | + SetSum({ storages[i].errinj.bucketSendCount : i \in StoragesC }) |
| 29 | + IN totalSends =< MAX_TOTAL_SENDS |
| 30 | + |
| 31 | +\* 2. Keep network bounded - avoid message explosion. |
| 32 | +NetworkBoundConstraint == |
| 33 | + /\ \A s1, s2 \in StoragesC : |
| 34 | + Len(network[s1][s2]) =< 3 |
| 35 | + /\ \A s \in StoragesC : |
| 36 | + /\ storages[s].errinj.networkReorderCount <= 2 |
| 37 | + /\ storages[s].errinj.networkDropCount <= 2 |
| 38 | + |
| 39 | +RefConstraint == |
| 40 | + \A s1 \in StoragesC : |
| 41 | + /\ storages[s1].errinj.bucketRWRefCount <= 2 |
| 42 | + /\ storages[s1].errinj.bucketRORefCount <= 2 |
| 43 | + /\ storages[s1].errinj.bucketRWUnRefCount <= 2 |
| 44 | + /\ storages[s1].errinj.bucketROUnRefCount <= 2 |
| 45 | + |
| 46 | +(***************************************************************************) |
| 47 | +(* SYMMETRY *) |
| 48 | +(***************************************************************************) |
| 49 | + |
| 50 | +Symmetry == |
| 51 | + Permutations(BucketIdsC) |
| 52 | + |
| 53 | +(***************************************************************************) |
| 54 | +(* STATE INVARIANTS *) |
| 55 | +(***************************************************************************) |
| 56 | + |
| 57 | +NoActiveSimultaneousInv == |
| 58 | + \* No bucket can be ACTIVE in storages belonging to different ReplicaSets |
| 59 | + \A b \in BucketIds : |
| 60 | + \A rs1, rs2 \in ReplicaSets : |
| 61 | + rs1 # rs2 => |
| 62 | + ~(\E s1, s2 \in Storages : |
| 63 | + storageToReplicaset[s1] = rs1 /\ |
| 64 | + storageToReplicaset[s2] = rs2 /\ |
| 65 | + storages[s1].status = "master" /\ |
| 66 | + storages[s2].status = "master" /\ |
| 67 | + storages[s1].buckets[b].status = "ACTIVE" /\ |
| 68 | + storages[s2].buckets[b].status = "ACTIVE") |
| 69 | + |
| 70 | +================================================================================ |
0 commit comments