Skip to content

Commit 23558e0

Browse files
committed
DISPATCH-2032: Zero out the link_work references on delivery during link cleanup. This closes #1122.
1 parent 8ce3593 commit 23558e0

File tree

3 files changed

+9
-1
lines changed

3 files changed

+9
-1
lines changed

src/router_core/connections.c

+4-1
Original file line numberDiff line numberDiff line change
@@ -746,7 +746,7 @@ static void qdr_generate_link_name(const char *label, char *buffer, size_t lengt
746746
}
747747

748748

749-
static void qdr_link_cleanup_deliveries_CT(qdr_core_t *core, qdr_connection_t *conn, qdr_link_t *link)
749+
void qdr_link_cleanup_deliveries_CT(qdr_core_t *core, qdr_connection_t *conn, qdr_link_t *link)
750750
{
751751
//
752752
// Clean up the lists of deliveries on this link
@@ -766,6 +766,7 @@ static void qdr_link_cleanup_deliveries_CT(qdr_core_t *core, qdr_connection_t *c
766766
if (d->presettled)
767767
core->dropped_presettled_deliveries++;
768768
d->where = QDR_DELIVERY_NOWHERE;
769+
d->link_work = 0;
769770
d = DEQ_NEXT(d);
770771
}
771772

@@ -774,6 +775,7 @@ static void qdr_link_cleanup_deliveries_CT(qdr_core_t *core, qdr_connection_t *c
774775
while (d) {
775776
assert(d->where == QDR_DELIVERY_IN_UNSETTLED);
776777
d->where = QDR_DELIVERY_NOWHERE;
778+
d->link_work = 0;
777779
d = DEQ_NEXT(d);
778780
}
779781

@@ -782,6 +784,7 @@ static void qdr_link_cleanup_deliveries_CT(qdr_core_t *core, qdr_connection_t *c
782784
while (d) {
783785
assert(d->where == QDR_DELIVERY_IN_SETTLED);
784786
d->where = QDR_DELIVERY_NOWHERE;
787+
d->link_work = 0;
785788
d = DEQ_NEXT(d);
786789
}
787790
sys_mutex_unlock(conn->work_lock);

src/router_core/router_core.c

+4
Original file line numberDiff line numberDiff line change
@@ -224,8 +224,12 @@ void qdr_core_free(qdr_core_t *core)
224224
DEQ_REMOVE_N(STREAMING_POOL, link->conn->streaming_link_pool, link);
225225
link->in_streaming_pool = false;
226226
}
227+
228+
qdr_link_cleanup_deliveries_CT(core, link->conn, link);
229+
227230
if (link->core_endpoint)
228231
qdrc_endpoint_do_cleanup_CT(core, link->core_endpoint);
232+
229233
qdr_del_link_ref(&link->conn->links, link, QDR_LINK_LIST_CLASS_CONNECTION);
230234
qdr_del_link_ref(&link->conn->links_with_work[link->priority], link, QDR_LINK_LIST_CLASS_WORK);
231235
free(link->name);

src/router_core/router_core_private.h

+1
Original file line numberDiff line numberDiff line change
@@ -987,6 +987,7 @@ qdr_edge_t *qdr_edge(qdr_core_t *);
987987
void qdr_edge_free(qdr_edge_t *);
988988
void qdr_edge_connection_opened(qdr_edge_t *edge, qdr_connection_t *conn);
989989
void qdr_edge_connection_closed(qdr_edge_t *edge);
990+
void qdr_link_cleanup_deliveries_CT(qdr_core_t *core, qdr_connection_t *conn, qdr_link_t *link);
990991

991992
void qdr_connection_enqueue_work_CT(qdr_core_t *core,
992993
qdr_connection_t *conn,

0 commit comments

Comments
 (0)