blob: 4357d1da07dce598a7c56cb60c2d6c345d7533c6 [file] [log] [blame]
/*
* 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.ignite.internal;
import java.io.Externalizable;
import java.io.Serializable;
import java.nio.ByteBuffer;
import java.util.Collection;
import java.util.Map;
import java.util.UUID;
import org.apache.ignite.cluster.ClusterNode;
import org.apache.ignite.compute.ComputeJob;
import org.apache.ignite.compute.ComputeJobSibling;
import org.apache.ignite.configuration.DeploymentMode;
import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
import org.apache.ignite.internal.util.tostring.GridToStringExclude;
import org.apache.ignite.internal.util.tostring.GridToStringInclude;
import org.apache.ignite.internal.util.typedef.internal.S;
import org.apache.ignite.internal.util.typedef.internal.U;
import org.apache.ignite.lang.IgnitePredicate;
import org.apache.ignite.lang.IgniteUuid;
import org.apache.ignite.plugin.extensions.communication.MessageCollectionItemType;
import org.apache.ignite.plugin.extensions.communication.MessageReader;
import org.apache.ignite.plugin.extensions.communication.MessageWriter;
import org.jetbrains.annotations.Nullable;
/**
* Job execution request.
*/
public class GridJobExecuteRequest implements ExecutorAwareMessage {
/** */
private static final long serialVersionUID = 0L;
/** Subject ID. */
private UUID subjId;
/** */
private IgniteUuid sesId;
/** */
private IgniteUuid jobId;
/** */
@GridToStringExclude
private byte[] jobBytes;
/** */
@GridToStringExclude
@GridDirectTransient
private ComputeJob job;
/** */
private long startTaskTime;
/** */
private long timeout;
/** */
private String taskName;
/** */
private String userVer;
/** */
private String taskClsName;
/** Node class loader participants. */
@GridToStringInclude
@GridDirectMap(keyType = UUID.class, valueType = IgniteUuid.class)
private Map<UUID, IgniteUuid> ldrParticipants;
/** */
@GridToStringExclude
private byte[] sesAttrsBytes;
/** */
@GridToStringExclude
@GridDirectTransient
private Map<Object, Object> sesAttrs;
/** */
@GridToStringExclude
private byte[] jobAttrsBytes;
/** */
@GridToStringExclude
@GridDirectTransient
private Map<? extends Serializable, ? extends Serializable> jobAttrs;
/** Checkpoint SPI name. */
private String cpSpi;
/** */
@GridDirectTransient
private Collection<ComputeJobSibling> siblings;
/** */
private byte[] siblingsBytes;
/** Transient since needs to hold local creation time. */
@GridDirectTransient
private long createTime = U.currentTimeMillis();
/** */
private IgniteUuid clsLdrId;
/** */
private DeploymentMode depMode;
/** */
private boolean dynamicSiblings;
/** */
private boolean forceLocDep;
/** */
private boolean sesFullSup;
/** */
private boolean internal;
/** */
@GridDirectCollection(UUID.class)
private Collection<UUID> top;
/** */
@GridDirectTransient
private IgnitePredicate<ClusterNode> topPred;
/** */
private byte[] topPredBytes;
/** */
private int[] idsOfCaches;
/** */
private int part;
/** */
private AffinityTopologyVersion topVer;
/** */
private String execName;
/**
* No-op constructor to support {@link Externalizable} interface.
*/
public GridJobExecuteRequest() {
// No-op.
}
/**
* @param sesId Task session ID.
* @param jobId Job ID.
* @param taskName Task name.
* @param userVer Code version.
* @param taskClsName Fully qualified task name.
* @param jobBytes Job serialized body.
* @param job Job.
* @param startTaskTime Task execution start time.
* @param timeout Task execution timeout.
* @param top Topology.
* @param topPred Topology predicate.
* @param topPredBytes Marshalled topology predicate.
* @param siblingsBytes Serialized collection of split siblings.
* @param siblings Collection of split siblings.
* @param sesAttrsBytes Map of session attributes.
* @param sesAttrs Session attributes.
* @param jobAttrsBytes Job context attributes.
* @param jobAttrs Job attributes.
* @param cpSpi Collision SPI.
* @param clsLdrId Task local class loader id.
* @param depMode Task deployment mode.
* @param dynamicSiblings {@code True} if siblings are dynamic.
* @param ldrParticipants Other node class loader IDs that can also load classes.
* @param forceLocDep {@code True} If remote node should ignore deployment settings.
* @param sesFullSup {@code True} if session attributes are disabled.
* @param internal {@code True} if internal job.
* @param subjId Subject ID.
* @param cacheIds Caches' identifiers to reserve partition.
* @param part Partition to lock.
* @param topVer Affinity topology version of job mapping.
* @param execName The name of the custom named executor.
*/
public GridJobExecuteRequest(
IgniteUuid sesId,
IgniteUuid jobId,
String taskName,
String userVer,
String taskClsName,
byte[] jobBytes,
ComputeJob job,
long startTaskTime,
long timeout,
@Nullable Collection<UUID> top,
@Nullable IgnitePredicate<ClusterNode> topPred,
byte[] topPredBytes,
byte[] siblingsBytes,
Collection<ComputeJobSibling> siblings,
byte[] sesAttrsBytes,
Map<Object, Object> sesAttrs,
byte[] jobAttrsBytes,
Map<? extends Serializable, ? extends Serializable> jobAttrs,
String cpSpi,
IgniteUuid clsLdrId,
DeploymentMode depMode,
boolean dynamicSiblings,
Map<UUID, IgniteUuid> ldrParticipants,
boolean forceLocDep,
boolean sesFullSup,
boolean internal,
UUID subjId,
@Nullable int[] cacheIds,
int part,
@Nullable AffinityTopologyVersion topVer,
@Nullable String execName) {
assert sesId != null;
assert jobId != null;
assert taskName != null;
assert taskClsName != null;
assert job != null || jobBytes != null;
assert sesAttrs != null || sesAttrsBytes != null || !sesFullSup;
assert jobAttrs != null || jobAttrsBytes != null;
assert top != null || topPred != null || topPredBytes != null;
assert clsLdrId != null;
assert userVer != null;
assert depMode != null;
this.sesId = sesId;
this.jobId = jobId;
this.taskName = taskName;
this.userVer = userVer;
this.taskClsName = taskClsName;
this.jobBytes = jobBytes;
this.job = job;
this.startTaskTime = startTaskTime;
this.timeout = timeout;
this.top = top;
this.topVer = topVer;
this.topPred = topPred;
this.topPredBytes = topPredBytes;
this.siblingsBytes = siblingsBytes;
this.siblings = siblings;
this.sesAttrsBytes = sesAttrsBytes;
this.sesAttrs = sesAttrs;
this.jobAttrsBytes = jobAttrsBytes;
this.jobAttrs = jobAttrs;
this.clsLdrId = clsLdrId;
this.depMode = depMode;
this.dynamicSiblings = dynamicSiblings;
this.ldrParticipants = ldrParticipants;
this.forceLocDep = forceLocDep;
this.sesFullSup = sesFullSup;
this.internal = internal;
this.subjId = subjId;
this.idsOfCaches = cacheIds;
this.part = part;
this.topVer = topVer;
this.execName = execName;
this.cpSpi = cpSpi == null || cpSpi.isEmpty() ? null : cpSpi;
}
/**
* @return Task session ID.
*/
public IgniteUuid getSessionId() {
return sesId;
}
/**
* @return Job session ID.
*/
public IgniteUuid getJobId() {
return jobId;
}
/**
* @return Task version.
*/
public String getTaskClassName() {
return taskClsName;
}
/**
* @return Task name.
*/
public String getTaskName() {
return taskName;
}
/**
* @return Task version.
*/
public String getUserVersion() {
return userVer;
}
/**
* @return Serialized job bytes.
*/
public byte[] getJobBytes() {
return jobBytes;
}
/**
* @return Grid job.
*/
public ComputeJob getJob() {
return job;
}
/**
* @return Task start time.
*/
public long getStartTaskTime() {
return startTaskTime;
}
/**
* @return Timeout.
*/
public long getTimeout() {
return timeout;
}
/**
* Gets this instance creation time.
*
* @return This instance creation time.
*/
public long getCreateTime() {
return createTime;
}
/**
* @return Serialized collection of split siblings.
*/
public byte[] getSiblingsBytes() {
return siblingsBytes;
}
/**
* @return Job siblings.
*/
public Collection<ComputeJobSibling> getSiblings() {
return siblings;
}
/**
* @return Session attributes.
*/
public byte[] getSessionAttributesBytes() {
return sesAttrsBytes;
}
/**
* @return Session attributes.
*/
public Map<Object, Object> getSessionAttributes() {
return sesAttrs;
}
/**
* @return Job attributes.
*/
public byte[] getJobAttributesBytes() {
return jobAttrsBytes;
}
/**
* @return Job attributes.
*/
public Map<? extends Serializable, ? extends Serializable> getJobAttributes() {
return jobAttrs;
}
/**
* @return Checkpoint SPI name.
*/
public String getCheckpointSpi() {
return cpSpi;
}
/**
* @return Task local class loader id.
*/
public IgniteUuid getClassLoaderId() {
return clsLdrId;
}
/**
* @return Deployment mode.
*/
public DeploymentMode getDeploymentMode() {
return depMode;
}
/**
* Returns true if siblings list is dynamic, i.e. task is continuous.
*
* @return True if siblings list is dynamic.
*/
public boolean isDynamicSiblings() {
return dynamicSiblings;
}
/**
* @return Node class loader participant map.
*/
public Map<UUID, IgniteUuid> getLoaderParticipants() {
return ldrParticipants;
}
/**
* @return Returns {@code true} if deployment should always be used.
*/
public boolean isForceLocalDeployment() {
return forceLocDep;
}
/**
* @return Topology.
*/
@Nullable public Collection<UUID> topology() {
return top;
}
/**
* @return Topology predicate.
*/
public IgnitePredicate<ClusterNode> getTopologyPredicate() {
return topPred;
}
/**
* @return Marshalled topology predicate.
*/
public byte[] getTopologyPredicateBytes() {
return topPredBytes;
}
/**
* @return {@code True} if session attributes are enabled.
*/
public boolean isSessionFullSupport() {
return sesFullSup;
}
/**
* @return {@code True} if internal job.
*/
public boolean isInternal() {
return internal;
}
/**
* @return Subject ID.
*/
public UUID getSubjectId() {
return subjId;
}
/**
* @return Caches' identifiers to reserve specified partition for job execution.
*/
public int[] getCacheIds() {
return idsOfCaches;
}
/**
* @return Partitions to lock for job execution.
*/
public int getPartition() {
return part;
}
/** {@inheritDoc} */
@Override public String executorName() {
return execName;
}
/**
* @return Affinity version which was used to map job
*/
public AffinityTopologyVersion getTopVer() {
return topVer;
}
/** {@inheritDoc} */
@Override public void onAckReceived() {
// No-op.
}
/** {@inheritDoc} */
@Override public boolean writeTo(ByteBuffer buf, MessageWriter writer) {
writer.setBuffer(buf);
if (!writer.isHeaderWritten()) {
if (!writer.writeHeader(directType(), fieldsCount()))
return false;
writer.onHeaderWritten();
}
switch (writer.state()) {
case 0:
if (!writer.writeIgniteUuid("clsLdrId", clsLdrId))
return false;
writer.incrementState();
case 1:
if (!writer.writeString("cpSpi", cpSpi))
return false;
writer.incrementState();
case 2:
if (!writer.writeByte("depMode", depMode != null ? (byte)depMode.ordinal() : -1))
return false;
writer.incrementState();
case 3:
if (!writer.writeBoolean("dynamicSiblings", dynamicSiblings))
return false;
writer.incrementState();
case 4:
if (!writer.writeString("execName", execName))
return false;
writer.incrementState();
case 5:
if (!writer.writeBoolean("forceLocDep", forceLocDep))
return false;
writer.incrementState();
case 6:
if (!writer.writeIntArray("idsOfCaches", idsOfCaches))
return false;
writer.incrementState();
case 7:
if (!writer.writeBoolean("internal", internal))
return false;
writer.incrementState();
case 8:
if (!writer.writeByteArray("jobAttrsBytes", jobAttrsBytes))
return false;
writer.incrementState();
case 9:
if (!writer.writeByteArray("jobBytes", jobBytes))
return false;
writer.incrementState();
case 10:
if (!writer.writeIgniteUuid("jobId", jobId))
return false;
writer.incrementState();
case 11:
if (!writer.writeMap("ldrParticipants", ldrParticipants, MessageCollectionItemType.UUID, MessageCollectionItemType.IGNITE_UUID))
return false;
writer.incrementState();
case 12:
if (!writer.writeInt("part", part))
return false;
writer.incrementState();
case 13:
if (!writer.writeByteArray("sesAttrsBytes", sesAttrsBytes))
return false;
writer.incrementState();
case 14:
if (!writer.writeBoolean("sesFullSup", sesFullSup))
return false;
writer.incrementState();
case 15:
if (!writer.writeIgniteUuid("sesId", sesId))
return false;
writer.incrementState();
case 16:
if (!writer.writeByteArray("siblingsBytes", siblingsBytes))
return false;
writer.incrementState();
case 17:
if (!writer.writeLong("startTaskTime", startTaskTime))
return false;
writer.incrementState();
case 18:
if (!writer.writeUuid("subjId", subjId))
return false;
writer.incrementState();
case 19:
if (!writer.writeString("taskClsName", taskClsName))
return false;
writer.incrementState();
case 20:
if (!writer.writeString("taskName", taskName))
return false;
writer.incrementState();
case 21:
if (!writer.writeLong("timeout", timeout))
return false;
writer.incrementState();
case 22:
if (!writer.writeCollection("top", top, MessageCollectionItemType.UUID))
return false;
writer.incrementState();
case 23:
if (!writer.writeByteArray("topPredBytes", topPredBytes))
return false;
writer.incrementState();
case 24:
if (!writer.writeMessage("topVer", topVer))
return false;
writer.incrementState();
case 25:
if (!writer.writeString("userVer", userVer))
return false;
writer.incrementState();
}
return true;
}
/** {@inheritDoc} */
@Override public boolean readFrom(ByteBuffer buf, MessageReader reader) {
reader.setBuffer(buf);
if (!reader.beforeMessageRead())
return false;
switch (reader.state()) {
case 0:
clsLdrId = reader.readIgniteUuid("clsLdrId");
if (!reader.isLastRead())
return false;
reader.incrementState();
case 1:
cpSpi = reader.readString("cpSpi");
if (!reader.isLastRead())
return false;
reader.incrementState();
case 2:
byte depModeOrd;
depModeOrd = reader.readByte("depMode");
if (!reader.isLastRead())
return false;
depMode = DeploymentMode.fromOrdinal(depModeOrd);
reader.incrementState();
case 3:
dynamicSiblings = reader.readBoolean("dynamicSiblings");
if (!reader.isLastRead())
return false;
reader.incrementState();
case 4:
execName = reader.readString("execName");
if (!reader.isLastRead())
return false;
reader.incrementState();
case 5:
forceLocDep = reader.readBoolean("forceLocDep");
if (!reader.isLastRead())
return false;
reader.incrementState();
case 6:
idsOfCaches = reader.readIntArray("idsOfCaches");
if (!reader.isLastRead())
return false;
reader.incrementState();
case 7:
internal = reader.readBoolean("internal");
if (!reader.isLastRead())
return false;
reader.incrementState();
case 8:
jobAttrsBytes = reader.readByteArray("jobAttrsBytes");
if (!reader.isLastRead())
return false;
reader.incrementState();
case 9:
jobBytes = reader.readByteArray("jobBytes");
if (!reader.isLastRead())
return false;
reader.incrementState();
case 10:
jobId = reader.readIgniteUuid("jobId");
if (!reader.isLastRead())
return false;
reader.incrementState();
case 11:
ldrParticipants = reader.readMap("ldrParticipants", MessageCollectionItemType.UUID, MessageCollectionItemType.IGNITE_UUID, false);
if (!reader.isLastRead())
return false;
reader.incrementState();
case 12:
part = reader.readInt("part");
if (!reader.isLastRead())
return false;
reader.incrementState();
case 13:
sesAttrsBytes = reader.readByteArray("sesAttrsBytes");
if (!reader.isLastRead())
return false;
reader.incrementState();
case 14:
sesFullSup = reader.readBoolean("sesFullSup");
if (!reader.isLastRead())
return false;
reader.incrementState();
case 15:
sesId = reader.readIgniteUuid("sesId");
if (!reader.isLastRead())
return false;
reader.incrementState();
case 16:
siblingsBytes = reader.readByteArray("siblingsBytes");
if (!reader.isLastRead())
return false;
reader.incrementState();
case 17:
startTaskTime = reader.readLong("startTaskTime");
if (!reader.isLastRead())
return false;
reader.incrementState();
case 18:
subjId = reader.readUuid("subjId");
if (!reader.isLastRead())
return false;
reader.incrementState();
case 19:
taskClsName = reader.readString("taskClsName");
if (!reader.isLastRead())
return false;
reader.incrementState();
case 20:
taskName = reader.readString("taskName");
if (!reader.isLastRead())
return false;
reader.incrementState();
case 21:
timeout = reader.readLong("timeout");
if (!reader.isLastRead())
return false;
reader.incrementState();
case 22:
top = reader.readCollection("top", MessageCollectionItemType.UUID);
if (!reader.isLastRead())
return false;
reader.incrementState();
case 23:
topPredBytes = reader.readByteArray("topPredBytes");
if (!reader.isLastRead())
return false;
reader.incrementState();
case 24:
topVer = reader.readMessage("topVer");
if (!reader.isLastRead())
return false;
reader.incrementState();
case 25:
userVer = reader.readString("userVer");
if (!reader.isLastRead())
return false;
reader.incrementState();
}
return reader.afterMessageRead(GridJobExecuteRequest.class);
}
/** {@inheritDoc} */
@Override public short directType() {
return 1;
}
/** {@inheritDoc} */
@Override public byte fieldsCount() {
return 26;
}
/** {@inheritDoc} */
@Override public String toString() {
return S.toString(GridJobExecuteRequest.class, this);
}
}