mirror of
https://github.com/asterisk/asterisk.git
synced 2025-10-03 11:11:05 +00:00
Merge "res_odbc: Use negative connection cache for all connections" into 13
This commit is contained in:
@@ -1253,8 +1253,7 @@ struct odbc_obj *_ast_odbc_request_obj2(const char *name, struct ast_flags flags
|
|||||||
if (obj) {
|
if (obj) {
|
||||||
ast_assert(ao2_ref(obj, 0) > 1);
|
ast_assert(ao2_ref(obj, 0) > 1);
|
||||||
}
|
}
|
||||||
if (!obj && (ast_atomic_fetchadd_int(&class->count, +1) < class->limit) &&
|
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)) {
|
|
||||||
obj = ao2_alloc(sizeof(*obj), odbc_obj_destructor);
|
obj = ao2_alloc(sizeof(*obj), odbc_obj_destructor);
|
||||||
if (!obj) {
|
if (!obj) {
|
||||||
class->count--;
|
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) {
|
if (ast_test_flag(&flags, RES_ODBC_CONNECTED) && !obj->up) {
|
||||||
/* Check if this connection qualifies for reconnection, with negative connection cache time */
|
odbc_obj_connect(obj);
|
||||||
if (time(NULL) > obj->parent->last_negative_connect.tv_sec + obj->parent->negative_connection_cache.tv_sec) {
|
|
||||||
odbc_obj_connect(obj);
|
|
||||||
}
|
|
||||||
} else if (ast_test_flag(&flags, RES_ODBC_SANITY_CHECK)) {
|
} else if (ast_test_flag(&flags, RES_ODBC_SANITY_CHECK)) {
|
||||||
ast_odbc_sanity_check(obj);
|
ast_odbc_sanity_check(obj);
|
||||||
} else if (obj->parent->idlecheck > 0 && ast_tvdiff_sec(ast_tvnow(), obj->last_used) > obj->parent->idlecheck) {
|
} 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";
|
char *tracefile = "/tmp/odbc.trace";
|
||||||
#endif
|
#endif
|
||||||
SQLHDBC con;
|
SQLHDBC con;
|
||||||
|
long int negative_cache_expiration;
|
||||||
|
|
||||||
if (obj->up) {
|
if (obj->up) {
|
||||||
odbc_obj_disconnect(obj);
|
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);
|
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);
|
res = SQLAllocHandle(SQL_HANDLE_DBC, obj->parent->env, &con);
|
||||||
|
|
||||||
if ((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) {
|
if ((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) {
|
||||||
|
Reference in New Issue
Block a user