### Summary

If `run_once` is used on the block level and the first host in the play has failed (before the block is reached), then only the first tasks of the block gets executed.
After the first task of the block is done the play ends with the error: NO MORE HOSTS LEFT

Observations:
* run_once on single task functions as expected
* if another host fails than the first host the block with run_once functions as expected
* lowering the forks does not work around the issue
* the problem still happens if the block gets included (using include_tasks or include_role) after the first host has failed

This was first noticed in Ansible 2.15.0.
In previous Ansible versions 2.12.5 and 2.9.10 this functions as expected.

### Issue Type

Bug Report

### Component Name

blocks

### Ansible Version

```console
$ ansible --version
ansible [core 2.15.3]
  config file = /home/user/git/ansible-galaxy/ansible.cfg
  configured module search path = ['/home/user/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /home/user/venv_3.9/lib/python3.9/site-packages/ansible
  ansible collection location = /home/user/.ansible/collections:/usr/share/ansible/collections
  executable location = /home/user/venv_3.9/bin/ansible
  python version = 3.9.5 (default, Nov 23 2021, 15:27:38) [GCC 9.3.0] (/home/user/venv_3.9/bin/python3.9)
  jinja version = 3.1.2
  libyaml = True
```


### Configuration

```console
# if using a version older than ansible-core 2.12 you should omit the '-t all'
$ ansible-config dump --only-changed -t all
ANSIBLE_NOCOWS(/home/user/git/ansible-galaxy/ansible.cfg) = True
CACHE_PLUGIN(/home/user/git/ansible-galaxy/ansible.cfg) = memory
COLOR_CHANGED(/home/user/git/ansible-galaxy/ansible.cfg) = yellow
COLOR_DEBUG(/home/user/git/ansible-galaxy/ansible.cfg) = dark gray
COLOR_DEPRECATE(/home/user/git/ansible-galaxy/ansible.cfg) = purple
COLOR_DIFF_ADD(/home/user/git/ansible-galaxy/ansible.cfg) = green
COLOR_DIFF_LINES(/home/user/git/ansible-galaxy/ansible.cfg) = cyan
COLOR_DIFF_REMOVE(/home/user/git/ansible-galaxy/ansible.cfg) = red
COLOR_ERROR(/home/user/git/ansible-galaxy/ansible.cfg) = red
COLOR_HIGHLIGHT(/home/user/git/ansible-galaxy/ansible.cfg) = white
COLOR_OK(/home/user/git/ansible-galaxy/ansible.cfg) = green
COLOR_SKIP(/home/user/git/ansible-galaxy/ansible.cfg) = cyan
COLOR_UNREACHABLE(/home/user/git/ansible-galaxy/ansible.cfg) = red
COLOR_VERBOSE(/home/user/git/ansible-galaxy/ansible.cfg) = blue
COLOR_WARN(/home/user/git/ansible-galaxy/ansible.cfg) = bright purple
CONFIG_FILE() = /home/user/git/ansible-galaxy/ansible.cfg
DEFAULT_ASK_PASS(/home/user/git/ansible-galaxy/ansible.cfg) = False
DEFAULT_BECOME(/home/user/git/ansible-galaxy/ansible.cfg) = True
DEFAULT_BECOME_ASK_PASS(/home/user/git/ansible-galaxy/ansible.cfg) = False
DEFAULT_BECOME_METHOD(/home/user/git/ansible-galaxy/ansible.cfg) = 'sudo'
DEFAULT_BECOME_USER(/home/user/git/ansible-galaxy/ansible.cfg) = 'root'
DEFAULT_FORCE_HANDLERS(/home/user/git/ansible-galaxy/ansible.cfg) = True
DEFAULT_FORKS(/home/user/git/ansible-galaxy/ansible.cfg) = 40
DEFAULT_GATHERING(/home/user/git/ansible-galaxy/ansible.cfg) = implicit
DEFAULT_LOAD_CALLBACK_PLUGINS(/home/user/git/ansible-galaxy/ansible.cfg) = False
DEFAULT_MANAGED_STR(/home/user/git/ansible-galaxy/ansible.cfg) = %Y-%m-%d %H:%M
DEFAULT_MODULE_COMPRESSION(/home/user/git/ansible-galaxy/ansible.cfg) = 'ZIP_DEFLATED'
DEFAULT_MODULE_NAME(/home/user/git/ansible-galaxy/ansible.cfg) = command
DEFAULT_POLL_INTERVAL(/home/user/git/ansible-galaxy/ansible.cfg) = 15
DEFAULT_REMOTE_PORT(/home/user/git/ansible-galaxy/ansible.cfg) = 22
DEFAULT_REMOTE_USER(/home/user/git/ansible-galaxy/ansible.cfg) = user
DEFAULT_ROLES_PATH(/home/user/git/ansible-galaxy/ansible.cfg) = ['/home/user/git/ansible-galaxy/roles', '/home/user/git/ansible-galaxy/galaxy']
DEFAULT_TIMEOUT(/home/user/git/ansible-galaxy/ansible.cfg) = 20
DEFAULT_TRANSPORT(/home/user/git/ansible-galaxy/ansible.cfg) = smart
DEPRECATION_WARNINGS(/home/user/git/ansible-galaxy/ansible.cfg) = True
EDITOR(env: EDITOR) = vim
HOST_KEY_CHECKING(/home/user/git/ansible-galaxy/ansible.cfg) = False
MAX_FILE_SIZE_FOR_DIFF(/home/user/git/ansible-galaxy/ansible.cfg) = 1048576
RETRY_FILES_ENABLED(/home/user/git/ansible-galaxy/ansible.cfg) = False
SHOW_CUSTOM_STATS(/home/user/git/ansible-galaxy/ansible.cfg) = True
SYSTEM_WARNINGS(/home/user/git/ansible-galaxy/ansible.cfg) = True

BECOME:
======

runas:
_____
become_user(/home/user/git/ansible-galaxy/ansible.cfg) = 'root'

su:
__
become_user(/home/user/git/ansible-galaxy/ansible.cfg) = 'root'

sudo:
____
become_user(/home/user/git/ansible-galaxy/ansible.cfg) = 'root'

CALLBACK:
========

default:
_______
show_custom_stats(/home/user/git/ansible-galaxy/ansible.cfg) = True

CONNECTION:
==========

paramiko_ssh:
____________
host_key_checking(/home/user/git/ansible-galaxy/ansible.cfg) = False
port(/home/user/git/ansible-galaxy/ansible.cfg) = 22
pty(/home/user/git/ansible-galaxy/ansible.cfg) = False
remote_user(/home/user/git/ansible-galaxy/ansible.cfg) = user
ssh_args(/home/user/git/ansible-galaxy/ansible.cfg) = -o PasswordAuthentication=no -o ControlMaster=auto -o ControlPersist=60s
timeout(/home/user/git/ansible-galaxy/ansible.cfg) = 20

ssh:
___
control_path(/home/user/git/ansible-galaxy/ansible.cfg) = %(directory)s/ansi-%%h-%%p-%%r
host_key_checking(/home/user/git/ansible-galaxy/ansible.cfg) = False
pipelining(/home/user/git/ansible-galaxy/ansible.cfg) = True
port(/home/user/git/ansible-galaxy/ansible.cfg) = 22
remote_user(/home/user/git/ansible-galaxy/ansible.cfg) = user
scp_if_ssh(/home/user/git/ansible-galaxy/ansible.cfg) = False
sftp_batch_mode(/home/user/git/ansible-galaxy/ansible.cfg) = False
ssh_args(/home/user/git/ansible-galaxy/ansible.cfg) = -o PasswordAuthentication=no -o ControlMaster=auto -o ControlPersist=60s
timeout(/home/user/git/ansible-galaxy/ansible.cfg) = 20

SHELL:
=====

sh:
__
remote_tmp(/home/user/git/ansible-galaxy/ansible.cfg) = $HOME/.ansible/tmp
world_readable_temp(/home/user/git/ansible-galaxy/ansible.cfg) = False
```


