Пример #1
0
        public void FactoryWillCreateChunksQueueObj()
        {
            IChunksReader chunksReader = _taskFactory.CreateChunksReader(It.IsAny <int>(), It.IsAny <ISourceReader>(),
                                                                         It.IsAny <IGZipCompressor>(), It.IsAny <IWriterTask>(), It.IsAny <IErrorLogs>());

            Assert.IsInstanceOf <ChunksReader>(chunksReader);
        }
Пример #2
0
        /// <summary>
        /// Perform file compression or decompression action
        /// </summary>
        /// <param name="actionType">Action name. Possible values: compress, decompress</param>
        /// <param name="workersCount">Number of threads</param>
        /// <param name="chunkSize">Chunk size in bytes</param>
        /// <param name="errors">Exceptions</param>
        /// <returns>Operation result</returns>
        public bool Execute(string actionType, int workersCount, int chunkSize, out List <Exception> errors)
        {
            ChunksInfo chunkInfos = _fileSplitterFactory.Create(actionType).GetChunks(_inFile, chunkSize);

            using (IWriterTask fileWriterTask = _taskFactory.CreatWriterTask(chunkInfos.ChunksCount, _chunkWriter, _errorLogs))
                using (IChunksReader chunksReader = _taskFactory.CreateChunksReader(workersCount, _sourceReader,
                                                                                    _compressorFactory.Create(actionType), fileWriterTask, _errorLogs))
                {
                    foreach (ChunkReadInfo chunkInfo in chunkInfos.Chunks)
                    {
                        chunksReader.EnqueueChunk(new ChunkReadInfo(chunkInfo.Id, chunkInfo.Offset, chunkInfo.BytesCount));
                    }

                    while (true)
                    {
                        if (!_errorLogs.IsErrorExist(out List <Exception> exceptions))
                        {
                            if (!IsActiveOp(chunksReader, fileWriterTask))
                            {
                                return(!_errorLogs.IsErrorExist(out errors));
                            }

                            continue;
                        }

                        errors = exceptions;
                        return(false);
                    }
                }
        }
Пример #3
0
        public Task Start(TaskParameters parameters)
        {
            _logger.Write($"Starting task with parameters: {parameters}");

            var cancellationTokenSource = new CancellationTokenSource();
            var inputFile  = File.OpenRead(parameters.SourceFullPath);
            var outputFile = File.Create(parameters.DestinationFullPath);
            var inputPipe  = new Pipe(parameters.MaxElementsInPipe);
            var outputPipe = new Pipe(parameters.MaxElementsInPipe);

            var expectedChunksCount = GetExpectedChunksCount(parameters, inputFile, outputFile);

            var           writer = new ChunksWriter(outputPipe, _logger);
            IChunksReader reader = null;
            IEnumerable <IChunksProcessor> processors = null;

            switch (parameters.Mode)
            {
            case ProcessorMode.Compress:
                reader     = new ChunksReader(inputPipe, parameters.ChunkSize, _logger);
                processors = Enumerable.Range(0, parameters.ParallelismDegree).Select(
                    _ => new ChunksCompressor(inputPipe, outputPipe, _logger));
                break;

            case ProcessorMode.Decompress:
                reader     = new CompressedChunksReader(inputPipe, parameters.ChunkSize, _logger);
                processors = Enumerable.Range(0, parameters.ParallelismDegree).Select(
                    _ => new ChunksDecompressor(inputPipe, outputPipe, _logger));
                break;
            }

            var actions = new Action[]
            {
                () =>
                {
                    (reader ?? throw new ArgumentNullException()).ReadFromStream(inputFile, cancellationTokenSource.Token);
                    inputFile.Close();
                },
                () =>
                {
                    writer.WriteToStream(
                        outputFile,
                        cancellationTokenSource.Token,
                        expectedChunksCount,
                        writeChunksLengths: parameters.Mode == ProcessorMode.Compress);
                    outputFile.Close();
                },
            }.Concat((processors ?? throw new ArgumentNullException())
Пример #4
0
 /// <summary>
 /// Is operation active
 /// </summary>
 /// <returns>Result of checking</returns>
 public bool IsActiveOp(IChunksReader chunksReader, IWriterTask writerTask)
 {
     return(chunksReader.IsActive() || writerTask.IsActive());
 }