def METHOD_NAME(cluster: Cluster) -> None:
    # Start the validator and the first observer.  Wait until the observer
    # synchronises a few epoch’s worth of blocks to be generated and then kill
    # validator so no more blocks are generated.
    boot = cluster.start_node(0, boot_node=None)
    fred = cluster.start_node(1, boot_node=boot)
    utils.wait_for_blocks(fred, target=TARGET_HEIGHT, poll_interval=1)
    metrics = get_metrics('boot', boot)
    boot.kill()
    # We didn’t generate enough blocks to fill boot’s in-memory cache which
    # means all Fred’s requests should be served from it.
    assert_metrics(metrics, ('cache/ok',))
    # Restart Fred so that its cache is cleared.  Then start the second
    # observer, Barney, and wait for it to sync up.
    fred_blocks = get_all_blocks(fred)
    fred.kill(gentle=True)
    fred.start()
    barney = cluster.start_node(2, boot_node=fred)
    utils.wait_for_blocks(barney,
                          target=fred_blocks[-1].height,
                          poll_interval=1)
    barney_blocks = get_all_blocks(barney)
    if fred_blocks != barney_blocks:
        for f, b in zip(fred_blocks, barney_blocks):
            if f != b:
                logger.error(f'{f} != {b}')
        assert False
    # Since Fred’s in-memory cache is clear, all Barney’s requests are served
    # from storage.  Since DBCol::PartialChunks is garbage collected, some of the
    # requests are served from DBCol::Chunks.
    assert_metrics(get_metrics('fred', fred), (
        'chunk/ok',
        'partial/ok',
    ))