Merge "res_odbc: Use negative connection cache for all connections"
authorMatt Jordan <mjordan@digium.com>
Mon, 4 May 2015 12:46:12 +0000 (07:46 -0500)
committerGerrit Code Review <gerrit2@gerrit.digium.api>
Mon, 4 May 2015 12:46:12 +0000 (07:46 -0500)
res/res_odbc.c

index 5f2f2c5..2530a48 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)) {