Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fixes #651: Frees the qdr_connection_t and qdr_http2_connection_t obj… #652

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 25 additions & 2 deletions src/adaptors/http2/http2_adaptor.c
Original file line number Diff line number Diff line change
Expand Up @@ -1625,6 +1625,7 @@ qdr_http2_connection_t *qdr_http_connection_ingress(qd_http_listener_t* listener
ingress_http_conn->context.context = ingress_http_conn;
ingress_http_conn->context.handler = &handle_connection_event;
ingress_http_conn->listener = listener;
ingress_http_conn->admin_status = QD_CONN_ADMIN_ENABLED;

// Incref the ref count on the listener since the qdr_http2_connection_t object is holding a ref to the listener
sys_atomic_inc(&listener->ref_count);
Expand Down Expand Up @@ -1914,6 +1915,20 @@ static void qdr_http_activate(void *notused, qdr_connection_t *c)
{
sys_mutex_lock(qd_server_get_activation_lock(http2_adaptor->core->qd->server));
qdr_http2_connection_t* conn = (qdr_http2_connection_t*) qdr_connection_get_context(c);
if (conn && conn->admin_status == QD_CONN_ADMIN_DELETED && conn->pn_raw_conn == 0) {
// ISSUE-651
// conn->pn_raw_conn == 0 means that handle_disconnected was called via the PN_RAW_CONNECTION_DISCONNECTED event
// conn->admin_status == QD_CONN_ADMIN_DELETED means that the connector was already deleted by a management request.
//
// This is the case when the connector got deleted at more less the same time the server disconnected (causing a PN_RAW_CONNECTION_DISCONNECTED event)
// This activation has been called but the pn raw connection is closed. We need to free the qdr_connection_t object
// and the qdr_http2_connection_t object and return immediately.
//
sys_mutex_unlock(qd_server_get_activation_lock(http2_adaptor->core->qd->server));
qdr_connection_closed(c);
free_qdr_http2_connection(conn, false);
return;
}
if (conn) {
if (conn->pn_raw_conn && !(IS_ATOMIC_FLAG_SET(&conn->raw_closed_read) && IS_ATOMIC_FLAG_SET(&conn->raw_closed_write))) {
qd_log(http2_adaptor->log_source, QD_LOG_TRACE, "[C%"PRIu64"] Activation triggered, calling pn_raw_connection_wake()", conn->conn_id);
Expand Down Expand Up @@ -2987,6 +3002,7 @@ qdr_http2_connection_t *qdr_http_connection_egress(qd_http_connector_t *connecto
egress_http_conn->context.context = egress_http_conn;
egress_http_conn->context.handler = &handle_connection_event;
egress_http_conn->connector = connector;
egress_http_conn->admin_status = QD_CONN_ADMIN_ENABLED;

// Incref the ref count on the connector since the qdr_http2_connection_t object is holding a ref to the connector
sys_atomic_inc(&connector->ref_count);
Expand Down Expand Up @@ -3237,8 +3253,15 @@ void qd_http2_delete_connector(qd_dispatch_t *qd, qd_http_connector_t *connector
//
// Deleting a connector must delete the corresponding qdr_connection_t and qdr_http2_connection_t objects also.
//
if (connector->ctx)
qdr_core_close_connection((qdr_connection_t *)connector->ctx);
if (connector->ctx) {
qdr_connection_t *conn = (qdr_connection_t *)connector->ctx;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this line is not according to clang-format, it is not aligned with the lane below

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

$ sudo dnf install git-clang-format
$ git clang-format -f

should be the magic (to format outstanding changes)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should make the clang-format as part of the build ASAP. We should just bite the bullet and do it. I will fix this. Thx.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe we can make git clang-format be part of precommit checks. Therefore, all new (added or modified) code will have to be formatted, while old code can remain unchanged.

Advantage: it should be reatively painless.

Copy link
Contributor Author

@ganeshmurthy ganeshmurthy Aug 4, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we should do what you did earlier which is agree on a clang format, format all the code in the repo by running the tool and check all that modified code back into the repo. Then enable the tool in cmake so that it fails the build (locally and on CI) if the code violates the format. This is what I meant by bite the bullet and do it. :)
In other words, this should work very similar to the python-checker if possible

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I know. I proposed to do this in two steps, instead, and soften the bullet for the first step.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@jiridanek 2 steps most definitely

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

qdr_http2_connection_t* http_conn = (qdr_http2_connection_t*) qdr_connection_get_context(conn);
sys_mutex_lock(qd_server_get_activation_lock(http2_adaptor->core->qd->server));
http_conn->admin_status = QD_CONN_ADMIN_DELETED;
sys_mutex_unlock(qd_server_get_activation_lock(http2_adaptor->core->qd->server));
qdr_core_close_connection(conn);
}

qd_http_connector_decref(connector);
}
}
Expand Down
1 change: 1 addition & 0 deletions src/adaptors/http2/http2_adaptor.h
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,7 @@ struct qdr_http2_connection_t {
qd_http2_stream_data_list_t streams; // A session can have many streams.
qd_http_listener_t *listener;
qd_http_connector_t *connector;
qd_conn_admin_status_t admin_status;

bool connection_established;
bool grant_initial_buffers;
Expand Down