From 3dcec04ab5b35d3085bd2a3ca2c5af575ed3951b 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 259467ace4..171b858c0b 100644 --- a/res/res_odbc.c +++ b/res/res_odbc.c @@ -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)) { -- 2.47.2