コード例 #1
0
ファイル: AsyncRequestQueueTests.cs プロジェクト: ExM/NLog
        public void AsyncRequestQueueClearTest()
        {
            var ev1 = LogEventInfo.CreateNullEvent().WithContinuation(ex => { });
            var ev2 = LogEventInfo.CreateNullEvent().WithContinuation(ex => { });
            var ev3 = LogEventInfo.CreateNullEvent().WithContinuation(ex => { });
            var ev4 = LogEventInfo.CreateNullEvent().WithContinuation(ex => { });

            var queue = new AsyncRequestQueue(3, AsyncTargetWrapperOverflowAction.Grow);
            Assert.AreEqual(3, queue.RequestLimit);
            Assert.AreEqual(AsyncTargetWrapperOverflowAction.Grow, queue.OnOverflow);
            Assert.AreEqual(0, queue.RequestCount);
            queue.Enqueue(ev1);
            Assert.AreEqual(1, queue.RequestCount);
            queue.Enqueue(ev2);
            Assert.AreEqual(2, queue.RequestCount);
            queue.Enqueue(ev3);
            Assert.AreEqual(3, queue.RequestCount);
            queue.Enqueue(ev4);
            Assert.AreEqual(4, queue.RequestCount);
            queue.Clear();
            Assert.AreEqual(0, queue.RequestCount);

            AsyncLogEventInfo[] logEventInfos;

            logEventInfos = queue.DequeueBatch(10);
            int result = logEventInfos.Length;
            Assert.AreEqual(0, result);
            Assert.AreEqual(0, queue.RequestCount);
        }
コード例 #2
0
        public void AsyncRequestQueueWithDiscardBehaviorTest()
        {
            var ev1 = LogEventInfo.CreateNullEvent().WithContinuation(ex => { });
            var ev2 = LogEventInfo.CreateNullEvent().WithContinuation(ex => { });
            var ev3 = LogEventInfo.CreateNullEvent().WithContinuation(ex => { });
            var ev4 = LogEventInfo.CreateNullEvent().WithContinuation(ex => { });

            var queue = new AsyncRequestQueue(3, AsyncTargetWrapperOverflowAction.Discard);
            Assert.AreEqual(3, queue.RequestLimit);
            Assert.AreEqual(AsyncTargetWrapperOverflowAction.Discard, queue.OnOverflow);
            Assert.AreEqual(0, queue.RequestCount);
            queue.Enqueue(ev1);
            Assert.AreEqual(1, queue.RequestCount);
            queue.Enqueue(ev2);
            Assert.AreEqual(2, queue.RequestCount);
            queue.Enqueue(ev3);
            Assert.AreEqual(3, queue.RequestCount);
            queue.Enqueue(ev4);
            Assert.AreEqual(3, queue.RequestCount);

            AsyncLogEventInfo[] logEventInfos = queue.DequeueBatch(10);
            Assert.AreEqual(0, queue.RequestCount);

            // ev1 is lost
            Assert.AreSame(logEventInfos[0].LogEvent, ev2.LogEvent);
            Assert.AreSame(logEventInfos[1].LogEvent, ev3.LogEvent);
            Assert.AreSame(logEventInfos[2].LogEvent, ev4.LogEvent);
            Assert.AreSame(logEventInfos[0].Continuation, ev2.Continuation);
            Assert.AreSame(logEventInfos[1].Continuation, ev3.Continuation);
            Assert.AreSame(logEventInfos[2].Continuation, ev4.Continuation);
        }
コード例 #3
0
ファイル: AsyncRequestQueueTests.cs プロジェクト: igalse/NLog
        public void AsyncRequestQueueClearTest()
        {
            AsyncContinuation cont1 = ex => { };
            AsyncContinuation cont2 = ex => { };
            AsyncContinuation cont3 = ex => { };
            AsyncContinuation cont4 = ex => { };
            AsyncContinuation cont5 = ex => { };

            var ev1 = LogEventInfo.CreateNullEvent();
            var ev2 = LogEventInfo.CreateNullEvent();
            var ev3 = LogEventInfo.CreateNullEvent();
            var ev4 = LogEventInfo.CreateNullEvent();
            var ev5 = LogEventInfo.CreateNullEvent();

            var queue = new AsyncRequestQueue(3, AsyncTargetWrapperOverflowAction.Grow);
            Assert.AreEqual(3, queue.RequestLimit);
            Assert.AreEqual(AsyncTargetWrapperOverflowAction.Grow, queue.OnOverflow);
            Assert.AreEqual(0, queue.RequestCount);
            queue.Enqueue(ev1, cont1);
            Assert.AreEqual(1, queue.RequestCount);
            queue.Enqueue(ev2, cont2);
            Assert.AreEqual(2, queue.RequestCount);
            queue.Enqueue(ev3, cont3);
            Assert.AreEqual(3, queue.RequestCount);
            queue.Enqueue(ev4, cont4);
            Assert.AreEqual(4, queue.RequestCount);
            queue.Clear();
            Assert.AreEqual(0, queue.RequestCount);

            LogEventInfo[] logEventInfos;
            AsyncContinuation[] asyncContinuations;

            int result = queue.DequeueBatch(10, out logEventInfos, out asyncContinuations);
            Assert.AreEqual(result, logEventInfos.Length);
            Assert.AreEqual(result, asyncContinuations.Length);

            Assert.AreEqual(0, result);
            Assert.AreEqual(0, queue.RequestCount);
        }
