If we detect that we are no longer connected, try to reconnect a few times
authorSean Bright <sean@malleable.com>
Thu, 14 Aug 2008 15:03:03 +0000 (15:03 +0000)
committerSean Bright <sean@malleable.com>
Thu, 14 Aug 2008 15:03:03 +0000 (15:03 +0000)
before giving up.  This relies on the timeout settings in the freetds.conf
file and, unfortunately, on a recent version of FreeTDS (0.82 or newer).

I either need to change the current execs to be non-blocking (which I do
not want to do) or we have to force people to run with the latest and
greatest of FreeTDS.  I'm on the fence...

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

cdr/cdr_tds.c

index cf17805..fd3f328 100644 (file)
@@ -114,6 +114,7 @@ static int tds_log(struct ast_cdr *cdr)
        char *accountcode, *src, *dst, *dcontext, *clid, *channel, *dstchannel, *lastapp, *lastdata, *uniqueid, *userfield = NULL;
        RETCODE erc;
        int res = -1;
+       int attempt = 1;
 
        accountcode = anti_injection(cdr->accountcode, 20);
        src         = anti_injection(cdr->src, 80);
@@ -136,10 +137,15 @@ static int tds_log(struct ast_cdr *cdr)
                userfield = anti_injection(cdr->userfield, AST_MAX_USER_FIELD);
        }
 
+retry:
        /* Ensure that we are connected */
        if (!settings->connected) {
+               ast_log(LOG_NOTICE, "Attempting to reconnect to %s (Attempt %d)\n", settings->hostname, attempt);
                if (mssql_connect()) {
                        /* Connect failed */
+                       if (attempt++ < 3) {
+                               goto retry;
+                       }
                        goto done;
                }
        }
@@ -186,13 +192,25 @@ static int tds_log(struct ast_cdr *cdr)
        }
 
        if (erc == FAIL) {
-               ast_log(LOG_ERROR, "Failed to build INSERT statement, no CDR was logged.\n");
-               goto done;
+               if (attempt++ < 3) {
+                       ast_log(LOG_NOTICE, "Failed to build INSERT statement, retrying...\n");
+                       mssql_disconnect();
+                       goto retry;
+               } else {
+                       ast_log(LOG_ERROR, "Failed to build INSERT statement, no CDR was logged.\n");
+                       goto done;
+               }
        }
 
        if (dbsqlexec(settings->dbproc) == FAIL) {
-               ast_log(LOG_ERROR, "Failed to execute INSERT statement, no CDR was logged.\n");
-               goto done;
+               if (attempt++ < 3) {
+                       ast_log(LOG_NOTICE, "Failed to execute INSERT statement, retrying...\n");
+                       mssql_disconnect();
+                       goto retry;
+               } else {
+                       ast_log(LOG_ERROR, "Failed to execute INSERT statement, no CDR was logged.\n");
+                       goto done;
+               }
        }
 
        /* Consume any results we might get back (this is more of a sanity check than