FS-10833: [mod_amqp] memory leak on reconnection attempt to RabbitMQ broker

Memory leak happening during reconnection attempt after connectivity loss with
RabbitMQ broker.

With these changes, memory leak issue has been addressed and the object has
been properly freed.
This commit is contained in:
Praveen Kumar 2017-12-08 04:23:43 +05:30 committed by Mike Jerris
parent f2ce1dbb82
commit cd20145b34

View File

@ -109,7 +109,7 @@ switch_status_t mod_amqp_connection_open(mod_amqp_connection_t *connections, mod
if (!(socket = amqp_tcp_socket_new(newConnection))) { if (!(socket = amqp_tcp_socket_new(newConnection))) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Could not create TCP socket\n"); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Could not create TCP socket\n");
return SWITCH_STATUS_GENERR; goto err;
} }
connection_attempt = connections; connection_attempt = connections;
@ -130,7 +130,7 @@ switch_status_t mod_amqp_connection_open(mod_amqp_connection_t *connections, mod
if (!connection_attempt) { if (!connection_attempt) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Profile[%s] could not connect to any AMQP brokers\n", profile_name); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Profile[%s] could not connect to any AMQP brokers\n", profile_name);
return SWITCH_STATUS_GENERR; goto err;
} }
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Profile[%s] opened socket connection to AMQP broker %s:%d\n", switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Profile[%s] opened socket connection to AMQP broker %s:%d\n",
@ -150,13 +150,15 @@ switch_status_t mod_amqp_connection_open(mod_amqp_connection_t *connections, mod
if (mod_amqp_log_if_amqp_error(status, "Logging in")) { if (mod_amqp_log_if_amqp_error(status, "Logging in")) {
mod_amqp_connection_close(*active); mod_amqp_connection_close(*active);
*active = NULL; *active = NULL;
return SWITCH_STATUS_GENERR; goto err;
} }
// Open a channel (1). This is fairly standard // Open a channel (1). This is fairly standard
amqp_channel_open(newConnection, 1); amqp_channel_open(newConnection, 1);
if (mod_amqp_log_if_amqp_error(amqp_get_rpc_reply(newConnection), "Opening channel")) { if (mod_amqp_log_if_amqp_error(amqp_get_rpc_reply(newConnection), "Opening channel")) {
return SWITCH_STATUS_GENERR; mod_amqp_connection_close(*active);
*active = NULL;
goto err;
} }
(*active)->state = newConnection; (*active)->state = newConnection;
@ -166,6 +168,12 @@ switch_status_t mod_amqp_connection_open(mod_amqp_connection_t *connections, mod
} }
return SWITCH_STATUS_SUCCESS; return SWITCH_STATUS_SUCCESS;
err:
if (newConnection) {
amqp_destroy_connection(newConnection);
}
return SWITCH_STATUS_GENERR;
} }
switch_status_t mod_amqp_connection_create(mod_amqp_connection_t **conn, switch_xml_t cfg, switch_memory_pool_t *pool) switch_status_t mod_amqp_connection_create(mod_amqp_connection_t **conn, switch_xml_t cfg, switch_memory_pool_t *pool)