mirror of
				https://github.com/asterisk/asterisk.git
				synced 2025-10-31 10:47:18 +00:00 
			
		
		
		
	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
This commit is contained in:
		
				
					committed by
					
						 Joshua Colp
						Joshua Colp
					
				
			
			
				
	
			
			
			
						parent
						
							80aa9aee5d
						
					
				
				
					commit
					ebe371357e
				
			| @@ -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)) { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user