**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/test/java/org/elasticsearch/xpack/transform/transforms/TransformFailureHandlerTests.java
SettingsConfig settings = new SettingsConfig.Builder().setUnattended(true).build();
        MockTransformAuditor auditor = MockTransformAuditor.createMockAuditor();
        MockTransformContextListener contextListener = new MockTransformContextListener();
        TransformContext context = new TransformContext(TransformTaskState.STARTED, "", 0, contextListener);
        context.setPageSize(500);
        TransformFailureHandler handler = new TransformFailureHandler(auditor, context, transformId);
        handler.handleIndexerFailure(
            new SearchPhaseExecutionException(
                "query",
                "Partial shards failure",
                new ShardSearchFailure[] {
                    new ShardSearchFailure(new CircuitBreakingException("to much memory", 110, 100, CircuitBreaker.Durability.TRANSIENT)) }
            ),
            settings
        );
        
        assertFalse(contextListener.getFailed());
        assertEquals(0, contextListener.getFailureCountChangedCounter());
        assertNoFailure(
            handler,
            new SearchPhaseExecutionException(
                "query",
                "Partial shards failure",
                new ShardSearchFailure[] {
                    new ShardSearchFailure(
                        new ScriptException(
                            "runtime error",
                            new ArithmeticException("/ by zero"),
                            singletonList("stack"),
                            "test",