@Test
  public void testTransmitCrashedMembers() throws Exception {
    for (VM vm : toArray(vm0, vm1)) {
      vm.invoke(() -> createReplicateRegion(regionName, getDiskDirs(getVMId())));
    }

    vm0.invoke(() -> {
      putEntry("A", "B");
      getCache().getRegion(regionName).close();
    });

    // VM 2 should be told about the fact that VM1 has crashed.
    vm2.invoke(() -> createReplicateRegion(regionName, getDiskDirs(getVMId())));

    vm1.invoke(() -> {
      updateEntry("A", "C");
      getCache().getRegion(regionName).close();
    });

    vm2.invoke(() -> getCache().getRegion(regionName).close());

    // This ought to wait for VM1 to come back
    AsyncInvocation<Void> createPersistentRegionInVM0 = vm0.invokeAsync(() -> {
      createReplicateRegion(regionName, getDiskDirs(getVMId()));
    });
    vm0.invoke(this::waitForBlockedInitialization);
    assertThat(createPersistentRegionInVM0.isAlive()).isTrue();

    // VM2 has the most recent data, it should start
    vm2.invoke(() -> createReplicateRegion(regionName, getDiskDirs(getVMId())));

    // VM0 should be informed that VM2 is older, so it should start
    createPersistentRegionInVM0.await();

    for (VM vm : toArray(vm0, vm2)) {
      vm.invoke(() -> validateEntry("A", "C"));
    }
  }
Tests that persistent members pass along the list of crashed members to later persistent
members. Eg. AB are running A crashes C is tarted B crashes C crashes AC are started, they
should figure out who has the latest data, without needing B.
geode-core/src/distributedTest/java/org/apache/geode/internal/cache/persistence/PersistentRecoveryOrderDUnitTest.java