Skip to content

Commit 33141f7

Browse files
pgupta2facebook-github-bot
authored andcommitted
Support max queued_time limit (prestodb#25589)
Summary: Support Max queued time limit. Queries queued for more than this threshold should fail with EXCEEDED_TIME_LIMIT error code and proper error msg Differential Revision: D78709808
1 parent d95fca4 commit 33141f7

7 files changed

Lines changed: 404 additions & 3 deletions

File tree

presto-docs/src/main/sphinx/admin/properties-session.rst

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -484,4 +484,14 @@ The corresponding configuration property is :ref:`admin/properties:\`\`query.cli
484484
* **Default value:** ``1``
485485

486486
This property defines the priority of queries for execution and plays an important role in query admission.
487-
Queries with higher priority are scheduled first than the ones with lower priority. Higher number indicates higher priority.
487+
Queries with higher priority are scheduled first than the ones with lower priority. Higher number indicates higher priority.
488+
489+
``query_max_queued_time``
490+
^^^^^^^^^^^^^^^^^^^^^^^^
491+
492+
* **Type:** ``Duration``
493+
* **Default value:** ``100d``
494+
495+
This property can be used to configure how long a query can be queued before its terminated.
496+
497+
The corresponding configuration property is :ref:`admin/properties:\`\`query.max-queued-time\`\``.

presto-docs/src/main/sphinx/admin/properties.rst

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1136,4 +1136,14 @@ Query Manager Properties
11361136
This property can be used to configure how long a query runs without contact
11371137
from the client application, such as the CLI, before it's abandoned.
11381138

1139-
The corresponding session property is :ref:`admin/properties-session:\`\`query_client_timeout\`\``.
1139+
The corresponding session property is :ref:`admin/properties-session:\`\`query_client_timeout\`\``.
1140+
1141+
``query.max-queued-time``
1142+
^^^^^^^^^^^^^^^^^^^^^^^^
1143+
1144+
* **Type:** ``Duration``
1145+
* **Default value:** ``100d``
1146+
1147+
This property can be used to configure how long a query can be queued before its terminated.
1148+
1149+
The corresponding session property is :ref:`admin/properties-session:\`\`query_max_queued_time\`\``.

presto-main-base/src/main/java/com/facebook/presto/SystemSessionProperties.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ public final class SystemSessionProperties
115115
public static final String QUERY_MAX_BROADCAST_MEMORY = "query_max_broadcast_memory";
116116
public static final String QUERY_MAX_TOTAL_MEMORY = "query_max_total_memory";
117117
public static final String QUERY_MAX_TOTAL_MEMORY_PER_NODE = "query_max_total_memory_per_node";
118+
public static final String QUERY_MAX_QUEUED_TIME = "query_max_queued_time";
118119
public static final String QUERY_MAX_EXECUTION_TIME = "query_max_execution_time";
119120
public static final String QUERY_MAX_RUN_TIME = "query_max_run_time";
120121
public static final String RESOURCE_OVERCOMMIT = "resource_overcommit";
@@ -569,6 +570,15 @@ public SystemSessionProperties(
569570
false,
570571
value -> Duration.valueOf((String) value),
571572
Duration::toString),
573+
new PropertyMetadata<>(
574+
QUERY_MAX_QUEUED_TIME,
575+
"Maximum Queued time of a query",
576+
VARCHAR,
577+
Duration.class,
578+
queryManagerConfig.getQueryMaxQueuedTime(),
579+
false,
580+
value -> Duration.valueOf((String) value),
581+
Duration::toString),
572582
new PropertyMetadata<>(
573583
QUERY_MAX_EXECUTION_TIME,
574584
"Maximum execution time of a query",
@@ -2188,6 +2198,11 @@ public static Duration getQueryMaxRunTime(Session session)
21882198
return session.getSystemProperty(QUERY_MAX_RUN_TIME, Duration.class);
21892199
}
21902200

2201+
public static Duration getQueryMaxQueuedTime(Session session)
2202+
{
2203+
return session.getSystemProperty(QUERY_MAX_QUEUED_TIME, Duration.class);
2204+
}
2205+
21912206
public static Duration getQueryMaxExecutionTime(Session session)
21922207
{
21932208
return session.getSystemProperty(QUERY_MAX_EXECUTION_TIME, Duration.class);

presto-main-base/src/main/java/com/facebook/presto/execution/QueryManagerConfig.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ public class QueryManagerConfig
7474

7575
private String queryExecutionPolicy = "all-at-once";
7676
private Duration queryMaxRunTime = new Duration(100, TimeUnit.DAYS);
77+
private Duration queryMaxQueuedTime = new Duration(100, TimeUnit.DAYS);
7778
private Duration queryMaxExecutionTime = new Duration(100, TimeUnit.DAYS);
7879
private Duration queryMaxCpuTime = new Duration(1_000_000_000, TimeUnit.DAYS);
7980

@@ -431,6 +432,19 @@ public QueryManagerConfig setQueryMaxRunTime(Duration queryMaxRunTime)
431432
return this;
432433
}
433434

435+
@NotNull
436+
public Duration getQueryMaxQueuedTime()
437+
{
438+
return queryMaxQueuedTime;
439+
}
440+
441+
@Config("query.max-queued-time")
442+
public QueryManagerConfig setQueryMaxQueuedTime(Duration queryMaxQueuedTime)
443+
{
444+
this.queryMaxQueuedTime = queryMaxQueuedTime;
445+
return this;
446+
}
447+
434448
@NotNull
435449
public Duration getQueryMaxExecutionTime()
436450
{

presto-main-base/src/main/java/com/facebook/presto/execution/QueryTracker.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343

4444
import static com.facebook.presto.SystemSessionProperties.getQueryClientTimeout;
4545
import static com.facebook.presto.SystemSessionProperties.getQueryMaxExecutionTime;
46+
import static com.facebook.presto.SystemSessionProperties.getQueryMaxQueuedTime;
4647
import static com.facebook.presto.SystemSessionProperties.getQueryMaxRunTime;
4748
import static com.facebook.presto.execution.QueryLimit.Source.QUERY;
4849
import static com.facebook.presto.execution.QueryLimit.Source.RESOURCE_GROUP;
@@ -211,7 +212,7 @@ public long getQueriesKilledDueToTooManyTask()
211212
}
212213

213214
/**
214-
* Enforce query max runtime/execution time limits
215+
* Enforce query max runtime/queued/execution time limits
215216
*/
216217
private void enforceTimeLimits()
217218
{
@@ -220,13 +221,24 @@ private void enforceTimeLimits()
220221
continue;
221222
}
222223
Duration queryMaxRunTime = getQueryMaxRunTime(query.getSession());
224+
Duration queryMaxQueuedTime = getQueryMaxQueuedTime(query.getSession());
223225
QueryLimit<Duration> queryMaxExecutionTime = getMinimum(
224226
createDurationLimit(getQueryMaxExecutionTime(query.getSession()), QUERY),
225227
query.getResourceGroupQueryLimits()
226228
.flatMap(ResourceGroupQueryLimits::getExecutionTimeLimit)
227229
.map(rgLimit -> createDurationLimit(rgLimit, RESOURCE_GROUP)).orElse(null));
228230
long executionStartTime = query.getExecutionStartTimeInMillis();
229231
long createTimeInMillis = query.getCreateTimeInMillis();
232+
long queuedTimeInMillis;
233+
if (executionStartTime > 0) {
234+
queuedTimeInMillis = executionStartTime - createTimeInMillis;
235+
}
236+
else {
237+
queuedTimeInMillis = currentTimeMillis() - createTimeInMillis;
238+
}
239+
if (queuedTimeInMillis > queryMaxQueuedTime.toMillis()) {
240+
query.fail(new PrestoException(EXCEEDED_TIME_LIMIT, "Query exceeded maximum queued time limit of " + queryMaxQueuedTime));
241+
}
230242
if (executionStartTime > 0 && (executionStartTime + queryMaxExecutionTime.getLimit().toMillis()) < currentTimeMillis()) {
231243
query.fail(
232244
new PrestoException(EXCEEDED_TIME_LIMIT,

presto-main-base/src/test/java/com/facebook/presto/execution/TestQueryManagerConfig.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ public void testDefaults()
6262
.setRemoteTaskMaxCallbackThreads(Runtime.getRuntime().availableProcessors())
6363
.setQueryExecutionPolicy("all-at-once")
6464
.setQueryMaxRunTime(new Duration(100, TimeUnit.DAYS))
65+
.setQueryMaxQueuedTime(new Duration(100, TimeUnit.DAYS))
6566
.setQueryMaxExecutionTime(new Duration(100, TimeUnit.DAYS))
6667
.setQueryMaxCpuTime(new Duration(1_000_000_000, TimeUnit.DAYS))
6768
.setQueryMaxScanRawInputBytes(new DataSize(1000, PETABYTE))
@@ -115,6 +116,7 @@ public void testExplicitPropertyMappings()
115116
.put("query.remote-task.max-callback-threads", "11")
116117
.put("query.execution-policy", "phased")
117118
.put("query.max-run-time", "2h")
119+
.put("query.max-queued-time", "1h")
118120
.put("query.max-execution-time", "3h")
119121
.put("query.max-cpu-time", "2d")
120122
.put("query.max-scan-raw-input-bytes", "1MB")
@@ -167,6 +169,7 @@ public void testExplicitPropertyMappings()
167169
.setRemoteTaskMaxCallbackThreads(11)
168170
.setQueryExecutionPolicy("phased")
169171
.setQueryMaxRunTime(new Duration(2, TimeUnit.HOURS))
172+
.setQueryMaxQueuedTime(new Duration(1, TimeUnit.HOURS))
170173
.setQueryMaxExecutionTime(new Duration(3, TimeUnit.HOURS))
171174
.setQueryMaxCpuTime(new Duration(2, TimeUnit.DAYS))
172175
.setQueryMaxScanRawInputBytes(new DataSize(1, MEGABYTE))

0 commit comments

Comments
 (0)