Skip to content

Commit

Permalink
Change resource group 'maxRunning' to 'hardConcurrencyLimit'
Browse files Browse the repository at this point in the history
  • Loading branch information
raghavsethi committed Oct 11, 2017
1 parent 836e322 commit bdfcb69
Show file tree
Hide file tree
Showing 32 changed files with 184 additions and 168 deletions.
14 changes: 7 additions & 7 deletions presto-docs/src/main/sphinx/admin/resource-groups.rst
Expand Up @@ -35,7 +35,7 @@ Resource Group Properties
* ``maxQueued`` (required): maximum number of queued queries. Once this limit is reached
new queries will be rejected.

* ``maxRunning`` (required): maximum number of running queries.
* ``hardConcurrencyLimit`` (required): maximum number of running queries.

* ``softMemoryLimit`` (required): maximum amount of distributed memory this
group may use before new queries become queued. May be specified as
Expand Down Expand Up @@ -132,38 +132,38 @@ all other users are subject to the following limits:
{
"name": "global",
"softMemoryLimit": "80%",
"maxRunning": 100,
"hardConcurrencyLimit": 100,
"maxQueued": 1000,
"schedulingPolicy": "weighted",
"jmxExport": true,
"subGroups": [
{
"name": "data_definition_${USER}",
"softMemoryLimit": "10%",
"maxRunning": 3,
"hardConcurrencyLimit": 3,
"maxQueued": 10,
"schedulingWeight": 1
},
{
"name": "adhoc_${USER}",
"softMemoryLimit": "10%",
"maxRunning": 2,
"hardConcurrencyLimit": 2,
"maxQueued": 1,
"schedulingWeight": 9,
"schedulingPolicy": "query_priority"
},
{
"name": "pipeline",
"softMemoryLimit": "20%",
"maxRunning": 5,
"hardConcurrencyLimit": 5,
"maxQueued": 100,
"schedulingWeight": 1,
"jmxExport": true,
"subGroups": [
{
"name": "pipeline_${USER}",
"softMemoryLimit": "10%",
"maxRunning": 1,
"hardConcurrencyLimit": 1,
"maxQueued": 100,
"schedulingPolicy": "query_priority"
}
Expand All @@ -174,7 +174,7 @@ all other users are subject to the following limits:
{
"name": "admin",
"softMemoryLimit": "100%",
"maxRunning": 200,
"hardConcurrencyLimit": 200,
"maxQueued": 100,
"schedulingPolicy": "query_priority",
"jmxExport": true
Expand Down
Expand Up @@ -91,7 +91,7 @@ public class InternalResourceGroup
@GuardedBy("root")
private long softMemoryLimitBytes;
@GuardedBy("root")
private int maxRunningQueries;
private int hardConcurrencyLimit;
@GuardedBy("root")
private int maxQueuedQueries;
@GuardedBy("root")
Expand Down Expand Up @@ -152,7 +152,7 @@ public ResourceGroupInfo getInfo()
return new ResourceGroupInfo(
id,
DataSize.succinctBytes(softMemoryLimitBytes),
maxRunningQueries,
hardConcurrencyLimit,
runningTimeLimit,
maxQueuedQueries,
queuedTimeLimit,
Expand All @@ -173,7 +173,7 @@ public ResourceGroupStateInfo getStateInfo()
getState(),
DataSize.succinctBytes(softMemoryLimitBytes),
DataSize.succinctBytes(cachedMemoryUsageBytes),
maxRunningQueries,
hardConcurrencyLimit,
maxQueuedQueries,
runningTimeLimit,
queuedTimeLimit,
Expand All @@ -183,7 +183,7 @@ public ResourceGroupStateInfo getStateInfo()
.map(subGroup -> new ResourceGroupInfo(
subGroup.getId(),
DataSize.succinctBytes(subGroup.softMemoryLimitBytes),
subGroup.maxRunningQueries,
subGroup.hardConcurrencyLimit,
subGroup.runningTimeLimit,
subGroup.maxQueuedQueries,
subGroup.queuedTimeLimit,
Expand Down Expand Up @@ -262,7 +262,7 @@ public int getWaitingQueuedQueries()
int waitingQueuedQueries = 0;
for (InternalResourceGroup subGroup : subGroups.values()) {
if (subGroup.canRunMore()) {
waitingQueuedQueries += min(subGroup.getQueuedQueries(), subGroup.getMaxRunningQueries() - subGroup.getRunningQueries());
waitingQueuedQueries += min(subGroup.getQueuedQueries(), subGroup.getHardConcurrencyLimit() - subGroup.getRunningQueries());
}
}

Expand Down Expand Up @@ -355,21 +355,21 @@ public void setCpuQuotaGenerationMillisPerSecond(long rate)

@Managed
@Override
public int getMaxRunningQueries()
public int getHardConcurrencyLimit()
{
synchronized (root) {
return maxRunningQueries;
return hardConcurrencyLimit;
}
}

@Managed
@Override
public void setMaxRunningQueries(int maxRunningQueries)
public void setHardConcurrencyLimit(int hardConcurrencyLimit)
{
checkArgument(maxRunningQueries >= 0, "maxRunningQueries is negative");
checkArgument(hardConcurrencyLimit >= 0, "hardConcurrencyLimit is negative");
synchronized (root) {
boolean oldCanRun = canRunMore();
this.maxRunningQueries = maxRunningQueries;
this.hardConcurrencyLimit = hardConcurrencyLimit;
if (canRunMore() != oldCanRun) {
updateEligiblility();
}
Expand Down Expand Up @@ -826,17 +826,17 @@ private boolean canRunMore()
return false;
}

int maxRunning = maxRunningQueries;
int hardConcurrencyLimit = this.hardConcurrencyLimit;
if (cpuUsageMillis >= softCpuLimitMillis) {
// Linear penalty between soft and hard limit
double penalty = (cpuUsageMillis - softCpuLimitMillis) / (double) (hardCpuLimitMillis - softCpuLimitMillis);
maxRunning = (int) Math.floor(maxRunning * (1 - penalty));
hardConcurrencyLimit = (int) Math.floor(hardConcurrencyLimit * (1 - penalty));
// Always penalize by at least one
maxRunning = min(maxRunningQueries - 1, maxRunning);
hardConcurrencyLimit = min(this.hardConcurrencyLimit - 1, hardConcurrencyLimit);
// Always allow at least one running query
maxRunning = Math.max(1, maxRunning);
hardConcurrencyLimit = Math.max(1, hardConcurrencyLimit);
}
return runningQueries.size() + descendantRunningQueries < maxRunning &&
return runningQueries.size() + descendantRunningQueries < hardConcurrencyLimit &&
cachedMemoryUsageBytes <= softMemoryLimitBytes;
}
}
Expand Down
Expand Up @@ -318,7 +318,7 @@ public int getQueriesQueuedOnInternal()
private static int getQueriesQueuedOnInternal(InternalResourceGroup resourceGroup)
{
if (resourceGroup.subGroups().isEmpty()) {
return Math.min(resourceGroup.getQueuedQueries(), resourceGroup.getMaxRunningQueries() - resourceGroup.getRunningQueries());
return Math.min(resourceGroup.getQueuedQueries(), resourceGroup.getHardConcurrencyLimit() - resourceGroup.getRunningQueries());
}

int queriesQueuedInternal = 0;
Expand Down
Expand Up @@ -37,13 +37,13 @@ public class LegacyResourceGroupConfigurationManagerFactory
public static final String LEGACY_RESOURCE_GROUP_MANAGER = "legacy";
private static final ResourceGroupId GLOBAL = new ResourceGroupId("global");

private final int maxRunning;
private final int hardConcurrencyLimit;
private final int maxQueued;

@Inject
public LegacyResourceGroupConfigurationManagerFactory(QueryManagerConfig config)
{
maxRunning = config.getMaxConcurrentQueries();
hardConcurrencyLimit = config.getMaxConcurrentQueries();
maxQueued = config.getMaxQueuedQueries();
}

Expand All @@ -67,7 +67,7 @@ public void configure(ResourceGroup group, SelectionContext context)
{
checkArgument(group.getId().equals(GLOBAL), "Unexpected resource group: %s", group.getId());
group.setMaxQueuedQueries(maxQueued);
group.setMaxRunningQueries(maxRunning);
group.setHardConcurrencyLimit(hardConcurrencyLimit);
}

@Override
Expand Down
Expand Up @@ -36,7 +36,7 @@ public class ResourceGroupStateInfo

private final List<ResourceGroupInfo> subGroups;

private final int maxRunningQueries;
private final int hardConcurrencyLimit;
private final int maxQueuedQueries;
private final Duration runningTimeLimit;
private final Duration queuedTimeLimit;
Expand All @@ -49,7 +49,7 @@ public ResourceGroupStateInfo(
@JsonProperty("state") ResourceGroupState state,
@JsonProperty("softMemoryLimit") DataSize softMemoryLimit,
@JsonProperty("memoryUsage") DataSize memoryUsage,
@JsonProperty("maxRunningQueries") int maxRunningQueries,
@JsonProperty("hardConcurrencyLimit") int hardConcurrencyLimit,
@JsonProperty("maxQueuedQueries") int maxQueuedQueries,
@JsonProperty("runningTimeLimit") Duration runningTimeLimit,
@JsonProperty("queuedTimeLimit") Duration queuedTimeLimit,
Expand All @@ -63,7 +63,7 @@ public ResourceGroupStateInfo(
this.softMemoryLimit = requireNonNull(softMemoryLimit, "softMemoryLimit is null");
this.memoryUsage = requireNonNull(memoryUsage, "memoryUsage is null");

this.maxRunningQueries = maxRunningQueries;
this.hardConcurrencyLimit = hardConcurrencyLimit;
this.maxQueuedQueries = maxQueuedQueries;

this.runningTimeLimit = requireNonNull(runningTimeLimit, "runningTimeLimit is null");
Expand Down Expand Up @@ -100,9 +100,17 @@ public DataSize getMemoryUsage()
}

@JsonProperty
public int getHardConcurrencyLimit()
{
return hardConcurrencyLimit;
}

@JsonProperty
@Deprecated
public int getMaxRunningQueries()
{
return maxRunningQueries;
// TODO: Remove when dependent tools are updated
return hardConcurrencyLimit;
}

@JsonProperty
Expand Down
Expand Up @@ -75,13 +75,13 @@ public void setup()
root = new RootInternalResourceGroup("root", (group, export) -> {}, executor);
root.setSoftMemoryLimit(new DataSize(1, MEGABYTE));
root.setMaxQueuedQueries(queries);
root.setMaxRunningQueries(queries);
root.setHardConcurrencyLimit(queries);
InternalResourceGroup group = root;
for (int i = 0; i < children; i++) {
group = root.getOrCreateSubGroup(String.valueOf(i));
group.setSoftMemoryLimit(new DataSize(1, MEGABYTE));
group.setMaxQueuedQueries(queries);
group.setMaxRunningQueries(queries);
group.setHardConcurrencyLimit(queries);
}
for (int i = 0; i < queries; i++) {
group.run(new MockQueryExecution(10));
Expand Down

0 comments on commit bdfcb69

Please sign in to comment.