コード例 #4
0
        /// <summary>
        /// Adds the specified log event to the buffer and flushes
        /// the buffer in case the buffer gets full.
        /// </summary>
        /// <param name="logEvent">The log event.</param>
        protected override void Write(AsyncLogEventInfo logEvent)
        {
            PrecalculateVolatileLayouts(logEvent.LogEvent);

            var firstEventInQueue = _buffer.Enqueue(logEvent);

            if (_buffer.RequestCount >= BufferSize)
            {
                // If the OverflowAction action is set to "Discard", the buffer will automatically
                // roll over the oldest item.
                if (OverflowAction == BufferingTargetWrapperOverflowAction.Flush)
                {
                    WriteEventsInBuffer("Exceeding BufferSize");
                }
            }
            else
            {
                if (FlushTimeout > 0 && (SlidingTimeout || firstEventInQueue))
                {
                    // reset the timer on first item added to the buffer or whenever SlidingTimeout is set to true
                    _flushTimer.Change(FlushTimeout, -1);
                }
            }
        }
コード例 #5
0
ファイル: AsyncRequestQueueTests.cs プロジェクト: ExM/NLog
        public void AsyncRequestQueueWithBlockBehavior()
        {
            var queue = new AsyncRequestQueue(10, AsyncTargetWrapperOverflowAction.Block);

            ManualResetEvent producerFinished = new ManualResetEvent(false);

            int pushingEvent = 0;

            ThreadPool.QueueUserWorkItem(
                s =>
                {
                    // producer thread
                    for (int i = 0; i < 1000; ++i)
                    {
                        AsyncLogEventInfo logEvent = LogEventInfo.CreateNullEvent().WithContinuation(ex => { });
                        logEvent.LogEvent.Message = "msg" + i;

                        // Console.WriteLine("Pushing event {0}", i);
                        pushingEvent = i;
                        queue.Enqueue(logEvent);
                    }

                    producerFinished.Set();
                });

            // consumer thread
            AsyncLogEventInfo[] logEventInfos;
            int total = 0;

            while (total < 500)
            {
                int left = 500 - total;

                logEventInfos = queue.DequeueBatch(left);
                int got = logEventInfos.Length;
                Assert.IsTrue(got <= queue.RequestLimit);
                total += got;
            }

            Thread.Sleep(500);

            // producer is blocked on trying to push event #510
            Assert.AreEqual(510, pushingEvent);
            queue.DequeueBatch(1);
            total++;
            Thread.Sleep(500);

            // producer is now blocked on trying to push event #511

            Assert.AreEqual(511, pushingEvent);
            while (total < 1000)
            {
                int left = 1000 - total;

                logEventInfos = queue.DequeueBatch(left);
                int got = logEventInfos.Length;
                Assert.IsTrue(got <= queue.RequestLimit);
                total += got;
            }

            // producer should now finish
            producerFinished.WaitOne();
        }
コード例 #6
0
ファイル: AsyncRequestQueueTests.cs プロジェクト: igalse/NLog
        public void AsyncRequestQueueWithDiscardBehaviorTest()
        {
            AsyncContinuation cont1 = ex => { };
            AsyncContinuation cont2 = ex => { };
            AsyncContinuation cont3 = ex => { };
            AsyncContinuation cont4 = ex => { };
            AsyncContinuation cont5 = ex => { };

            var ev1 = LogEventInfo.CreateNullEvent();
            var ev2 = LogEventInfo.CreateNullEvent();
            var ev3 = LogEventInfo.CreateNullEvent();
            var ev4 = LogEventInfo.CreateNullEvent();
            var ev5 = LogEventInfo.CreateNullEvent();

            var queue = new AsyncRequestQueue(3, AsyncTargetWrapperOverflowAction.Discard);
            Assert.AreEqual(3, queue.RequestLimit);
            Assert.AreEqual(AsyncTargetWrapperOverflowAction.Discard, queue.OnOverflow);
            Assert.AreEqual(0, queue.RequestCount);
            queue.Enqueue(ev1, cont1);
            Assert.AreEqual(1, queue.RequestCount);
            queue.Enqueue(ev2, cont2);
            Assert.AreEqual(2, queue.RequestCount);
            queue.Enqueue(ev3, cont3);
            Assert.AreEqual(3, queue.RequestCount);
            queue.Enqueue(ev4, cont4);
            Assert.AreEqual(3, queue.RequestCount);

            LogEventInfo[] logEventInfos;
            AsyncContinuation[] asyncContinuations;

            int result = queue.DequeueBatch(10, out logEventInfos, out asyncContinuations);
            Assert.AreEqual(result, logEventInfos.Length);
            Assert.AreEqual(result, asyncContinuations.Length);

            Assert.AreEqual(3, result);
            Assert.AreEqual(0, queue.RequestCount);

            // ev1 is lost
            Assert.AreSame(logEventInfos[0], ev2);
            Assert.AreSame(logEventInfos[1], ev3);
            Assert.AreSame(logEventInfos[2], ev4);

            // cont1 is lost
            Assert.AreSame(asyncContinuations[0], cont2);
            Assert.AreSame(asyncContinuations[1], cont3);
            Assert.AreSame(asyncContinuations[2], cont4);
        }