[asterisk-commits] file: branch file/cdrbatchretry r38366 -
/team/file/cdrbatchretry/cdr.c
asterisk-commits at lists.digium.com
asterisk-commits at lists.digium.com
Thu Jul 27 11:52:45 MST 2006
Author: file
Date: Thu Jul 27 13:52:44 2006
New Revision: 38366
URL: http://svn.digium.com/view/asterisk?rev=38366&view=rev
Log:
Change the logic of how the max deferrals option works. This sort of opens up a best practices chapter for CDR engines so here are my thoughts. If a CDR engine can post the record but for whatever reason (for example, a maintenance mode is enabled in the driver) then it should reply with DEFER. This will cause the record to be continued to be retried indefinitely. If a CDR engine tried to post the record but failed then it should reply with FAILED. This will increment the count and be checked against the max deferrals option. If a record gets back both a DEFER and FAILED, the DEFER will get priority and the max deferrals option will not be in effect.
Modified:
team/file/cdrbatchretry/cdr.c
Modified: team/file/cdrbatchretry/cdr.c
URL: http://svn.digium.com/view/asterisk/team/file/cdrbatchretry/cdr.c?rev=38366&r1=38365&r2=38366&view=diff
==============================================================================
--- team/file/cdrbatchretry/cdr.c (original)
+++ team/file/cdrbatchretry/cdr.c Thu Jul 27 13:52:44 2006
@@ -797,7 +797,7 @@
static void *do_batch_backend_process(void *data)
{
char *chan = NULL;
- int defer = 0;
+ int defer = 0, failed = 0;
struct ast_cdr_batch_item *batch_item = data;
struct ast_cdr_beitem *be = NULL;
AST_LIST_HEAD_NOLOCK(local_batch_list, ast_cdr_batch_item) local_batch_list;
@@ -813,10 +813,8 @@
/* Thankfully we don't need to hold the lock on the above since it only exists to us */
while ((batch_item = AST_LIST_REMOVE_HEAD(&local_batch_list, list))) {
- /* Increment deferral count */
- batch_item->deferrals++;
- /* Reset defer state to 0 */
- defer = 0;
+ /* Reset defer and failed state to 0 */
+ defer = failed = 0;
/* Now we have to process this batched item */
chan = S_OR(batch_item->cdr->channel, "<unknown>");
/* If this item has not been processed through the regular points before, do so */
@@ -834,21 +832,36 @@
/* Okay, we pass this CDR off to the engine if not already done and check the result */
if (!batch_item->engine[be->num]) {
res = be->be(batch_item->cdr);
- if (res == AST_CDR_ENGINE_SUCCESS || res == AST_CDR_ENGINE_DISCARD) {
+ switch (res) {
+ case AST_CDR_ENGINE_SUCCESS:
+ case AST_CDR_ENGINE_DISCARD:
batch_item->engine[be->num] = 1;
- } else if (res == AST_CDR_ENGINE_DEFER || res == AST_CDR_ENGINE_FAILED) {
- /* Continue processing through the engines, but rerun this CDR record again */
- defer = 1;
+ break;
+ case AST_CDR_ENGINE_DEFER:
+ defer++;
+ break;
+ case AST_CDR_ENGINE_FAILED:
+ failed++;
+ break;
+ default:
+ break;
}
}
}
AST_LIST_UNLOCK(&be_list);
- /* If this has reached the maximum number of deferrals... don't defer it any longer */
- if (batchmaxdeferrals > 0 && batch_item->deferrals == batchmaxdeferrals) {
- defer = 0;
+ /* Increment deferral count if any failed and we have no explicit defers */
+ if (!defer) {
+ if (failed > 0) {
+ batch_item->deferrals++;
+ }
+ /* If this has reached the maximum number of deferrals... don't defer it any longer */
+ if (batchmaxdeferrals > 0 && batch_item->deferrals == batchmaxdeferrals) {
+ /* Make sure this is not tried again */
+ failed = 0;
+ }
}
/* Okay... if we need to defer this entry for another attempt and we have not reached the max, do so... otherwise drop it */
- if (defer) {
+ if (defer || failed) {
/* Insert it into the regular batch list */
AST_LIST_LOCK(&batch_list);
AST_LIST_INSERT_HEAD(&batch_list, batch_item, list);
More information about the asterisk-commits
mailing list