/**
* 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.
*/
package org.apache.tez.dag.library.vertexmanager;
// Each destination task fetches data from numOfSourceTasks of consecutive
// source tasks with the first source task index being firstSourceTaskIndex.
// For any source task in that range, each destination task fetches
// numOfPartitions consecutive physical outputs with the first physical output
// index being firstPartitionId.
class DestinationTaskInputsProperty {
private final int firstPartitionId;
private final int numOfPartitions;
private final int firstSourceTaskIndex;
private final int numOfSourceTasks;
public DestinationTaskInputsProperty(int firstPartitionId,
int numOfPartitions, int firstSourceTaskIndex, int numOfSourceTasks) {
this.firstPartitionId = firstPartitionId;
this.numOfPartitions = numOfPartitions;
this.firstSourceTaskIndex = firstSourceTaskIndex;
this.numOfSourceTasks = numOfSourceTasks;
}
public int getFirstPartitionId() {
return firstPartitionId;
}
public int getNumOfPartitions() {
return numOfPartitions;
}
public int getFirstSourceTaskIndex() {
return firstSourceTaskIndex;
}
public int getNumOfSourceTasks() {
return numOfSourceTasks;
}
public boolean isSourceTaskInRange(int sourceTaskIndex) {
return firstSourceTaskIndex <= sourceTaskIndex &&
sourceTaskIndex < firstSourceTaskIndex +
numOfSourceTasks;
}
public boolean isPartitionInRange(int partitionId) {
return firstPartitionId <= partitionId &&
partitionId < firstPartitionId + numOfPartitions;
}
// The first physical input index for the source task
public int getFirstPhysicalInputIndex(int sourceTaskIndex) {
return getPhysicalInputIndex(sourceTaskIndex, firstPartitionId);
}
// The physical input index for the physical output index of the source task
public int getPhysicalInputIndex(int sourceTaskIndex, int partitionId) {
if (isSourceTaskInRange(sourceTaskIndex) &&
isPartitionInRange(partitionId)) {
return (sourceTaskIndex - firstSourceTaskIndex) * numOfPartitions +
(partitionId - firstPartitionId);
} else {
return -1;
}
}
public int getNumOfPhysicalInputs() {
return numOfPartitions * numOfSourceTasks;
}
public int getSourceTaskIndex(int physicalInputIndex) {
return firstSourceTaskIndex + physicalInputIndex / numOfPartitions;
}
@Override
public String toString() {
return "firstPartitionId = " + firstPartitionId +
" ,numOfPartitions = " + numOfPartitions +
" ,firstSourceTaskIndex = " + firstSourceTaskIndex +
" ,numOfSourceTasks = " + numOfSourceTasks;
}
}