]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
res_odbc: Use negative connection cache for all connections 84/184/6
authorMartin Tomec <tomec.martin@gmail.com>
Tue, 21 Apr 2015 16:52:22 +0000 (18:52 +0200)
committerJoshua Colp <jcolp@digium.com>
Mon, 4 May 2015 11:47:26 +0000 (06:47 -0500)
Apply the negative connection cache setting to all connections,
even those that are not pooled. This ensures that the connection
will not be re-established before the negative connection cache
time is met.

ASTERISK-22708 #close

Change-Id: I431cc2e8584ab0b6908b3523d0a0e18c9a527271

res/res_odbc.c

index 259467ace4ab2849280b597ca04aedfe0b9aa393..171b858c0bc56c2c3c4272e25cf047f528762663 100644 (file)
@@ -1253,8 +1253,7 @@ struct odbc_obj *_ast_odbc_request_obj2(const char *name, struct ast_flags flags
                if (obj) {
                        ast_assert(ao2_ref(obj, 0) > 1);
                }
-               if (!obj && (ast_atomic_fetchadd_int(&class->count, +1) < class->limit) &&
-                               (time(NULL) > class->last_negative_connect.tv_sec + class->negative_connection_cache.tv_sec)) {
+               if (!obj && (ast_atomic_fetchadd_int(&class->count, +1) < class->limit)) {
                        obj = ao2_alloc(sizeof(*obj), odbc_obj_destructor);
                        if (!obj) {
                                class->count--;
@@ -1412,10 +1411,7 @@ struct odbc_obj *_ast_odbc_request_obj2(const char *name, struct ast_flags flags
        }
 
        if (ast_test_flag(&flags, RES_ODBC_CONNECTED) && !obj->up) {
-               /* Check if this connection qualifies for reconnection, with negative connection cache time */
-               if (time(NULL) > obj->parent->last_negative_connect.tv_sec + obj->parent->negative_connection_cache.tv_sec) {
-                       odbc_obj_connect(obj);
-               }
+               odbc_obj_connect(obj);
        } else if (ast_test_flag(&flags, RES_ODBC_SANITY_CHECK)) {
                ast_odbc_sanity_check(obj);
        } else if (obj->parent->idlecheck > 0 && ast_tvdiff_sec(ast_tvnow(), obj->last_used) > obj->parent->idlecheck) {
@@ -1522,6 +1518,7 @@ static odbc_status odbc_obj_connect(struct odbc_obj *obj)
        char *tracefile = "/tmp/odbc.trace";
 #endif
        SQLHDBC con;
+       long int negative_cache_expiration;
 
        if (obj->up) {
                odbc_obj_disconnect(obj);
@@ -1531,6 +1528,13 @@ static odbc_status odbc_obj_connect(struct odbc_obj *obj)
                ast_log(LOG_NOTICE, "Connecting %s\n", obj->parent->name);
        }
 
+       /* Dont connect while server is marked as unreachable via negative_connection_cache */
+       negative_cache_expiration = obj->parent->last_negative_connect.tv_sec + obj->parent->negative_connection_cache.tv_sec;
+       if (time(NULL) < negative_cache_expiration) {
+               ast_log(LOG_WARNING, "Not connecting to %s. Negative connection cache for %ld seconds\n", obj->parent->name, negative_cache_expiration - time(NULL));
+               return ODBC_FAIL;
+       }
+
        res = SQLAllocHandle(SQL_HANDLE_DBC, obj->parent->env, &con);
 
        if ((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) {