public static async Task TestConcurrent(IResourcePool <int, Nothing> pool, int clients) { async Task Call() { int resource = -1; try { do { resource = pool.Acquire(); } while (resource < 0); await Task.Delay(_random.Next(10, 100)); } finally { pool.Release(resource); var stats = pool.Stats(); Assert.Equal(stats.Allocations, stats.Evictions + stats.Idle + stats.InUse); } } var tasks = new List <Task>(); for (var i = 0; i < clients; i++) { var task = Task.Run(Call); tasks.Add(task); } await Task.WhenAll(tasks); Assert.Equal(pool.Stats().Idle, pool.Size); }
private void TakeFromPeerPool(CancellationToken token) { PeerHandler handler = null; while (handler == null) { var peer = _peerPool.Acquire(token); if (peer == null) { _myPool.Add(null); break; } if (!_connectedIps.Contains(peer.IpAddress.ToString())) { handler = ConnectTo(peer); if (handler != null) { handler.SendBitfield(_client.PieceStorage.GetValidPieces().ToByteArray()); AwaitBitfield(handler); handler.StartListening(); return; } else { _peerPool.Realese(peer); } } } }
private void TakeFromPool(IResourcePool <T> pool, CancellationToken cancelToken) { try { T res = pool.Acquire(cancelToken); _myPool.Add(res); } catch (OperationCanceledException) { } }
public void TestAcquire() { var resource = _pool.Acquire(); Assert.IsNotNull(resource); }
public IOperationResult Execute(IOperation op) { IOperationResult result = new BinaryOperationResult(); IPooledSocket socket = null; try { socket = _pool.Acquire(); if (Log.IsDebugEnabled) { Log.DebugFormat("Start execute {0} with {1}", op.Key, socket.InstanceId); } var buffers = op.GetBuffer(); socket.Write(buffers); result = op.ReadResponse(socket); if (result.Success) { result.Pass(); } } catch (NodeShutdownException e) { string msg = String.Format("Node Shutdown - {0}.", EndPoint); Log.DebugFormat("m:{0} i:{1}\n{2}", msg, op.Key, e); result.Fail(msg, e); result.StatusCode = StatusCode.NodeShutdown.ToInt(); } catch (QueueTimeoutException e) { string msg = String.Format("Queue Timeout - {0}.", EndPoint); Log.ErrorFormat("m:{0} i:{1}\n{2}", msg, op.Key, e); result.Fail(msg, e); result.StatusCode = StatusCode.SocketPoolTimeout.ToInt(); } catch (IOException e) { string msg = String.Format("Exception reading response - {0}", EndPoint); Log.ErrorFormat("m:{0} s:{1} i:{2}\n{3}", msg, op.Key, socket == null ? Guid.Empty : socket.InstanceId, e); result.Fail(msg, e); if (result.StatusCode == null || result.StatusCode == StatusCode.Success.ToInt()) { result.StatusCode = StatusCode.InternalError.ToInt(); } } catch (Exception e) { string msg = String.Format("Operation failed - {0}", EndPoint); Log.ErrorFormat("m:{0} s:{1} i:{2}\n{3}", msg, op.Key, socket == null ? Guid.Empty : socket.InstanceId, e); result.Fail(msg, e); if (result.StatusCode == null || result.StatusCode == StatusCode.Success.ToInt()) { result.StatusCode = StatusCode.InternalError.ToInt(); } } finally { if (socket != null) { if (Log.IsDebugEnabled) { Log.DebugFormat("End execute {0} with {1}", op.Key, socket.InstanceId); } _pool.Release(socket); } } if (Log.IsDebugEnabled) { const string msg = "Operation {0} :i {1} n: {2} t: {3} m: {4} sc: {5} r: {6}"; Log.DebugFormat(msg, result.Success ? op.RetryAttempts > 0 ? "succeeded*" : "succeeded" : op.RetryAttempts > 0 ? "failed*" : "failed", op.Key, _endpoint, Thread.CurrentThread.Name, result.Message, Enum.GetName(typeof(StatusCode), result.StatusCode ?? 0), op.RetryAttempts); } return(result); }