예제 #1
0
파일: Chunk.cs 프로젝트: zhyzhy782/BodeAbp
        public void Close()
        {
            lock (_writeSyncObj)
            {
                if (!_isCompleted)
                {
                    Flush();
                }

                if (_writerWorkItem != null)
                {
                    ActionHelper.EatException(() => _writerWorkItem.Dispose());
                    _writerWorkItem = null;
                }

                if (!_isMemoryChunk)
                {
                    if (_cacheItems != null)
                    {
                        _cacheItems = null;
                    }
                }
                CloseAllReaderWorkItems();
                FreeMemory();
            }
        }
예제 #2
0
        public static void CloseSocket(Socket socket)
        {
            if (socket == null)
            {
                return;
            }

            ActionHelper.EatException(() => socket.Close(10000));
        }
예제 #3
0
 public static void ShutdownSocket(Socket socket)
 {
     if (socket == null)
     {
         return;
     }
     ActionHelper.EatException(() => socket.Shutdown(SocketShutdown.Both));
     ActionHelper.EatException(() => socket.Close(10000));
 }
예제 #4
0
파일: Chunk.cs 프로젝트: zhyzhy782/BodeAbp
 public void Flush()
 {
     if (_isMemoryChunk || _isCompleted)
     {
         return;
     }
     if (_writerWorkItem != null)
     {
         ActionHelper.EatException(() => _writerWorkItem.FlushToDisk());
     }
 }
예제 #5
0
파일: Chunk.cs 프로젝트: zhyzhy782/BodeAbp
        public void Complete()
        {
            lock (_writeSyncObj)
            {
                if (_isCompleted)
                {
                    return;
                }

                _chunkFooter = WriteFooter();
                if (!_isMemoryChunk)
                {
                    Flush();
                }

                _isCompleted = true;

                if (_writerWorkItem != null)
                {
                    ActionHelper.EatException(() => _writerWorkItem.Dispose());
                    _writerWorkItem = null;
                }

                if (!_isMemoryChunk)
                {
                    if (_cacheItems != null)
                    {
                        _cacheItems = null;
                    }

                    SetFileAttributes();
                    if (_memoryChunk != null)
                    {
                        _memoryChunk.Complete();
                    }
                }
            }
        }
예제 #6
0
파일: Chunk.cs 프로젝트: zhyzhy782/BodeAbp
        private void InitNew(int chunkNumber)
        {
            var chunkDataSize = 0;

            if (_chunkConfig.ChunkDataSize > 0)
            {
                chunkDataSize = _chunkConfig.ChunkDataSize;
            }
            else
            {
                chunkDataSize = _chunkConfig.ChunkDataUnitSize * _chunkConfig.ChunkDataCount;
            }

            _chunkHeader = new ChunkHeader(chunkNumber, chunkDataSize);

            _isCompleted = false;

            var fileSize = ChunkHeader.Size + _chunkHeader.ChunkDataTotalSize + ChunkFooter.Size;

            var writeStream    = default(Stream);
            var tempFilename   = string.Format("{0}.{1}.tmp", _filename, Guid.NewGuid());
            var tempFileStream = default(FileStream);

            try
            {
                if (_isMemoryChunk)
                {
                    _cachedLength = fileSize;
                    _cachedData   = Marshal.AllocHGlobal(_cachedLength);
                    writeStream   = new UnmanagedMemoryStream((byte *)_cachedData, _cachedLength, _cachedLength, FileAccess.ReadWrite);
                    writeStream.Write(_chunkHeader.AsByteArray(), 0, ChunkHeader.Size);
                }
                else
                {
                    var fileInfo = new FileInfo(_filename);
                    if (fileInfo.Exists)
                    {
                        File.SetAttributes(_filename, FileAttributes.Normal);
                        File.Delete(_filename);
                    }

                    tempFileStream = new FileStream(tempFilename, FileMode.CreateNew, FileAccess.ReadWrite, FileShare.Read, _chunkConfig.ChunkWriteBuffer, FileOptions.None);
                    tempFileStream.SetLength(fileSize);
                    tempFileStream.Write(_chunkHeader.AsByteArray(), 0, ChunkHeader.Size);
                    tempFileStream.Flush(true);
                    tempFileStream.Close();

                    File.Move(tempFilename, _filename);

                    var fileStream = new FileStream(_filename, FileMode.Open, FileAccess.ReadWrite, FileShare.Read, _chunkConfig.ChunkWriteBuffer, FileOptions.SequentialScan);
                    writeStream = new BufferedStream(fileStream, _chunkConfig.ChunkWriteBuffer);
                    SetFileAttributes();
                }

                writeStream.Position = ChunkHeader.Size;

                _dataPosition        = 0;
                _flushedDataPosition = 0;
                _writerWorkItem      = new WriterWorkItem(writeStream);

                InitializeReaderWorkItems();

                if (!_isMemoryChunk)
                {
                    if (_chunkConfig.EnableCache)
                    {
                        var chunkSize = (ulong)GetChunkSize(_chunkHeader);
                        if (ChunkUtil.IsMemoryEnoughToCacheChunk(chunkSize, (uint)_chunkConfig.ChunkCacheMaxPercent))
                        {
                            try
                            {
                                _memoryChunk = CreateNew(_filename, chunkNumber, _chunkManager, _chunkConfig, true);
                            }
                            catch (OutOfMemoryException)
                            {
                                _cacheItems = new CacheItem[_chunkConfig.ChunkLocalCacheSize];
                            }
                            catch (Exception ex)
                            {
                                _logger.Error(string.Format("Failed to cache new chunk {0}", this), ex);
                                _cacheItems = new CacheItem[_chunkConfig.ChunkLocalCacheSize];
                            }
                        }
                        else
                        {
                            _cacheItems = new CacheItem[_chunkConfig.ChunkLocalCacheSize];
                        }
                    }
                    else
                    {
                        _cacheItems = new CacheItem[_chunkConfig.ChunkLocalCacheSize];
                    }
                }
            }
            catch
            {
                if (!_isMemoryChunk)
                {
                    if (tempFileStream != null)
                    {
                        ActionHelper.EatException(() => tempFileStream.Close());
                    }
                    if (File.Exists(tempFilename))
                    {
                        ActionHelper.EatException(() =>
                        {
                            File.SetAttributes(tempFilename, FileAttributes.Normal);
                            File.Delete(tempFilename);
                        });
                    }
                }
                throw;
            }

            _lastActiveTime = DateTime.Now;
        }
예제 #7
0
파일: Chunk.cs 프로젝트: zhyzhy782/BodeAbp
 private void SetFileAttributes()
 {
     ActionHelper.EatException(() => File.SetAttributes(_filename, FileAttributes.NotContentIndexed));
 }