summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Tomec <tomec.martin@gmail.com>2015-04-21 18:52:22 +0200
committerJoshua Colp <jcolp@digium.com>2015-05-04 06:47:26 -0500
commit3dcec04ab5b35d3085bd2a3ca2c5af575ed3951b (patch)
treedf2f4da91102b83240fe43e255cbb4025e9ab861
parent3efe0df044c9e186205b16aa5b1ea8f9cc0ed92b (diff)
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
-rw-r--r--res/res_odbc.c16
1 files changed, 10 insertions, 6 deletions
diff --git a/res/res_odbc.c b/res/res_odbc.c
index 259467ace..171b858c0 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)) {