Skip to content

Commit bc69e8f

Browse files
committed
Allow specifying list of allowed retry policies
1 parent c1510ea commit bc69e8f

File tree

4 files changed

+53
-0
lines changed

4 files changed

+53
-0
lines changed

core/trino-main/src/main/java/io/trino/SystemSessionProperties.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -798,6 +798,11 @@ public SystemSessionProperties(
798798
"Retry policy",
799799
RetryPolicy.class,
800800
queryManagerConfig.getRetryPolicy(),
801+
value -> {
802+
if (!queryManagerConfig.getAllowedRetryPolicies().contains(value)) {
803+
throw new TrinoException(INVALID_SESSION_PROPERTY, format("Retry policy %s not allowed. Must be one of %s", value, queryManagerConfig.getAllowedRetryPolicies()));
804+
}
805+
},
801806
true),
802807
integerProperty(
803808
QUERY_RETRY_ATTEMPTS,

core/trino-main/src/main/java/io/trino/execution/QueryManagerConfig.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
*/
1414
package io.trino.execution;
1515

16+
import com.google.common.collect.ImmutableSet;
1617
import io.airlift.configuration.Config;
1718
import io.airlift.configuration.ConfigDescription;
1819
import io.airlift.configuration.DefunctConfig;
@@ -22,12 +23,15 @@
2223
import io.airlift.units.MinDataSize;
2324
import io.airlift.units.MinDuration;
2425
import io.trino.operator.RetryPolicy;
26+
import jakarta.validation.constraints.AssertTrue;
2527
import jakarta.validation.constraints.DecimalMin;
2628
import jakarta.validation.constraints.Max;
2729
import jakarta.validation.constraints.Min;
2830
import jakarta.validation.constraints.NotNull;
2931

32+
import java.util.EnumSet;
3033
import java.util.Optional;
34+
import java.util.Set;
3135
import java.util.concurrent.TimeUnit;
3236

3337
import static com.google.common.base.Preconditions.checkArgument;
@@ -104,6 +108,8 @@ public class QueryManagerConfig
104108
private Duration requiredWorkersMaxWait = new Duration(5, TimeUnit.MINUTES);
105109

106110
private RetryPolicy retryPolicy = RetryPolicy.NONE;
111+
private Set<RetryPolicy> allowedRetryPolicies = EnumSet.allOf(RetryPolicy.class);
112+
107113
private int queryRetryAttempts = 4;
108114
private int taskRetryAttemptsPerTask = 4;
109115
private Duration retryInitialDelay = new Duration(10, SECONDS);
@@ -613,6 +619,25 @@ public QueryManagerConfig setRetryPolicy(RetryPolicy retryPolicy)
613619
return this;
614620
}
615621

622+
public Set<RetryPolicy> getAllowedRetryPolicies()
623+
{
624+
return allowedRetryPolicies;
625+
}
626+
627+
@Config("retry-policy.allowed")
628+
@ConfigDescription("Retry policies that are allowed to be used")
629+
public QueryManagerConfig setAllowedRetryPolicies(Set<RetryPolicy> allowedRetryPolicies)
630+
{
631+
this.allowedRetryPolicies = ImmutableSet.copyOf(allowedRetryPolicies);
632+
return this;
633+
}
634+
635+
@AssertTrue(message = "Selected retry policy not present in retry-policy.allowed list")
636+
public boolean isRetryPolicyAllowed()
637+
{
638+
return allowedRetryPolicies.contains(retryPolicy);
639+
}
640+
616641
@Min(0)
617642
public int getQueryRetryAttempts()
618643
{

core/trino-main/src/test/java/io/trino/execution/TestQueryManagerConfig.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,16 @@
1717
import io.airlift.units.DataSize;
1818
import io.airlift.units.Duration;
1919
import io.trino.operator.RetryPolicy;
20+
import jakarta.validation.constraints.AssertTrue;
2021
import org.junit.jupiter.api.Test;
2122

23+
import java.util.EnumSet;
2224
import java.util.Map;
2325

2426
import static io.airlift.configuration.testing.ConfigAssertions.assertFullMapping;
2527
import static io.airlift.configuration.testing.ConfigAssertions.assertRecordedDefaults;
2628
import static io.airlift.configuration.testing.ConfigAssertions.recordDefaults;
29+
import static io.airlift.testing.ValidationAssertions.assertFailsValidation;
2730
import static io.airlift.units.DataSize.Unit.GIGABYTE;
2831
import static io.airlift.units.DataSize.Unit.KILOBYTE;
2932
import static io.airlift.units.DataSize.Unit.MEGABYTE;
@@ -76,6 +79,7 @@ public void testDefaults()
7679
.setRequiredWorkers(1)
7780
.setRequiredWorkersMaxWait(new Duration(5, MINUTES))
7881
.setRetryPolicy(RetryPolicy.NONE)
82+
.setAllowedRetryPolicies(EnumSet.allOf(RetryPolicy.class))
7983
.setQueryRetryAttempts(4)
8084
.setTaskRetryAttemptsPerTask(4)
8185
.setRetryInitialDelay(new Duration(10, SECONDS))
@@ -160,6 +164,7 @@ public void testExplicitPropertyMappings()
160164
.put("query-manager.required-workers", "333")
161165
.put("query-manager.required-workers-max-wait", "33m")
162166
.put("retry-policy", "QUERY")
167+
.put("retry-policy.allowed", "QUERY,TASK")
163168
.put("query-retry-attempts", "0")
164169
.put("task-retry-attempts-per-task", "9")
165170
.put("retry-initial-delay", "1m")
@@ -241,6 +246,7 @@ public void testExplicitPropertyMappings()
241246
.setRequiredWorkers(333)
242247
.setRequiredWorkersMaxWait(new Duration(33, MINUTES))
243248
.setRetryPolicy(RetryPolicy.QUERY)
249+
.setAllowedRetryPolicies(EnumSet.of(RetryPolicy.QUERY, RetryPolicy.TASK))
244250
.setQueryRetryAttempts(0)
245251
.setTaskRetryAttemptsPerTask(9)
246252
.setRetryInitialDelay(new Duration(1, MINUTES))
@@ -290,4 +296,16 @@ public void testExplicitPropertyMappings()
290296

291297
assertFullMapping(properties, expected);
292298
}
299+
300+
@Test
301+
public void testAllowedRetryPoliciesValidation()
302+
{
303+
assertFailsValidation(
304+
new QueryManagerConfig()
305+
.setAllowedRetryPolicies(EnumSet.of(RetryPolicy.NONE, RetryPolicy.TASK))
306+
.setRetryPolicy(RetryPolicy.QUERY),
307+
"retryPolicyAllowed",
308+
"Selected retry policy not present in retry-policy.allowed list",
309+
AssertTrue.class);
310+
}
293311
}

docs/src/main/sphinx/admin/fault-tolerant-execution.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,11 @@ execution on a Trino cluster:
7171
fault-tolerant execution and typically only to deactivate with `NONE`, since
7272
switching between modes on a cluster is not tested.
7373
- `NONE`
74+
* - `retry-policy.allowed`
75+
- List of retry policies that are allowed to be configured for a cluster.
76+
This property is used to prevent a user from configuring a retry policy that
77+
is not meant to be used on the given cluster.
78+
- `NONE`, `QUERY`, `TASK`
7479
* - `exchange.deduplication-buffer-size`
7580
- [Data size](prop-type-data-size) of the coordinator's in-memory buffer used
7681
by fault-tolerant execution to store output of query

0 commit comments

Comments
 (0)