Beispiel #1
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);
                    }
                }
        }
Beispiel #2
0
        public ChunksReader(int workersCount, ISourceReader reader, IGZipCompressor compressor, IWriterTask writerTask, IErrorLogs errorLogs)
        {
            _compressor = compressor;
            _fileReader = reader;
            _writerTask = writerTask;
            _errorLogs  = errorLogs;
            _threads    = new List <Thread>();

            for (int i = 0; i < workersCount; ++i)
            {
                Thread thread = new Thread(Consume)
                {
                    IsBackground = true, Name = $"Background worker (chunks queue): {i}"
                };

                _threads.Add(thread);
                thread.Start();
            }
        }
Beispiel #3
0
 /// <summary>
 /// Is operation active
 /// </summary>
 /// <returns>Result of checking</returns>
 public bool IsActiveOp(IChunksReader chunksReader, IWriterTask writerTask)
 {
     return(chunksReader.IsActive() || writerTask.IsActive());
 }
Beispiel #4
0
        public void FactoryWillCreateFileWriterTaskObj()
        {
            IWriterTask writerTask = _taskFactory.CreatWriterTask(It.IsAny <int>(), It.IsAny <IChunkWriter>(), It.IsAny <IErrorLogs>());

            Assert.IsInstanceOf <FileWriterTask>(writerTask);
        }
Beispiel #5
0
 /// <summary>
 /// Create queue for processing chunks from the source
 /// </summary>
 /// <param name="workersCount">Thread count in queue</param>
 /// <param name="reader">Reader from source</param>
 /// <param name="compressor">Interface for compression, decompression</param>
 /// <param name="writerTask">Task for write data</param>
 /// <param name="errorLogs">Execution error logs</param>
 /// <returns>Chunks queue</returns>
 public IChunksReader CreateChunksReader(int workersCount, ISourceReader reader, IGZipCompressor compressor, IWriterTask writerTask, IErrorLogs errorLogs)
 {
     return(new ChunksReader(workersCount, reader, compressor, writerTask, errorLogs));
 }