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(); } }
public static void CloseSocket(Socket socket) { if (socket == null) { return; } ActionHelper.EatException(() => socket.Close(10000)); }
public static void ShutdownSocket(Socket socket) { if (socket == null) { return; } ActionHelper.EatException(() => socket.Shutdown(SocketShutdown.Both)); ActionHelper.EatException(() => socket.Close(10000)); }
public void Flush() { if (_isMemoryChunk || _isCompleted) { return; } if (_writerWorkItem != null) { ActionHelper.EatException(() => _writerWorkItem.FlushToDisk()); } }
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(); } } } }
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; }
private void SetFileAttributes() { ActionHelper.EatException(() => File.SetAttributes(_filename, FileAttributes.NotContentIndexed)); }