示例#1
0
        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);
        }
示例#2
0
        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);
                    }
                }
            }
        }
示例#3
0
 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);
        }
示例#5
0
        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);
        }