For non-shared stores, we need a graceful restart to make sure each node receives the exact same segments after restart, and that keys aren't readable/writable until re recover all the segments.
With a shared store, however, we could replace the implicit preload with an explicit preload that can be called by the user after the cluster is fully formed.
Currently, preloading happens before the cache is a full member of the cluster, so it wants to load every key on every node. In a large cluster, that means most of the keys loaded by preload will be discarded as it joins and finds out it owns only a tiny slice of the data.
Preloaded values might be out of date before the node becomes a full member (because writes on the existing nodes will update the shared store, but not the joiner's in-memory data). The only way to avoid that is to delete everything that was preloaded on join, meaning even more lost work.