Add uuid to all conn mctxs, otherwise we cannot uniquely identify them, causing trouble especially while deleting conns

Fix issues, clean-up
pull/13/head
Soner Tari 7 years ago
parent 833e1903e1
commit 0b0f6b21dc

@ -71,6 +71,9 @@ FEATURES+= -DDEBUG_PROXY
# Define to add thread debugging; dump thread state when choosing a thread.
FEATURES+= -DDEBUG_THREAD
# Define to add features specific to OpenBSD only, such as uuid_create().
FEATURES+= -DOPENBSD
# When debugging OpenSSL related issues, make sure you use a debug build of
# OpenSSL and consider enabling its debugging options -DREF_PRINT -DREF_CHECK
# for debugging reference counting of OpenSSL objects and/or

@ -137,22 +137,10 @@ proxy_listener_acceptcb_e2(UNUSED struct evconnlistener *listener,
if (!mctx) {
log_dbg_level_printf(LOG_DBG_MODE_FINE, ">>>>>------------------------------------------------------------------------------------ proxy_listener_acceptcb_e2: NULL mctx <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< GONE\n");
return;
} else {
log_dbg_level_printf(LOG_DBG_MODE_FINEST, ">>>>>------------------------------------------------------------------------------------ proxy_listener_acceptcb_e2: ENTER 1 fd=%d, fd2=%d\n", mctx->fd, mctx->fd2);
}
mctx->access_time = time(NULL);
log_dbg_level_printf(LOG_DBG_MODE_FINEST, ">>>>>------------------------------------------------------------------------------------ proxy_listener_acceptcb_e2(): ENTER1 mctx->fd2=%d\n", mctx->fd2);
pxy_conn_ctx_t *parent_ctx = mctx->parent_ctx;
/// @todo Remove this assertion later
// assert(parent_ctx != NULL);
// if (!parent_ctx) {
// log_dbg_level_printf(LOG_DBG_MODE_FINE, ">>>>>------------------------------------------------------------------------------------ proxy_listener_acceptcb_e2: NULL parent_ctx, fd2=%d, fd=%d <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< GONE\n", mctx->fd2, fd);
// return;
//// goto leave;
// }
// pthread_mutex_t *cmutex = &parent_ctx->thrmgr->mutex2;
pthread_mutex_t *cmutex = &mctx->mutex;
// @todo Enabling this lock causes ^C to fail?: Cannot quit the program on the command line using ^C
@ -161,17 +149,27 @@ proxy_listener_acceptcb_e2(UNUSED struct evconnlistener *listener,
if (!mctx) {
log_dbg_level_printf(LOG_DBG_MODE_FINE, ">>>>>------------------------------------------------------------------------------------ proxy_listener_acceptcb_e2: NULL mctx <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< GONE after lock\n");
goto leave;
} else {
log_dbg_level_printf(LOG_DBG_MODE_FINEST, ">>>>>------------------------------------------------------------------------------------ proxy_listener_acceptcb_e2: ENTER 2 fd=%d, fd2=%d\n", mctx->fd, mctx->fd2);
}
mctx->access_time = time(NULL);
pxy_conn_ctx_t *parent_ctx = mctx->parent_ctx;
evutil_socket_t pfd = -1;
if (parent_ctx) {
pfd = parent_ctx->fd;
}
log_dbg_level_printf(LOG_DBG_MODE_FINEST, ">>>>>------------------------------------------------------------------------------------ proxy_listener_acceptcb_e2() lock err=%d\n", err);
log_dbg_level_printf(LOG_DBG_MODE_FINEST, ">>>>>------------------------------------------------------------------------------------ proxy_listener_acceptcb_e2(): child fd=%d, parent fd=%d\n", fd, parent_ctx->fd);
log_dbg_level_printf(LOG_DBG_MODE_FINEST, ">>>>>------------------------------------------------------------------------------------ proxy_listener_acceptcb_e2(): child fd=%d, pfd=%d\n", fd, pfd);
char *host, *port;
if (sys_sockaddr_str(peeraddr, peeraddrlen, &host, &port) != 0) {
log_dbg_level_printf(LOG_DBG_MODE_FINEST, ">>>>>------------------------------------------------------------------------------------ proxy_listener_acceptcb_e2(): PEER failed\n");
} else {
log_dbg_level_printf(LOG_DBG_MODE_FINEST, ">>>>>------------------------------------------------------------------------------------ proxy_listener_acceptcb_e2(): PEER [%s]:%s <<<<< child fd=%d, parent fd=%d\n", host, port, fd, parent_ctx->fd);
log_dbg_level_printf(LOG_DBG_MODE_FINEST, ">>>>>------------------------------------------------------------------------------------ proxy_listener_acceptcb_e2(): PEER [%s]:%s <<<<< child fd=%d, pfd=%d\n", host, port, fd, pfd);
free(host);
free(port);
}
@ -193,8 +191,21 @@ pxy_conn_meta_ctx_new()
if (!ctx)
return NULL;
memset(ctx, 0, sizeof(proxy_conn_meta_ctx_t));
log_dbg_level_printf(LOG_DBG_MODE_FINEST, ">>>>> !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! pxy_conn_meta_ctx_new: sizeof(proxy_conn_meta_ctx_t)=%d <<<<<<\n", sizeof(proxy_conn_meta_ctx_t));
log_dbg_level_printf(LOG_DBG_MODE_FINEST, ">>>>>................... pxy_conn_meta_ctx_new: sizeof(proxy_conn_meta_ctx_t)=%d <<<<<<\n", sizeof(proxy_conn_meta_ctx_t));
ctx->uuid = malloc(sizeof(uuid_t));
#ifdef OPENBSD
uuid_create(ctx->uuid, NULL);
char *uuid_str;
uuid_to_string(ctx->uuid, &uuid_str, NULL);
if (uuid_str) {
log_dbg_level_printf(LOG_DBG_MODE_FINEST, ">>>>>................... pxy_conn_meta_ctx_new(): uuid = %s <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n", uuid_str);
free(uuid_str);
}
#else
uuid_generate(ctx->uuid);
#endif /* OPENBSD */
ctx->access_time = time(NULL);
ctx->next = NULL;
@ -221,18 +232,20 @@ proxy_listener_acceptcb(UNUSED struct evconnlistener *listener,
pthread_mutex_unlock(&lctx->thrmgr->mutex);
proxy_conn_meta_ctx_t *delete = new_delete_list;
while (delete) {
proxy_conn_meta_ctx_t *next = delete->delete;
log_dbg_level_printf(LOG_DBG_MODE_FINE, ">>>>> !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! proxy_listener_acceptcb(): DELETE thr=%d, fd=%d, fd2=%d, time=%d <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< TIMED OUT\n",
delete->thridx, delete->fd, delete->fd2, now - delete->access_time);
proxy_conn_meta_ctx_t *conn2del = new_delete_list;
while (conn2del) {
proxy_conn_meta_ctx_t *next = conn2del->delete;
pthread_mutex_lock(&delete->mutex);
pxy_all_conn_free(delete);
pthread_mutex_unlock(&delete->mutex);
free(delete);
pthread_mutex_lock(&conn2del->mutex);
log_dbg_level_printf(LOG_DBG_MODE_FINE, ">>>>> !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! proxy_listener_acceptcb: DELETE thr=%d, fd=%d, fd2=%d, time=%d <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< TIMED OUT\n",
conn2del->thridx, conn2del->fd, conn2del->fd2, now - conn2del->access_time);
pxy_all_conn_free(conn2del);
// XXX: Releasing the lock causes callback functions to continue with a deleted mctx?
//pthread_mutex_unlock(&conn2del->mutex);
pthread_mutex_destroy(&conn2del->mutex);
free(conn2del);
delete = next;
conn2del = next;
}
// pthread_mutex_unlock(&lctx->thrmgr->mutex);
@ -242,6 +255,15 @@ proxy_listener_acceptcb(UNUSED struct evconnlistener *listener,
pthread_mutex_t *cmutex = &mctx->mutex;
my_pthread_mutex_lock(cmutex);
char *host, *port;
if (sys_sockaddr_str(peeraddr, peeraddrlen, &host, &port) != 0) {
log_dbg_level_printf(LOG_DBG_MODE_FINEST, ">>>>> !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! proxy_listener_acceptcb: PEER failed\n");
} else {
log_dbg_level_printf(LOG_DBG_MODE_FINEST, ">>>>> !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! proxy_listener_acceptcb: PEER [%s]:%s <<<<< fd=%d\n", host, port, fd);
free(host);
free(port);
}
mctx->lctx = lctx;
mctx->fd = fd;

@ -32,6 +32,7 @@
#include "attrib.h"
#include "pxythrmgr.h"
#include <pthread.h>
#include <uuid.h>
typedef struct proxy_ctx proxy_ctx_t;
typedef struct proxy_listener_ctx proxy_listener_ctx_t;
@ -39,6 +40,8 @@ typedef struct pxy_conn_ctx pxy_conn_ctx_t;
typedef struct proxy_conn_meta_ctx proxy_conn_meta_ctx_t;
typedef struct proxy_conn_meta_ctx {
uuid_t *uuid;
proxy_listener_ctx_t *lctx;
evutil_socket_t fd;

@ -2172,7 +2172,6 @@ pxy_child_conn_free(pxy_conn_ctx_t *ctx)
e2dst->bev = NULL;
}
int rv = 1;
log_dbg_level_printf(LOG_DBG_MODE_FINEST, ">############################# pxy_conn_free_e2: remove_node\n");
remove_node(ctx, &ctx->mctx->child_ctx);
@ -2308,8 +2307,6 @@ pxy_bev_readcb(struct bufferevent *bev, void *arg)
log_dbg_level_printf(LOG_DBG_MODE_FINE, ">>>>>,,,,,,,,,,,,,,,,,,,,,,, pxy_bev_readcb: NULL ctx || mctx <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< GONE\n");
return;
}
ctx->mctx->access_time = time(NULL);
// pthread_mutex_t *cmutex = &ctx->thrmgr->mutex2;
pthread_mutex_t *cmutex = &ctx->mctx->mutex;
@ -2318,8 +2315,12 @@ pxy_bev_readcb(struct bufferevent *bev, void *arg)
if (!ctx || !ctx->mctx) {
log_dbg_level_printf(LOG_DBG_MODE_FINE, ">>>>>,,,,,,,,,,,,,,,,,,,,,,, pxy_bev_readcb: NULL ctx || mctx <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< GONE after lock\n");
goto leave;
} else {
log_dbg_level_printf(LOG_DBG_MODE_FINEST, ">>>>>,,,,,,,,,,,,,,,,,,,,,,, pxy_bev_readcb: ENTER fd=%d, fd2=%d\n", ctx->mctx->fd, ctx->mctx->fd2);
}
ctx->mctx->access_time = time(NULL);
char event_name[6] = "\0\0\0\0\0\0";
if (bev == ctx->src.bev) {
strcpy(event_name, "src");
@ -2491,8 +2492,6 @@ pxy_bev_readcb_e2(struct bufferevent *bev, void *arg)
return;
}
ctx->mctx->access_time = time(NULL);
// pthread_mutex_t *cmutex = &ctx->thrmgr->mutex2;
pthread_mutex_t *cmutex = &ctx->mctx->mutex;
my_pthread_mutex_lock(cmutex);
@ -2500,7 +2499,11 @@ pxy_bev_readcb_e2(struct bufferevent *bev, void *arg)
if (!ctx || !ctx->mctx) {
log_dbg_level_printf(LOG_DBG_MODE_FINE, ">>>>>....................... pxy_bev_readcb_e2: NULL ctx || mctx <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< GONE after lock\n");
goto leave;
} else {
log_dbg_level_printf(LOG_DBG_MODE_FINEST, ">>>>>....................... pxy_bev_readcb_e2: ENTER fd=%d, fd2=%d\n", ctx->mctx->fd, ctx->mctx->fd2);
}
ctx->mctx->access_time = time(NULL);
pxy_conn_ctx_t *parent_ctx = ctx->mctx->parent_ctx;
evutil_socket_t pfd = -1;
@ -2804,8 +2807,6 @@ pxy_bev_writecb(struct bufferevent *bev, void *arg)
log_dbg_level_printf(LOG_DBG_MODE_FINE, ">>>>>+++++++++++++++++++++++++++++++++++ pxy_bev_writecb: NULL ctx || mctx <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< GONE\n");
return;
}
ctx->mctx->access_time = time(NULL);
// pthread_mutex_t *cmutex = &ctx->thrmgr->mutex2;
proxy_conn_meta_ctx_t *mctx = ctx->mctx;
@ -2817,7 +2818,11 @@ pxy_bev_writecb(struct bufferevent *bev, void *arg)
if (!ctx || !ctx->mctx) {
log_dbg_level_printf(LOG_DBG_MODE_FINE, ">>>>>+++++++++++++++++++++++++++++++++++ pxy_bev_writecb: NULL ctx || mctx <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< GONE after lock\n");
goto leave;
} else {
log_dbg_level_printf(LOG_DBG_MODE_FINEST, ">>>>>+++++++++++++++++++++++++++++++++++ pxy_bev_writecb: ENTER fd=%d, fd2=%d\n", ctx->mctx->fd, ctx->mctx->fd2);
}
ctx->mctx->access_time = time(NULL);
char event_name[6] = "\0\0\0\0\0\0";
if (bev == ctx->src.bev) {
@ -2875,8 +2880,6 @@ pxy_bev_writecb_e2(struct bufferevent *bev, void *arg)
return;
}
ctx->mctx->access_time = time(NULL);
// pthread_mutex_t *cmutex = &ctx->thrmgr->mutex2;
proxy_conn_meta_ctx_t *mctx = ctx->mctx;
pthread_mutex_t *cmutex = &mctx->mutex;
@ -2887,8 +2890,12 @@ pxy_bev_writecb_e2(struct bufferevent *bev, void *arg)
if (!ctx || !ctx->mctx) {
log_dbg_level_printf(LOG_DBG_MODE_FINE, ">>>>>??????????????????????????? pxy_bev_writecb_e2: NULL ctx || mctx <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< GONE after lock\n");
goto leave;
} else {
log_dbg_level_printf(LOG_DBG_MODE_FINEST, ">>>>>??????????????????????????? pxy_bev_writecb_e2: ENTER fd=%d, fd2=%d\n", ctx->mctx->fd, ctx->mctx->fd2);
}
ctx->mctx->access_time = time(NULL);
pxy_conn_ctx_t *parent_ctx = ctx->mctx->parent_ctx;
char event_name[6] = "\0\0\0\0\0\0";
@ -2969,8 +2976,6 @@ pxy_bev_eventcb(struct bufferevent *bev, short events, void *arg)
return;
}
ctx->mctx->access_time = time(NULL);
// pthread_mutex_t *cmutex = &ctx->thrmgr->mutex2;
proxy_conn_meta_ctx_t *mctx = ctx->mctx;
pthread_mutex_t *cmutex = &mctx->mutex;
@ -2981,13 +2986,17 @@ pxy_bev_eventcb(struct bufferevent *bev, short events, void *arg)
if (!ctx || !ctx->mctx) {
log_dbg_level_printf(LOG_DBG_MODE_FINE, ">>>>>=================================== pxy_bev_eventcb: NULL ctx || mctx <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< GONE after lock\n");
goto leave;
} else {
log_dbg_level_printf(LOG_DBG_MODE_FINEST, ">>>>>=================================== pxy_bev_eventcb: ENTER fd=%d, fd2=%d\n", ctx->mctx->fd, ctx->mctx->fd2);
}
ctx->mctx->access_time = time(NULL);
evutil_socket_t fd = -1;
if (!ctx) {
log_dbg_level_printf(LOG_DBG_MODE_FINE, ">>>>>=================================== pxy_bev_eventcb: NULL ctx <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< GONE\n");
goto leave;
}
// if (!ctx) {
// log_dbg_level_printf(LOG_DBG_MODE_FINE, ">>>>>=================================== pxy_bev_eventcb: NULL ctx <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< GONE\n");
// goto leave;
// }
fd = ctx->fd;
log_dbg_level_printf(LOG_DBG_MODE_FINEST, ">>>>>=================================== pxy_bev_eventcb ENTER fd=%d\n", ctx->fd);
@ -3209,8 +3218,6 @@ pxy_bev_eventcb_e2(struct bufferevent *bev, short events, void *arg)
return;
}
ctx->mctx->access_time = time(NULL);
proxy_conn_meta_ctx_t *mctx = ctx->mctx;
pthread_mutex_t *cmutex = &mctx->mutex;
my_pthread_mutex_lock(cmutex);
@ -3220,8 +3227,12 @@ pxy_bev_eventcb_e2(struct bufferevent *bev, short events, void *arg)
if (!ctx || !ctx->mctx) {
log_dbg_level_printf(LOG_DBG_MODE_FINE, ">>>>>--------------------- pxy_bev_eventcb_e2: NULL ctx || mctx <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< GONE after lock\n");
goto leave;
} else {
log_dbg_level_printf(LOG_DBG_MODE_FINEST, ">>>>>--------------------- pxy_bev_eventcb_e2: ENTER fd=%d, fd2=%d\n", ctx->mctx->fd, ctx->mctx->fd2);
}
ctx->mctx->access_time = time(NULL);
char event_name[6] = "\0\0\0\0\0\0";
if (bev == ctx->src.bev) {
strcpy(event_name, "src");

@ -33,6 +33,7 @@
#include <string.h>
#include <pthread.h>
#include <assert.h>
/*
* Proxy thread manager: manages the connection handling worker threads
@ -295,9 +296,44 @@ pxy_thrmgr_free(pxy_thrmgr_ctx_t *ctx)
free(ctx);
}
//int
//pxy_thrmgr_is_same_mctx(proxy_conn_meta_ctx_t *mctx1, proxy_conn_meta_ctx_t *mctx2, int stop)
//{
// if (!mctx1 && !mctx2) {
// log_dbg_level_printf(LOG_DBG_MODE_FINEST, ">>>>> pxy_thrmgr_is_same_mctx: SAME both NULL\n");
// return 1;
//// } else if (mctx1 && mctx2) {
//// if ((uuid_compare(mctx1->uuid, mctx2->uuid, NULL) == 0) && (mctx1->fd == mctx2->fd) && (mctx1->fd2 == mctx2->fd2) &&
//// (mctx1->src_fd == mctx2->src_fd) && (mctx1->e2src_fd == mctx2->e2src_fd) &&
//// (mctx1->e2dst_fd == mctx2->e2dst_fd) && (mctx1->dst_fd == mctx2->dst_fd) &&
//// (mctx1->dst2_fd == mctx2->dst2_fd) && (mctx1->child_count == mctx2->child_count) &&
////// (mctx1->access_time == mctx2->access_time) && (mctx1->initialized == mctx2->initialized) &&
//// // Stop recursion
//// (stop || (pxy_thrmgr_is_same_mctx(mctx1->next, mctx2->next, 1))) ) {
//// log_dbg_level_printf(LOG_DBG_MODE_FINEST, ">>>>> pxy_thrmgr_is_same_mctx: SAME match ALL, fd=%d, fd2=%d\n", mctx1->fd, mctx1->fd2);
//// return 1;
//// }
//// }
// } else if ((mctx1 && mctx2) && (uuid_compare(mctx1->uuid, mctx2->uuid, NULL) == 0)) {
// log_dbg_level_printf(LOG_DBG_MODE_FINEST, ">>>>> pxy_thrmgr_is_same_mctx: UUIDs match, fd=%d, fd2=%d\n", mctx1->fd, mctx1->fd2);
// return 1;
// }
// log_dbg_level_printf(LOG_DBG_MODE_FINEST, ">>>>> pxy_thrmgr_is_same_mctx: NOT same, fd=%d, fd2=%d\n", mctx1->fd, mctx1->fd2);
// return 0;
//}
void
pxy_thrmgr_remove_node(proxy_conn_meta_ctx_t *node, proxy_conn_meta_ctx_t **head) {
if (node->fd == (*head)->fd) {
pxy_thrmgr_remove_node(proxy_conn_meta_ctx_t *node, proxy_conn_meta_ctx_t **head)
{
assert(node != NULL);
assert(*head != NULL);
log_dbg_level_printf(LOG_DBG_MODE_FINEST, ">>>>> pxy_thrmgr_remove_node: DELETING, fd=%d, fd2=%d\n", node->fd, node->fd2);
// XXX: Does (fd, fd2) pair uniquely define a connection? Just fd was supposed to be enough.
// @todo fd may be the same for multiple connections, and if fd2 is NULL, do we get a clash?
// if ((node->fd == (*head)->fd) && (node->fd2 == (*head)->fd2)) {
// if (pxy_thrmgr_is_same_mctx(node, *head, 0)) {
if (uuid_compare(node->uuid, (*head)->uuid, NULL) == 0) {
*head = (*head)->next;
return;
}
@ -305,7 +341,9 @@ pxy_thrmgr_remove_node(proxy_conn_meta_ctx_t *node, proxy_conn_meta_ctx_t **head
proxy_conn_meta_ctx_t *current = (*head)->next;
proxy_conn_meta_ctx_t *previous = *head;
while (current != NULL && previous != NULL) {
if (node->fd == current->fd) {
// if ((node->fd == current->fd) && (node->fd2 == current->fd2)) {
// if (pxy_thrmgr_is_same_mctx(node, current, 0)) {
if (uuid_compare(node->uuid, current->uuid, NULL) == 0) {
previous->next = current->next;
return;
}

Loading…
Cancel
Save