Repository: helix Updated Branches: refs/heads/master 3870ab0f3 -> ebbd6ba2e
[HELIX-715] Add NOP classes for quota management support The following classes and interfaces were added: TaskAssigner, AssignableInstance, and TaskAssignResult. Project: http://git-wip-us.apache.org/repos/asf/helix/repo Commit: http://git-wip-us.apache.org/repos/asf/helix/commit/ebbd6ba2 Tree: http://git-wip-us.apache.org/repos/asf/helix/tree/ebbd6ba2 Diff: http://git-wip-us.apache.org/repos/asf/helix/diff/ebbd6ba2 Branch: refs/heads/master Commit: ebbd6ba2ed57e75e5fe3506aa6fcd9f5938330fd Parents: 3870ab0 Author: Hunter Lee <[email protected]> Authored: Mon Jul 9 12:28:39 2018 -0700 Committer: Hunter Lee <[email protected]> Committed: Mon Jul 9 13:58:49 2018 -0700 ---------------------------------------------------------------------- .../helix/task/assigner/AssignableInstance.java | 99 ++++++++++++++++++++ .../helix/task/assigner/TaskAssignResult.java | 69 ++++++++++++++ .../helix/task/assigner/TaskAssigner.java | 37 ++++++++ 3 files changed, 205 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/helix/blob/ebbd6ba2/helix-core/src/main/java/org/apache/helix/task/assigner/AssignableInstance.java ---------------------------------------------------------------------- diff --git a/helix-core/src/main/java/org/apache/helix/task/assigner/AssignableInstance.java b/helix-core/src/main/java/org/apache/helix/task/assigner/AssignableInstance.java new file mode 100644 index 0000000..fe59275 --- /dev/null +++ b/helix-core/src/main/java/org/apache/helix/task/assigner/AssignableInstance.java @@ -0,0 +1,99 @@ +package org.apache.helix.task.assigner; + +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import java.util.Map; +import org.apache.helix.model.ClusterConfig; +import org.apache.helix.model.InstanceConfig; +import org.apache.helix.model.LiveInstance; +import org.apache.helix.task.TaskConfig; + +/** + * AssignableInstance contains instance capacity profile and methods that control capacity and help + * with task assignment. + */ +public class AssignableInstance { + + /** + * Caches tasks currently assigned to this instance. + * Every pipeline iteration will compare Task states in this map to Task states in TaskDataCache. + * Tasks in a terminal state (finished or failed) will be removed as soon as they reach the state. + */ + private Map<String, TaskAssignResult> _currentAssignments; + private ClusterConfig _clusterConfig; + private InstanceConfig _instanceConfig; + private LiveInstance _liveInstance; + + public AssignableInstance(ClusterConfig clusterConfig, InstanceConfig instanceConfig, + LiveInstance liveInstance) { + _clusterConfig = clusterConfig; + _instanceConfig = instanceConfig; + _liveInstance = liveInstance; + } + + /** + * Tries to assign the given task on this instance and returns TaskAssignResult. Instance capacity + * profile is NOT modified by tryAssign. + * @param task + * @return + */ + public TaskAssignResult tryAssign(TaskConfig task) { + // TODO: implement + return null; + } + + /** + * Performs the following to accept a task: + * 1. Deduct the amount of resource required by this task + * 2. Add this TaskAssignResult to _currentAssignments + * @param result + * @throws IllegalStateException if TaskAssignResult is not successful + */ + public void assign(TaskAssignResult result) throws IllegalStateException { + // TODO: implement + return; + } + + /** + * Performs the following to release resource for a task: + * 1. Release the resource by adding back what the task required. + * 2. Remove the TaskAssignResult from _currentAssignments + * @param taskID + * @throws IllegalArgumentException if task is not found + */ + public void release(String taskID) throws IllegalArgumentException { + // TODO: implement + return; + } + + /** + * Returns taskID -> TaskAssignResult mappings. + */ + public Map<String, TaskAssignResult> getCurrentAssignments() { + return _currentAssignments; + } + + /** + * Returns the name of this instance. + */ + public String getInstanceName() { + return _instanceConfig.getInstanceName(); + } +} http://git-wip-us.apache.org/repos/asf/helix/blob/ebbd6ba2/helix-core/src/main/java/org/apache/helix/task/assigner/TaskAssignResult.java ---------------------------------------------------------------------- diff --git a/helix-core/src/main/java/org/apache/helix/task/assigner/TaskAssignResult.java b/helix-core/src/main/java/org/apache/helix/task/assigner/TaskAssignResult.java new file mode 100644 index 0000000..3515cbb --- /dev/null +++ b/helix-core/src/main/java/org/apache/helix/task/assigner/TaskAssignResult.java @@ -0,0 +1,69 @@ +package org.apache.helix.task.assigner; + +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import org.apache.helix.task.TaskConfig; + +/** + * TaskAssignResult represents assignment metadata for a task and is created by TaskAssigner. + */ +public class TaskAssignResult { + + public enum FailureReason { + // Instance does not have sufficient resource quota + INSUFFICIENT_QUOTA + } + + private boolean isAssignmentSuccessful; + + /** + * Returns if the task is successfully assigned or not. + * @return true if assignment was successful. False otherwise + */ + public boolean isSuccessful() { + return isAssignmentSuccessful; + } + + /** + * Returns TaskConfig of this TaskAssignResult. + */ + public TaskConfig getTaskConfig() { + // TODO: implement + return new TaskConfig(null, null); + } + + /** + * Returns the name of the instance this task was assigned to. + * @return instance name. Null if assignment was not successful + */ + public String getInstanceName() { + // TODO: implement + return null; + } + + /** + * Returns the reason for assignment failure. + * @return a FailureReason instance. Null if assignment was successful + */ + public FailureReason getFailureReason() { + // TODO: implement + return null; + } +} http://git-wip-us.apache.org/repos/asf/helix/blob/ebbd6ba2/helix-core/src/main/java/org/apache/helix/task/assigner/TaskAssigner.java ---------------------------------------------------------------------- diff --git a/helix-core/src/main/java/org/apache/helix/task/assigner/TaskAssigner.java b/helix-core/src/main/java/org/apache/helix/task/assigner/TaskAssigner.java new file mode 100644 index 0000000..66614a2 --- /dev/null +++ b/helix-core/src/main/java/org/apache/helix/task/assigner/TaskAssigner.java @@ -0,0 +1,37 @@ +package org.apache.helix.task.assigner; + +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import java.util.Map; +import org.apache.helix.task.TaskConfig; + +public interface TaskAssigner { + + /** + * Assign a collection of tasks on a collection of assignableInstances. + * When an assignment decision is made, AssignableInstance.assign() must be called for the + * instance to modify its internal capacity profile. + * @param assignableInstances + * @param tasks + * @return taskID -> TaskAssignmentResult mapping per task + */ + Map<String, TaskAssignResult> assignTasks(Iterable<AssignableInstance> assignableInstances, + Iterable<TaskConfig> tasks); +}
