And waits for them. That's pointless.
const String & part_name, const String & zookeeper_path_, zkutil::ZooKeeper::Ptr zookeeper_)
{
    Strings replicas = zookeeper_->getChildren(fs::path(zookeeper_path_) / "replicas");
    
    std::shuffle(replicas.begin(), replicas.end(), thread_local_rng);
    for (const String & replica : replicas)
    {
        if (zookeeper_->exists(fs::path(zookeeper_path_) / "replicas" / replica / "parts" / part_name)
            && zookeeper_->exists(fs::path(zookeeper_path_) / "replicas" / replica / "is_active"))
            return fs::path(zookeeper_path_) / "replicas" / replica;
    }
    return {};
}
bool StorageReplicatedMergeTree::checkIfDetachedPartExists(const String & part_name)