**Affected version:** 7.12 - 7.17.7, 8.0-8.5
**Fixed in:** 7.17.7, 8.5.0

### Problem Description

A continuous transform can fail if a transform is searching at the same time as an ILM action occurs or in general anything that closes an index. This should not happen if transform is configured with a wildcard pattern for the source index, e.g. `filebeat-*`.

In a specific case an ILM policy temporarily closes the index due to the unfollow-the-follower action.

A typical log entry for this bugs contains something like this:

```
task encountered irrecoverable failure: org.elasticsearch.cluster.block.ClusterBlockException: index [ ... ] blocked by: [FORBIDDEN/4/index closed];
```

### Mitigation

A: Restart the transform. This can be automated by monitoring `_stats` and restarting the transform using `_stop?force=true` followed by `_start`.

B: Don't use the ILM unfollow action until a fix is available.

C: **Unreleased**: Starting with 8.5 set the transform to `unattended` mode via `settings`, this will let transform retry even for this failure class

### Solution

If the source of a transform is configured with a wildcard, transform should not treat an index closed exception as an irrecoverable failure.

### Backport

The fix needs to be backported to the `7.17` series.
x-pack/plugin/transform/src/main/java/org/elasticsearch/xpack/transform/transforms/TransformFailureHandler.java
* might be set to failed.
     *
     * @param unwrappedException The exception caught
     * @param message error message to log/audit
     * @param unattended whether the transform runs in unattended mode
     * @param numFailureRetries the number of configured retries
     */
    private void retry(Throwable unwrappedException, String message, boolean unattended, int numFailureRetries) {
        
        final String thisFailureClass = unwrappedException.getClass().toString();
        final String lastFailureClass = context.getLastFailure();
        final int failureCount = context.incrementAndGetFailureCount(thisFailureClass);
        if (unattended == false && numFailureRetries != -1 && failureCount > numFailureRetries) {
            fail("task encountered more than " + numFailureRetries + " failures; latest failure: " + message);
            return;
        }
        
        
        
        if (thisFailureClass.equals(lastFailureClass) == false
            || failureCount % LOG_FAILURE_EVERY == 0
            || failureCount == numFailureRetries) {
            String retryMessage = format(
                "Transform encountered an exception: [%s]; Will automatically retry [%d/%d]",
                message,
                failureCount,
                numFailureRetries
            );
            logger.log(unattended ? Level.INFO : Level.WARN, () -> "[" + transformId + "] " + retryMessage);
            auditor.audit(unattended ? INFO : WARNING, transformId, retryMessage);