diff --git a/cdb2api/cdb2api.c b/cdb2api/cdb2api.c index 4cd8ac5416..7beba7960b 100644 --- a/cdb2api/cdb2api.c +++ b/cdb2api/cdb2api.c @@ -3213,7 +3213,22 @@ static int cdb2_socket_pool_get_ll(cdb2_hndl_tp *hndl, const char *typestr, int * success. Don't support local cache since it may not return fd */ int cdb2_socket_pool_get_fd(cdb2_hndl_tp *hndl, const char *typestr, int dbnum, int *port) { - int fd = cdb2_socket_pool_get_ll(hndl, typestr, dbnum, port); + void *callbackrc; + int overwrite_rc = 0; + cdb2_event *e = NULL; + int fd = -1; + + while ((e = cdb2_next_callback(hndl, CDB2_BEFORE_SOCKPOOL, e)) != NULL) { + callbackrc = cdb2_invoke_callback(hndl, e, 0); + PROCESS_EVENT_CTRL_BEFORE(hndl, e, overwrite_rc, callbackrc, overwrite_rc); + } + if (!overwrite_rc) + fd = cdb2_socket_pool_get_ll(hndl, typestr, dbnum, port); + + while ((e = cdb2_next_callback(hndl, CDB2_AFTER_SOCKPOOL, e)) != NULL) { + callbackrc = cdb2_invoke_callback(hndl, e, 1, CDB2_RETURN_VALUE, (intptr_t)fd); + PROCESS_EVENT_CTRL_AFTER(hndl, e, overwrite_rc, callbackrc); + } LOG_CALL("%s(%s,%d,%p): fd=%d\n", __func__, typestr, dbnum, port, fd); return fd; } @@ -3236,8 +3251,8 @@ static int typestr_type_is_default(const char *typestr) /* Get the sbuf of a socket matching the given type string from * the pool. Returns NULL if none is available or the sbuf on * success. */ -static COMDB2BUF *cdb2_socket_pool_get(cdb2_hndl_tp *hndl, const char *typestr, int dbnum, int *port, - int *was_from_local_cache) +static COMDB2BUF *cdb2_socket_pool_get_int(cdb2_hndl_tp *hndl, const char *typestr, int dbnum, int *port, + int *was_from_local_cache) { COMDB2BUF *sb = NULL; @@ -3295,6 +3310,31 @@ static COMDB2BUF *cdb2_socket_pool_get(cdb2_hndl_tp *hndl, const char *typestr, return sb; } +static COMDB2BUF *cdb2_socket_pool_get(cdb2_hndl_tp *hndl, const char *typestr, int dbnum, int *port, + int *was_from_local_cache) +{ + void *callbackrc; + int overwrite_rc = 0; + cdb2_event *e = NULL; + COMDB2BUF *sb = NULL; + + while ((e = cdb2_next_callback(hndl, CDB2_BEFORE_SOCKPOOL, e)) != NULL) { + callbackrc = cdb2_invoke_callback(hndl, e, 0); + PROCESS_EVENT_CTRL_BEFORE(hndl, e, overwrite_rc, callbackrc, overwrite_rc); + } + if (overwrite_rc) + goto after_callback; + + sb = cdb2_socket_pool_get_int(hndl, typestr, dbnum, port, was_from_local_cache); + +after_callback: + while ((e = cdb2_next_callback(hndl, CDB2_AFTER_SOCKPOOL, e)) != NULL) { + callbackrc = cdb2_invoke_callback(hndl, e, 1, CDB2_RETURN_VALUE, (intptr_t)sb); + PROCESS_EVENT_CTRL_AFTER(hndl, e, overwrite_rc, callbackrc); + } + return sb; +} + #ifndef CDB2API_SERVER static #endif diff --git a/cdb2api/cdb2api.h b/cdb2api/cdb2api.h index a6fa57a3af..6440d23551 100644 --- a/cdb2api/cdb2api.h +++ b/cdb2api/cdb2api.h @@ -276,14 +276,16 @@ typedef enum cdb2_event_type { CDB2_BEFORE_TCP_CONNECT = 1 << 10, CDB2_AFTER_TCP_CONNECT = 1 << 11, CDB2_AT_RECEIVE_HEARTBEAT = 1 << 12, + CDB2_BEFORE_SOCKPOOL = 1 << 13, + CDB2_AFTER_SOCKPOOL = 1 << 14, /* Logical operation events. A logicial operation event typically consists of multiple network events. */ - CDB2_AT_ENTER_RUN_STATEMENT = 1 << 13, - CDB2_AT_EXIT_RUN_STATEMENT = 1 << 14, - CDB2_AT_ENTER_NEXT_RECORD = 1 << 15, - CDB2_AT_EXIT_NEXT_RECORD = 1 << 16, + CDB2_AT_ENTER_RUN_STATEMENT = 1 << 20, + CDB2_AT_EXIT_RUN_STATEMENT = 1 << 21, + CDB2_AT_ENTER_NEXT_RECORD = 1 << 22, + CDB2_AT_EXIT_NEXT_RECORD = 1 << 23, /* Lifecycle events */ CDB2_AFTER_HNDL_ALLOC = 1 << 26,