You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aurora.apache.org by ma...@apache.org on 2015/10/09 20:05:40 UTC
aurora git commit: Converting to Range in ConfigGroup thrift.
Repository: aurora
Updated Branches:
refs/heads/master 8816d49a4 -> f630bf705
Converting to Range in ConfigGroup thrift.
Reviewed at https://reviews.apache.org/r/39150/
Project: http://git-wip-us.apache.org/repos/asf/aurora/repo
Commit: http://git-wip-us.apache.org/repos/asf/aurora/commit/f630bf70
Tree: http://git-wip-us.apache.org/repos/asf/aurora/tree/f630bf70
Diff: http://git-wip-us.apache.org/repos/asf/aurora/diff/f630bf70
Branch: refs/heads/master
Commit: f630bf705ac8a9de2b7b987858ada3b876f65abf
Parents: 8816d49
Author: Maxim Khutornenko <ma...@apache.org>
Authored: Fri Oct 9 11:05:11 2015 -0700
Committer: Maxim Khutornenko <ma...@apache.org>
Committed: Fri Oct 9 11:05:11 2015 -0700
----------------------------------------------------------------------
NEWS | 1 +
.../thrift/org/apache/aurora/gen/api.thrift | 3 +-
.../apache/aurora/scheduler/base/Numbers.java | 15 ++++
.../scheduler/thrift/ReadOnlySchedulerImpl.java | 6 +-
.../thrift/SchedulerThriftInterface.java | 18 +++--
.../scheduler/assets/js/controllers.js | 8 +--
.../resources/scheduler/assets/js/services.js | 73 --------------------
.../thrift/ReadOnlySchedulerImplTest.java | 9 ++-
8 files changed, 42 insertions(+), 91 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/aurora/blob/f630bf70/NEWS
----------------------------------------------------------------------
diff --git a/NEWS b/NEWS
index 2edcea6..7622f9d 100644
--- a/NEWS
+++ b/NEWS
@@ -14,6 +14,7 @@
https://github.com/apache/mesos/blob/ebcf8cc2f2f6c236f6e9315447c247e6348141e1/docs/getting-started.md
for more details on Mesos runtime dependencies.
- Resource quota is no longer consumed by production jobs with a dedicated constraint (AURORA-1457).
+- Thrift ConfigGroup.instanceIds field has been deprecated. Use ConfigGroup.instances instead.
0.9.0
-----
http://git-wip-us.apache.org/repos/asf/aurora/blob/f630bf70/api/src/main/thrift/org/apache/aurora/gen/api.thrift
----------------------------------------------------------------------
diff --git a/api/src/main/thrift/org/apache/aurora/gen/api.thrift b/api/src/main/thrift/org/apache/aurora/gen/api.thrift
index a04e644..f56d7bd 100644
--- a/api/src/main/thrift/org/apache/aurora/gen/api.thrift
+++ b/api/src/main/thrift/org/apache/aurora/gen/api.thrift
@@ -348,7 +348,8 @@ struct Range {
struct ConfigGroup {
1: TaskConfig config
- 2: set<i32> instanceIds // TODO(maxim): change it to use list<Range> instead.
+ 2: set<i32> instanceIds //TODO(maxim): deprecated. Remove in AURORA-1519.
+ 3: set<Range> instances
}
struct ConfigSummary {
http://git-wip-us.apache.org/repos/asf/aurora/blob/f630bf70/src/main/java/org/apache/aurora/scheduler/base/Numbers.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/aurora/scheduler/base/Numbers.java b/src/main/java/org/apache/aurora/scheduler/base/Numbers.java
index 5c1bdb4..703ca3b 100644
--- a/src/main/java/org/apache/aurora/scheduler/base/Numbers.java
+++ b/src/main/java/org/apache/aurora/scheduler/base/Numbers.java
@@ -23,6 +23,7 @@ import com.google.common.collect.PeekingIterator;
import com.google.common.collect.Range;
import com.google.common.collect.Sets;
+import org.apache.aurora.GuavaUtils;
import org.apache.aurora.scheduler.storage.entities.IRange;
/**
@@ -93,4 +94,18 @@ public final class Numbers {
return instanceIds.build().asSet(DiscreteDomain.integers());
}
+
+ /**
+ * Converts set of instance ranges to a set of {@link IRange}.
+ *
+ * @param ranges Instance ranges to convert.
+ * @return A set of {@link IRange}.
+ */
+ public static Set<IRange> convertRanges(Set<Range<Integer>> ranges) {
+ return ranges.stream()
+ .map(range -> IRange.build(new org.apache.aurora.gen.Range(
+ range.lowerEndpoint(),
+ range.upperEndpoint())))
+ .collect(GuavaUtils.toImmutableSet());
+ }
}
http://git-wip-us.apache.org/repos/asf/aurora/blob/f630bf70/src/main/java/org/apache/aurora/scheduler/thrift/ReadOnlySchedulerImpl.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/aurora/scheduler/thrift/ReadOnlySchedulerImpl.java b/src/main/java/org/apache/aurora/scheduler/thrift/ReadOnlySchedulerImpl.java
index 13b5c22..c09130b 100644
--- a/src/main/java/org/apache/aurora/scheduler/thrift/ReadOnlySchedulerImpl.java
+++ b/src/main/java/org/apache/aurora/scheduler/thrift/ReadOnlySchedulerImpl.java
@@ -91,12 +91,15 @@ import org.apache.aurora.scheduler.storage.entities.IJobUpdateKey;
import org.apache.aurora.scheduler.storage.entities.IJobUpdateQuery;
import org.apache.aurora.scheduler.storage.entities.IJobUpdateSummary;
import org.apache.aurora.scheduler.storage.entities.ILock;
+import org.apache.aurora.scheduler.storage.entities.IRange;
import org.apache.aurora.scheduler.storage.entities.IScheduledTask;
import org.apache.aurora.scheduler.storage.entities.ITaskConfig;
import org.apache.thrift.TException;
import static java.util.Objects.requireNonNull;
+import static org.apache.aurora.scheduler.base.Numbers.convertRanges;
+import static org.apache.aurora.scheduler.base.Numbers.toRanges;
import static org.apache.aurora.scheduler.thrift.Responses.invalidRequest;
import static org.apache.aurora.scheduler.thrift.Responses.ok;
@@ -107,7 +110,8 @@ class ReadOnlySchedulerImpl implements ReadOnlyScheduler.Iface {
public ConfigGroup apply(Entry<ITaskConfig, Collection<Integer>> input) {
return new ConfigGroup(
input.getKey().newBuilder(),
- ImmutableSet.copyOf(input.getValue()));
+ ImmutableSet.copyOf(input.getValue()),
+ IRange.toBuildersSet(convertRanges(toRanges(input.getValue()))));
}
};
http://git-wip-us.apache.org/repos/asf/aurora/blob/f630bf70/src/main/java/org/apache/aurora/scheduler/thrift/SchedulerThriftInterface.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/aurora/scheduler/thrift/SchedulerThriftInterface.java b/src/main/java/org/apache/aurora/scheduler/thrift/SchedulerThriftInterface.java
index fd07365..4efcd2c 100644
--- a/src/main/java/org/apache/aurora/scheduler/thrift/SchedulerThriftInterface.java
+++ b/src/main/java/org/apache/aurora/scheduler/thrift/SchedulerThriftInterface.java
@@ -36,7 +36,6 @@ import com.google.common.collect.Multimap;
import com.google.common.collect.Multimaps;
import com.google.common.collect.Range;
-import org.apache.aurora.GuavaUtils;
import org.apache.aurora.auth.CapabilityValidator;
import org.apache.aurora.auth.CapabilityValidator.AuditCheck;
import org.apache.aurora.auth.SessionValidator.AuthFailedException;
@@ -119,6 +118,7 @@ import org.apache.aurora.scheduler.storage.entities.IJobUpdateRequest;
import org.apache.aurora.scheduler.storage.entities.IJobUpdateSettings;
import org.apache.aurora.scheduler.storage.entities.ILock;
import org.apache.aurora.scheduler.storage.entities.ILockKey;
+import org.apache.aurora.scheduler.storage.entities.IRange;
import org.apache.aurora.scheduler.storage.entities.IResourceAggregate;
import org.apache.aurora.scheduler.storage.entities.IScheduledTask;
import org.apache.aurora.scheduler.storage.entities.ITaskConfig;
@@ -146,6 +146,8 @@ import static org.apache.aurora.gen.ResponseCode.INVALID_REQUEST;
import static org.apache.aurora.gen.ResponseCode.LOCK_ERROR;
import static org.apache.aurora.gen.ResponseCode.OK;
import static org.apache.aurora.gen.ResponseCode.WARNING;
+import static org.apache.aurora.scheduler.base.Numbers.convertRanges;
+import static org.apache.aurora.scheduler.base.Numbers.toRanges;
import static org.apache.aurora.scheduler.base.Tasks.ACTIVE_STATES;
import static org.apache.aurora.scheduler.quota.QuotaCheckResult.Result.INSUFFICIENT_QUOTA;
import static org.apache.aurora.scheduler.thrift.Responses.addMessage;
@@ -1069,12 +1071,6 @@ class SchedulerThriftInterface implements AnnotatedAuroraAdmin {
}
}
- private static Set<org.apache.aurora.gen.Range> convertRanges(Set<Range<Integer>> ranges) {
- return ranges.stream()
- .map(range -> new org.apache.aurora.gen.Range(range.lowerEndpoint(), range.upperEndpoint()))
- .collect(GuavaUtils.toImmutableSet());
- }
-
private static Set<InstanceTaskConfig> buildInitialState(Map<Integer, ITaskConfig> tasks) {
// Translate tasks into instance IDs.
Multimap<ITaskConfig, Integer> instancesByConfig = HashMultimap.create();
@@ -1088,7 +1084,7 @@ class SchedulerThriftInterface implements AnnotatedAuroraAdmin {
for (Map.Entry<ITaskConfig, Set<Range<Integer>>> entry : rangesByConfig.entrySet()) {
builder.add(new InstanceTaskConfig()
.setTask(entry.getKey().newBuilder())
- .setInstances(convertRanges(entry.getValue())));
+ .setInstances(IRange.toBuildersSet(convertRanges(entry.getValue()))));
}
return builder.build();
@@ -1185,11 +1181,13 @@ class SchedulerThriftInterface implements AnnotatedAuroraAdmin {
JobUpdateInstructions instructions = new JobUpdateInstructions()
.setSettings(settings.newBuilder())
.setInitialState(buildInitialState(diff.getReplacedInstances()));
- if (!diff.getReplacementInstances().isEmpty()) {
+
+ Set<Integer> replacements = diff.getReplacementInstances();
+ if (!replacements.isEmpty()) {
instructions.setDesiredState(
new InstanceTaskConfig()
.setTask(request.getTaskConfig().newBuilder())
- .setInstances(convertRanges(Numbers.toRanges(diff.getReplacementInstances()))));
+ .setInstances(IRange.toBuildersSet(convertRanges(toRanges(replacements)))));
}
IJobUpdate update = IJobUpdate.build(new JobUpdate()
http://git-wip-us.apache.org/repos/asf/aurora/blob/f630bf70/src/main/resources/scheduler/assets/js/controllers.js
----------------------------------------------------------------------
diff --git a/src/main/resources/scheduler/assets/js/controllers.js b/src/main/resources/scheduler/assets/js/controllers.js
index 85ae8ce..dff6645 100644
--- a/src/main/resources/scheduler/assets/js/controllers.js
+++ b/src/main/resources/scheduler/assets/js/controllers.js
@@ -401,15 +401,15 @@
];
var total = _.reduce(response.groups, function (m, n) {
- return m + n.instanceIds.length;
+ return m + updateUtil.instanceCountFromRanges(n.instances);
}, 0);
$scope.groupSummary = response.groups.map(function (group, i) {
- var count = group.instanceIds.length;
+ var count = updateUtil.instanceCountFromRanges(group.instances);
var percentage = (count / total) * 100;
- var ranges = taskUtil.toRanges(group.instanceIds).map(function (r) {
- return (r.start === r.end) ? r.start : r.start + '-' + r.end;
+ var ranges = group.instances.map(function (r) {
+ return (r.first === r.last) ? r.first : r.first + '-' + r.last;
});
return {
http://git-wip-us.apache.org/repos/asf/aurora/blob/f630bf70/src/main/resources/scheduler/assets/js/services.js
----------------------------------------------------------------------
diff --git a/src/main/resources/scheduler/assets/js/services.js b/src/main/resources/scheduler/assets/js/services.js
index b7699fe..f9e8580 100644
--- a/src/main/resources/scheduler/assets/js/services.js
+++ b/src/main/resources/scheduler/assets/js/services.js
@@ -272,13 +272,6 @@
JobUpdateAction.INSTANCE_UPDATED
]);
- var INSTANCE_TERMINAL = toSet([
- JobUpdateAction.INSTANCE_UPDATED,
- JobUpdateAction.INSTANCE_ROLLED_BACK,
- JobUpdateAction.INSTANCE_UPDATE_FAILED,
- JobUpdateAction.INSTANCE_ROLLBACK_FAILED
- ]);
-
var instanceActionLookup = _.invert(JobUpdateAction);
var updateUtil = {
@@ -291,9 +284,6 @@
isInstanceSuccessful: function (action) {
return INSTANCE_SUCCESSFUL.hasOwnProperty(action);
},
- isInstanceTerminal: function (action) {
- return INSTANCE_TERMINAL.hasOwnProperty(action);
- },
instanceCountFromRanges: function (ranges) {
// add the deltas of remaining ranges
// note - we don't check for overlapping ranges here
@@ -317,18 +307,6 @@
getInProgressQuery: function () {
return updateUtil.getStatusQuery(ACTIVE_JOB_UPDATE_STATES);
},
- instanceCountFromConfigs: function (instanceTaskConfigs) {
- var flattenedRanges = [];
-
- // get all ranges
- instanceTaskConfigs.forEach(function (iTaskConfig) {
- iTaskConfig.instances.forEach(function (range) {
- flattenedRanges.push(range);
- });
- });
-
- return updateUtil.instanceCountFromRanges(flattenedRanges);
- },
progressFromEvents: function (instanceEvents) {
var successful = updateUtil.getLatestInstanceEvents(instanceEvents, function (e) {
return updateUtil.isInstanceSuccessful(e.action);
@@ -448,39 +426,6 @@
'taskUtil',
function () {
var taskUtil = {
- // Given a list of tasks, group tasks with identical task configs and belonging to
- // contiguous instance ids together.
- summarizeActiveTaskConfigs: function (tasks) {
- return _.chain(tasks)
- .filter(taskUtil.isActiveTask)
- .map(function (task) {
- return {
- instanceId: task.assignedTask.instanceId,
- schedulingDetail: taskUtil.configToDetails(task.assignedTask.task)
- };
- })
- .groupBy(function (task) {
- return JSON.stringify(task.schedulingDetail);
- })
- .map(function (tasks) {
- // Given a list of tasks with the same task config, group the tasks into ranges where
- // each range consists of consecutive task ids along with their task config.
- var schedulingDetail = _.first(tasks).schedulingDetail;
- var ranges = taskUtil.toRanges(_.pluck(tasks, 'instanceId'));
- return _.map(ranges, function (range) {
- return {
- range: range,
- schedulingDetail: schedulingDetail
- };
- });
- })
- .flatten(true)
- .sortBy(function (scheduleDetail) {
- return scheduleDetail.range.start;
- })
- .value();
- },
-
configToDetails: function (task) {
var constraints = _.chain(task.constraints)
.sortBy(function (constraint) {
@@ -520,24 +465,6 @@
};
},
- // Given a list of instanceIds, group them into contiguous ranges.
- toRanges: function (instanceIds) {
- instanceIds = _.sortBy(instanceIds);
- var ranges = [];
- var i = 0;
- var start = instanceIds[i];
- while (i < instanceIds.length) {
- if ((i + 1 === instanceIds.length) || (instanceIds[i] + 1 !== instanceIds[i + 1])) {
- ranges.push({start: start, end: instanceIds[i]});
- i++;
- start = instanceIds[i];
- } else {
- i++;
- }
- }
- return ranges;
- },
-
// A function that converts a task constraint into a string
formatConstraint: function (constraint) {
var taskConstraint = constraint.constraint;
http://git-wip-us.apache.org/repos/asf/aurora/blob/f630bf70/src/test/java/org/apache/aurora/scheduler/thrift/ReadOnlySchedulerImplTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/aurora/scheduler/thrift/ReadOnlySchedulerImplTest.java b/src/test/java/org/apache/aurora/scheduler/thrift/ReadOnlySchedulerImplTest.java
index 64cbd5b..82e7330 100644
--- a/src/test/java/org/apache/aurora/scheduler/thrift/ReadOnlySchedulerImplTest.java
+++ b/src/test/java/org/apache/aurora/scheduler/thrift/ReadOnlySchedulerImplTest.java
@@ -74,6 +74,7 @@ import org.apache.aurora.scheduler.storage.entities.IJobKey;
import org.apache.aurora.scheduler.storage.entities.IJobUpdateDetails;
import org.apache.aurora.scheduler.storage.entities.IJobUpdateQuery;
import org.apache.aurora.scheduler.storage.entities.IJobUpdateSummary;
+import org.apache.aurora.scheduler.storage.entities.IRange;
import org.apache.aurora.scheduler.storage.entities.IResponse;
import org.apache.aurora.scheduler.storage.entities.IScheduledTask;
import org.apache.aurora.scheduler.storage.entities.ITaskConfig;
@@ -86,6 +87,8 @@ import static org.apache.aurora.scheduler.ResourceAggregates.LARGE;
import static org.apache.aurora.scheduler.ResourceAggregates.MEDIUM;
import static org.apache.aurora.scheduler.ResourceAggregates.SMALL;
import static org.apache.aurora.scheduler.ResourceAggregates.XLARGE;
+import static org.apache.aurora.scheduler.base.Numbers.convertRanges;
+import static org.apache.aurora.scheduler.base.Numbers.toRanges;
import static org.apache.aurora.scheduler.thrift.Fixtures.CRON_SCHEDULE;
import static org.apache.aurora.scheduler.thrift.Fixtures.JOB_KEY;
import static org.apache.aurora.scheduler.thrift.Fixtures.LOCK;
@@ -520,10 +523,12 @@ public class ReadOnlySchedulerImplTest extends EasyMockTest {
ConfigGroup group1 = new ConfigGroup()
.setConfig(firstGroupTask)
- .setInstanceIds(Sets.newHashSet(0, 1));
+ .setInstanceIds(Sets.newHashSet(0, 1))
+ .setInstances(IRange.toBuildersSet(convertRanges(toRanges(ImmutableSet.of(0, 1)))));
ConfigGroup group2 = new ConfigGroup()
.setConfig(secondGroupTask)
- .setInstanceIds(Sets.newHashSet(2));
+ .setInstanceIds(Sets.newHashSet(2))
+ .setInstances(IRange.toBuildersSet(convertRanges(toRanges(ImmutableSet.of(2)))));
ConfigSummary summary = new ConfigSummary()
.setKey(key.newBuilder())