예제 #1
0
        /// <summary>
        /// Performs IMRU iterations on map side
        /// </summary>
        /// <param name="memento"></param>
        /// <returns></returns>
        public byte[] Call(byte[] memento)
        {
            MapControlMessage controlMessage = MapControlMessage.AnotherRound;

            while (!_taskCloseCoordinator.ShouldCloseTask() && controlMessage != MapControlMessage.Stop)
            {
                if (_invokeGC)
                {
                    Logger.Log(Level.Verbose, "Calling Garbage Collector");
                    GC.Collect();
                    GC.WaitForPendingFinalizers();
                }

                using (
                    MapInputWithControlMessage <TMapInput> mapInput = _dataAndMessageReceiver.Receive())
                {
                    controlMessage = mapInput.ControlMessage;
                    if (controlMessage != MapControlMessage.Stop)
                    {
                        _dataReducer.Send(_mapTask.Map(mapInput.Message));
                    }
                }
            }

            _taskCloseCoordinator.SignalTaskStopped();
            return(null);
        }
예제 #2
0
        /// <summary>
        /// Performs IMRU iterations on map side
        /// </summary>
        /// <returns></returns>
        protected override byte[] TaskBody(byte[] memento)
        {
            MapControlMessage controlMessage = MapControlMessage.AnotherRound;

            while (!_cancellationSource.IsCancellationRequested && controlMessage != MapControlMessage.Stop)
            {
                if (_invokeGc)
                {
                    Logger.Log(Level.Verbose, "Calling Garbage Collector");
                    GC.Collect();
                    GC.WaitForPendingFinalizers();
                }

                using (
                    MapInputWithControlMessage <TMapInput> mapInput =
                        _dataAndMessageReceiver.Receive(_cancellationSource))
                {
                    controlMessage = mapInput.ControlMessage;
                    if (controlMessage != MapControlMessage.Stop)
                    {
                        TMapOutput output = default(TMapOutput);
                        try
                        {
                            output = _mapTask.Map(mapInput.Message);
                        }
                        catch (Exception e)
                        {
                            HandleTaskAppException(e);
                        }
                        _dataReducer.Send(output, _cancellationSource);
                    }
                }
            }
            return(null);
        }
예제 #3
0
        /// <summary>
        /// Performs IMRU iterations on map side
        /// </summary>
        /// <param name="memento"></param>
        /// <returns></returns>
        public byte[] Call(byte[] memento)
        {
            MapControlMessage controlMessage = MapControlMessage.AnotherRound;

            while (!_cancellationSource.IsCancellationRequested && controlMessage != MapControlMessage.Stop)
            {
                if (_invokeGC)
                {
                    Logger.Log(Level.Verbose, "Calling Garbage Collector");
                    GC.Collect();
                    GC.WaitForPendingFinalizers();
                }

                try
                {
                    using (
                        MapInputWithControlMessage <TMapInput> mapInput = _dataAndMessageReceiver.Receive(_cancellationSource))
                    {
                        controlMessage = mapInput.ControlMessage;
                        if (controlMessage != MapControlMessage.Stop)
                        {
                            _dataReducer.Send(_mapTask.Map(mapInput.Message), _cancellationSource);
                        }
                    }
                }
                catch (OperationCanceledException e)
                {
                    Logger.Log(Level.Warning, "Received OperationCanceledException in MapTaskHost with message: {0}.", e.Message);
                    break;
                }
                catch (IOException e)
                {
                    Logger.Log(Level.Error, "Received IOException in MapTaskHost with message: {0}.", e.Message);
                    if (!_cancellationSource.IsCancellationRequested)
                    {
                        throw new IMRUTaskGroupCommunicationException(TaskManager.TaskGroupCommunicationError);
                    }
                    break;
                }
                catch (TcpClientConnectionException e)
                {
                    Logger.Log(Level.Error, "Received TcpClientConnectionException in MapTaskHost with message: {0}.", e.Message);
                    if (!_cancellationSource.IsCancellationRequested)
                    {
                        throw new IMRUTaskGroupCommunicationException(TaskManager.TaskGroupCommunicationError);
                    }
                    break;
                }
            }

            _taskCloseCoordinator.SignalTaskStopped();
            Logger.Log(Level.Info, "MapTaskHost returned with cancellation token:{0}.", _cancellationSource.IsCancellationRequested);
            return(null);
        }
        /// <summary>
        /// Reads message asynchronously from reader
        /// </summary>
        /// <param name="reader">reader from which to read the message</param>
        /// <param name="token">Cancellation token</param>
        /// <returns>Read message</returns>
        async Task <MapInputWithControlMessage <TMapInput> > IStreamingCodec <MapInputWithControlMessage <TMapInput> > .ReadAsync(
            IDataReader reader, CancellationToken token)
        {
            byte[] messageType = new byte[1];
            await reader.ReadAsync(messageType, 0, 1, token);

            MapControlMessage controlMessage = MapControlMessage.AnotherRound;

            switch (messageType[0])
            {
            case 0:
                controlMessage = MapControlMessage.AnotherRound;
                TMapInput message = await _baseCodec.ReadAsync(reader, token);

                return(new MapInputWithControlMessage <TMapInput>(message, controlMessage));

            case 1:
                controlMessage = MapControlMessage.Stop;
                return(new MapInputWithControlMessage <TMapInput>(controlMessage));
            }

            Exceptions.Throw(new Exception("Control message type not valis in Codec read"), Logger);
            return(null);
        }
예제 #5
0
 /// <summary>
 /// Internal constructor
 /// </summary>
 /// <param name="input">Actual map input</param>
 /// <param name="controlMessage">Control message from Update Function</param>
 internal MapInputWithControlMessage(TMapInput input, MapControlMessage controlMessage)
 {
     Message        = input;
     ControlMessage = controlMessage;
 }
예제 #6
0
 /// <summary>
 /// Internal constructor
 /// </summary>
 /// <param name="controlMessage">Control message from Update Function</param>
 internal MapInputWithControlMessage(MapControlMessage controlMessage)
 {
     ControlMessage = controlMessage;
 }