/// <summary> /// Executes given task on the grid projection. For step-by-step explanation of task execution process /// refer to <see cref="IComputeTask{A,T,R}"/> documentation. /// </summary> /// <param name="task">Task to execute.</param> /// <param name="taskArg">Optional task argument.</param> /// <returns>Task result.</returns> public IFuture <TR> Execute <TA, T, TR>(IComputeTask <TA, T, TR> task, TA taskArg) { IgniteArgumentCheck.NotNull(task, "task"); var holder = new ComputeTaskHolder <TA, T, TR>((Ignite)_prj.Ignite, this, task, taskArg); long ptr = Marshaller.Ignite.HandleRegistry.Allocate(holder); UU.ComputeExecuteNative(Target, ptr, _prj.TopologyVersion); return(holder.Future); }
/// <summary> /// Executes given task on the grid projection. For step-by-step explanation of task execution process /// refer to <see cref="IComputeTask{A,T,R}"/> documentation. /// </summary> /// <param name="task">Task to execute.</param> /// <param name="taskArg">Optional task argument.</param> /// <returns>Task result.</returns> public Future <TReduceRes> Execute <TArg, TJobRes, TReduceRes>(IComputeTask <TArg, TJobRes, TReduceRes> task, TArg taskArg) { IgniteArgumentCheck.NotNull(task, "task"); var holder = new ComputeTaskHolder <TArg, TJobRes, TReduceRes>((Ignite)_prj.Ignite, this, task, taskArg); long ptr = Marshaller.Ignite.HandleRegistry.Allocate(holder); var futTarget = UU.ComputeExecuteNative(Target, ptr, _prj.TopologyVersion); var future = holder.Future; future.SetTarget(futTarget); return(future); }
/// <summary> /// Executes given task on the grid projection. For step-by-step explanation of task execution process /// refer to <see cref="IComputeTask{A,T,R}"/> documentation. /// </summary> /// <param name="task">Task to execute.</param> /// <param name="taskArg">Optional task argument.</param> /// <returns>Task result.</returns> public Future <TReduceRes> Execute <TArg, TJobRes, TReduceRes>(IComputeTask <TArg, TJobRes, TReduceRes> task, TArg taskArg) { IgniteArgumentCheck.NotNull(task, "task"); var holder = new ComputeTaskHolder <TArg, TJobRes, TReduceRes>((Ignite)_prj.Ignite, this, task, taskArg); long ptr = Marshaller.Ignite.HandleRegistry.Allocate(holder); var futTarget = DoOutOpObject(OpExecNative, (IBinaryStream s) => { s.WriteLong(ptr); s.WriteLong(_prj.TopologyVersion); }); var future = holder.Future; future.SetTarget(new Listenable(futTarget)); return(future); }
private Future <TReduceRes> ExecuteClosures0 <TArg, TJobRes, TReduceRes>( IComputeTask <TArg, TJobRes, TReduceRes> task, IComputeJob job = null, IEnumerable <IComputeJob> jobs = null, int opId = OpUnicast, int jobsCount = 0, Action <BinaryWriter> writeAction = null) { Debug.Assert(job != null || jobs != null); var holder = new ComputeTaskHolder <TArg, TJobRes, TReduceRes>((Ignite)_prj.Ignite, this, task, default(TArg)); var taskHandle = Marshaller.Ignite.HandleRegistry.Allocate(holder); var jobHandles = new List <long>(job != null ? 1 : jobsCount); try { Exception err = null; try { var futTarget = DoOutOpObject(opId, writer => { writer.WriteLong(taskHandle); if (job != null) { writer.WriteInt(1); jobHandles.Add(WriteJob(job, writer)); } else { writer.WriteInt(jobsCount); Debug.Assert(jobs != null, "jobs != null"); jobHandles.AddRange(jobs.Select(jobEntry => WriteJob(jobEntry, writer))); } holder.JobHandles(jobHandles); if (writeAction != null) { writeAction(writer); } }); holder.Future.SetTarget(new Listenable(futTarget)); } catch (Exception e) { err = e; } if (err != null) { // Manual job handles release because they were not assigned to the task yet. foreach (var hnd in jobHandles) { Marshaller.Ignite.HandleRegistry.Release(hnd); } holder.CompleteWithError(taskHandle, err); } } catch (Exception e) { // This exception means that out-op failed. holder.CompleteWithError(taskHandle, e); } return(holder.Future); }