Change the queue timeout priority logic into less ugly
authorMark Michelson <mmichelson@digium.com>
Mon, 18 Aug 2008 20:23:11 +0000 (20:23 +0000)
committerMark Michelson <mmichelson@digium.com>
Mon, 18 Aug 2008 20:23:11 +0000 (20:23 +0000)
and confusing code pieces. Clarify the logic within
queues.conf.sample.

(closes issue #12690)
Reported by: atis
Patches:
      queue_timeoutpriority.patch uploaded by atis (license 242)

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@138694 65c4cc65-6c06-0410-ace0-fbb531ad65f3

apps/app_queue.c
configs/queues.conf.sample

index 4054437..8f94ef1 100644 (file)
@@ -2314,6 +2314,14 @@ static int ring_one(struct queue_ent *qe, struct callattempt *outgoing, int *bus
                        ast_debug(1, "Trying '%s' with metric %d\n", best->interface, best->metric);
                        ret = ring_entry(qe, best, busies);
                }
+               
+               /* If we have timed out, break out */
+               if (qe->expire && (time(NULL) >= qe->expire)) {
+                       if (option_debug)
+                               ast_log(LOG_DEBUG, "Queue timed out while ringing members.\n");
+                       ret = 0;
+                       break;
+               }
        }
 
        return ret;
@@ -3407,10 +3415,22 @@ static int try_calling(struct queue_ent *qe, const char *options, char *announce
                }
        }
 
-       if (qe->expire && (!qe->parent->timeout || (qe->parent->timeoutpriority == TIMEOUT_PRIORITY_APP && (qe->expire - now) <= qe->parent->timeout)))
-               to = (qe->expire - now) * 1000;
-       else
-               to = (qe->parent->timeout) ? qe->parent->timeout * 1000 : -1;
+       if (qe->parent->timeoutpriority == TIMEOUT_PRIORITY_APP) {
+               /* Application arguments have higher timeout priority (behaviour for <=1.6) */
+               if (qe->expire && (!qe->parent->timeout || (qe->expire - now) <= qe->parent->timeout))
+                       to = (qe->expire - now) * 1000;
+               else
+                       to = (qe->parent->timeout) ? qe->parent->timeout * 1000 : -1;
+       } else {
+               /* Config timeout is higher priority thatn application timeout */
+               if (qe->expire && qe->expire<=now) {
+                       to = 0;
+               } else if (qe->parent->timeout) {
+                       to = qe->parent->timeout * 1000;
+               } else {
+                       to = -1;
+               }
+       }
        orig = to;
        ++qe->pending;
        ao2_unlock(qe->parent);
index e4f6dd3..8e3b96d 100644 (file)
@@ -148,11 +148,19 @@ shared_lastcall=no
 ; Queue application is more important. In the scenario above, timeoutpriority=app
 ; would result in the second member's phone ringing for 1 second.
 ;
-; There are a few exceptions to the priority rules. For instance, if the configuration
-; file timeout is set to 0, but the application argument timeout is non-zero, then the
-; timeoutpriority is ignored and the application argument is used as the timeout. Furthermore,
-; if no application argument timeout is specified, then the timeoutpriority option is
-; ignored and the configuration file timeout is always used when calling queue members.
+; There are a few exceptions to the priority rules. For instance, if timeoutpriority=appp
+; and the configuration file timeout is set to 0, but the application argument timeout is
+; non-zero, then the timeoutpriority is ignored and the application argument is used as
+; the timeout. Furthermore, if no application argument timeout is specified, then the
+; timeoutpriority option is ignored and the configuration file timeout is always used 
+; when calling queue members.
+;
+; In timeoutpriority=conf mode however timeout specified in config file will take higher
+; priority than timeout in application arguments, so if config file has timeout 0, each
+; queue member will be called indefineately and application timeout will be checked only
+; after this call attempt. This is useful for having queue members with custom timeouts
+; specified within Dial application of Local channel, and allows handling NO ANSWER which
+; would otherwise be interrupted by queue destroying child channel on timeout.
 ;
 ; The default value for timeoutpriority is "app" since this was how previous versions of
 ; Asterisk behaved.