@ -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 ) ) {