blob: a344b5170e182fa5ab2ec5d3f883fb2a9c3c1585 [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.
*/
namespace Apache.Ignite.Core.Compute
{
using System;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using Apache.Ignite.Core.Cluster;
using Apache.Ignite.Core.Common;
using Apache.Ignite.Core.Impl.Compute;
/// <summary>
/// Convenience adapter for <see cref="IComputeTask{TArg,TJobRes,TTaskRes}"/> interface
/// </summary>
public abstract class ComputeTaskAdapter<TArg, TJobRes, TTaskRes> : IComputeTask<TArg, TJobRes, TTaskRes>
{
/// <summary>
/// Default implementation which will wait for all jobs to complete before
/// calling <see cref="IComputeTask{A,T,R}.Reduce"/> method.
/// <p/>
/// If remote job resulted in exception <see cref="IComputeJobResult{T}.Exception()"/>
/// is not <c>null</c>),
/// then <see cref="ComputeJobResultPolicy.Failover"/> policy will be returned if
/// the exception is instance of <see cref="ClusterTopologyException"/>
/// or <see cref="ComputeExecutionRejectedException"/>, which means that
/// remote node either failed or job execution was rejected before it got a chance to start. In all
/// other cases the exception will be rethrown which will ultimately cause task to fail.
/// </summary>
/// <param name="res">Received remote Ignite executable result.</param>
/// <param name="rcvd">All previously received results.</param>
/// <returns>Result policy that dictates how to process further upcoming job results.</returns>
[SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods")]
public virtual ComputeJobResultPolicy OnResult(IComputeJobResult<TJobRes> res,
IList<IComputeJobResult<TJobRes>> rcvd)
{
Exception err = res.Exception;
if (err != null)
{
if (Compute.IsFailoverException(err))
return ComputeJobResultPolicy.Failover;
throw new IgniteException("Remote job threw user exception (override or implement " +
"IComputeTask.result(..) method if you would like to have automatic failover for this exception).",
err);
}
return ComputeJobResultPolicy.Wait;
}
/// <summary>
/// This method is called to map or split Ignite task into multiple Ignite jobs. This is the
/// first method that gets called when task execution starts.
/// </summary>
/// <param name="subgrid">Nodes available for this task execution. Note that order of nodes is
/// guaranteed to be randomized by container. This ensures that every time you simply iterate
/// through Ignite nodes, the order of nodes will be random which over time should result into
/// all nodes being used equally.</param>
/// <param name="arg">Task execution argument. Can be <c>null</c>. This is the same argument
/// as the one passed into <c>ICompute.Execute()</c> methods.</param>
/// <returns>
/// Map of Ignite jobs assigned to subgrid node. If <c>null</c> or empty map is returned,
/// exception will be thrown.
/// </returns>
public abstract IDictionary<IComputeJob<TJobRes>, IClusterNode> Map(IList<IClusterNode> subgrid, TArg arg);
/// <summary>
/// Reduces (or aggregates) results received so far into one compound result to be returned to
/// caller via task.
/// <para />
/// Note, that if some jobs did not succeed and could not be failed over then the list of
/// results passed into this method will include the failed results. Otherwise, failed
/// results will not be in the list.
/// </summary>
/// <param name="results">Received job results. Note that if task class has
/// <see cref="ComputeTaskNoResultCacheAttribute" /> attribute, then this list will be empty.</param>
/// <returns>
/// Task result constructed from results of remote executions.
/// </returns>
public abstract TTaskRes Reduce(IList<IComputeJobResult<TJobRes>> results);
}
}