Short-circuit the initial catchup message from the left, so that we are sure we receive it before we consider ourselves joined.
Abstract the initial catchup into its own function. Make sure we call check_neighbours beforehand, since that sets left and right.
First go at some PropEr tests, which join and leave a group, and make sure messages don't get lost.
Merge bug26210
Instrument certain calls to gs2:call/3 and gs2:cast/2, and allow PropEr to determine when they proceed. That makes things a lot more deterministic (although not fully) and lets us reproduce bug 26171 (small whoop).
Don't be so intrusive into gm.erl.
Oops.
Do "randomness" properly, trap exits.
Merge in stable
Better cleanup
Merge in bug24929
Even better
Don't explode if the pid vanishes during is_gm_process/2. Keep on handling instrumented msgs while we are waiting for things to shut down, so that... they can.
Don't expect message delivery until we have had the joined callback invoked.
Oops, 3d7b7d85df74 got us into a degenerate case where our tests only ever consisted of joins.
Wait until a GM has actually left before forgetting it.
Be more correct about dynamic vs symbolic state; this gets us back into a position where we are actually testing sending messages :-/
Various bug fixes in generating command sequences.
Track connection timestamps
Format connected_at info item