]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
res_odbc: Use negative connection cache for all connections 83/183/5
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:46:59 +0000 (06:46 -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 0a594ef2fdf70c16fa90327b0ee37961187064a9..3595cde51088bce71ebb3971d4cfa52645b9b40e 100644 (file)
@@ -1254,8 +1254,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--;
@@ -1413,10 +1412,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) {
@@ -1523,6 +1519,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);
@@ -1532,6 +1529,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)) {