From 7c32cb27b7080156f20e22dd18041eaa9672ddee Mon Sep 17 00:00:00 2001 From: Martin Tomec Date: Tue, 21 Apr 2015 18:52:22 +0200 Subject: [PATCH] res_odbc: Use negative connection cache for all connections 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 | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/res/res_odbc.c b/res/res_odbc.c index 0a594ef2fd..3595cde510 100644 --- a/res/res_odbc.c +++ b/res/res_odbc.c @@ -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)) { -- 2.47.2