Ejemplo n.º 1
0
            private async Task FinilizeQueueWork(int NumOfDeqeuedMsgs, string qName, IReliableQueue <Wi> q)
            {
                long LastCheckedVal;

                if (null == q)
                {
                    // this executer tried to get q and failed.
                    // typically this happens when # of executers > q
                    // check for decrease workers
                    this.m_WorkManager.m_DeferedTaskExec.AddWork(this.m_WorkManager.TryDecreaseExecuters);
                    return;
                }

                bool bMoreMessages = NumOfDeqeuedMsgs > this.m_WorkManager.YieldQueueAfter;
                bool bEmptyQ       = !(q.Count() > 0);

                if (bMoreMessages || !bEmptyQ) // did we find messages in the queue
                {
                    this.m_WorkManager.m_TraceWriter.TraceMessage(string.Format("queue:{0} pushed back to queues, queue still have more work", qName));

                    this.leaveQ(qName, true);
                }
                else
                {
                    long now = DateTime.UtcNow.Ticks;
                    // was queue previously empty?
                    bool bCheckedBefore = this.m_WorkManager.m_QueueManager.m_SuspectedEmptyQueues.TryGetValue(qName, out LastCheckedVal);

                    // Q was in suspected empty queue and has expired
                    if (bCheckedBefore && ((now - LastCheckedVal) > this.m_WorkManager.m_RemoveEmptyQueueAfterTicks))
                    {
                        this.m_WorkManager.m_TraceWriter.TraceMessage(string.Format("queue:{0} confirmed empty, and will be removed", qName));

                        // remove it from suspected queue
                        this.m_WorkManager.m_QueueManager.m_SuspectedEmptyQueues.TryRemove(qName, out LastCheckedVal);

                        // remove from the queue list
                        await this.m_WorkManager.m_QueueManager.RemoveQueueAsync(qName);

                        // remove asscioated handler
                        this.m_WorkManager.m_DeferedTaskExec.AddWork(() => this.m_WorkManager.RemoveHandlerForQueue(qName));

                        // modify executers to reflect the current state
                        this.m_WorkManager.m_DeferedTaskExec.AddWork(this.m_WorkManager.TryDecreaseExecuters);
                    }
                    else
                    {
                        this.m_WorkManager.m_TraceWriter.TraceMessage(
                            string.Format("queue:{0} pushed back to queues and flagged as an empty queue suspect ", qName));
                        // the queue was not a suspect before, or has not expired
                        this.m_WorkManager.m_QueueManager.m_SuspectedEmptyQueues.AddOrUpdate(qName, now, (k, v) => { return(v); });
                        this.leaveQ(qName, false);
                    }
                }
            }