### OS / Environment

RHEL7/8/9

### Steps to Reproduce

<!--- Paste example playbooks or commands between quotes below -->
```yaml (paste below)
- name: Demo run_once block no more hosts error
  become: false
  gather_facts: false
  hosts: all

  tasks:
    - name: Task pre
      debug:
        msg: "debug all nodes"

    - name: Fail first host
      fail:
      when: inventory_hostname == 'host1'

    - name: Block run_once
      run_once: true
      block:
        - name: Block debug 1
          debug:
            msg: "debug run_once task 1"

        - name: Block debug 2
          debug:
            msg: "debug run_once task 2"

    - name: Task post
      debug:
        msg: "debug remaining hosts"
```


### Expected Results

All the tasks of the block should run using the `run_once` functionality on the first available host that has not failed (host2 in this case.
After the block is done without failures the play should continue.

```console
# Ansible 2.12.5
ansible-playbook test.yml -i inventory.yml -l host1,host2 -D

PLAY [Demo run_once block no more hosts error] ********************************************************

TASK [Task pre] ***************************************************************************************
ok: [host1] => {
    "msg": "debug all nodes"
}
ok: [host2] => {
    "msg": "debug all nodes"
}

TASK [Fail first host] ********************************************************************************
fatal: [host1]: FAILED! => {"changed": false, "msg": "Failed as requested from task"}
skipping: [host2]

TASK [Block debug 1] **********************************************************************************
ok: [host2] => {
    "msg": "debug run_once task 1"
}

TASK [Block debug 2] **********************************************************************************
ok: [host2] => {
    "msg": "debug run_once task 2"
}

TASK [Task post] **************************************************************************************
ok: [host2] => {
    "msg": "debug remaining hosts"
}

PLAY RECAP ********************************************************************************************
host1                      : ok=1    changed=0    unreachable=0    failed=1    skipped=0    rescued=0    ignored=0
host2                      : ok=4    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0
```

### Actual Results

```console
# Ansible 2.15.3
$ ansible-playbook test.yml -i inventory.yml -l host1,host2 -D

PLAY [Demo run_once block no more hosts error] ********************************************************

TASK [Task pre] ***************************************************************************************
ok: [host1] => {
    "msg": "debug all nodes"
}
ok: [host2] => {
    "msg": "debug all nodes"
}

TASK [Fail first host] ********************************************************************************
fatal: [host1]: FAILED! => {"changed": false, "msg": "Failed as requested from task"}
skipping: [host2]

TASK [Block debug 1] **********************************************************************************
ok: [host2] => {
    "msg": "debug run_once task 1"
}

NO MORE HOSTS LEFT ************************************************************************************

PLAY RECAP ********************************************************************************************
host1                      : ok=1    changed=0    unreachable=0    failed=1    skipped=0    rescued=0    ignored=0
host2                      : ok=2    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0
```


### Code of Conduct

- [X] I agree to follow the Ansible Code of Conduct
if isinstance(task, Handler):
                                self._tqm.send_callback('v2_playbook_on_handler_task_start', task)
                            else:
                                self._tqm.send_callback('v2_playbook_on_task_start', task, is_conditional=False)
                            task.name = saved_name
                            callback_sent = True
                            display.debug("sending task start callback")
                        self._blocked_hosts[host.get_name()] = True
                        self._queue_task(host, task, task_vars, play_context)
                        del task_vars
                    if isinstance(task, Handler):
                        if run_once:
                            task.clear_hosts()
                        else:
                            task.remove_host(host)
                    
                    if run_once:
                        break
                    results.extend(self._process_pending_results(iterator, max_passes=max(1, int(len(self._tqm._workers) * 0.1))))
                
                if skip_rest:
                    continue
                display.debug("done queuing things up, now waiting for results queue to drain")
                if self._pending_results > 0:
                    results.extend(self._wait_on_pending_results(iterator))
                self.update_active_connections(results)
                included_files = IncludedFile.process_include_results(
                    results,
                    iterator=iterator,
                    loader=self._loader,