From 739acf425a3e380ef9e1229d63763d7d62b1d85a Mon Sep 17 00:00:00 2001 From: laiyongtao Date: Thu, 25 Apr 2024 20:58:50 +0800 Subject: [PATCH] set parent environ to udfd --- source/libs/function/src/tudf.c | 42 +++++++++++++++++++++++++++++++-- 1 file changed, 40 insertions(+), 2 deletions(-) diff --git a/source/libs/function/src/tudf.c b/source/libs/function/src/tudf.c index 7e344866a5..7c0e66d072 100644 --- a/source/libs/function/src/tudf.c +++ b/source/libs/function/src/tudf.c @@ -49,6 +49,8 @@ SUdfdData udfdGlobal = {0}; int32_t udfStartUdfd(int32_t startDnodeId); int32_t udfStopUdfd(); +extern char **environ; + static int32_t udfSpawnUdfd(SUdfdData *pData); void udfUdfdExit(uv_process_t *process, int64_t exitStatus, int termSignal); static int32_t udfSpawnUdfd(SUdfdData *pData); @@ -147,7 +149,33 @@ static int32_t udfSpawnUdfd(SUdfdData *pData) { snprintf(ldLibPathEnvItem, 1024 + 32, "%s=%s", "LD_LIBRARY_PATH", udfdPathLdLib); char *envUdfd[] = {dnodeIdEnvItem, thrdPoolSizeEnvItem, ldLibPathEnvItem, NULL}; - options.env = envUdfd; + char **envUdfdWithPEnv = NULL; + if (environ != NULL) { + int numEnviron = 0; + while (environ[numEnviron] != NULL) { + numEnviron++; + } + int lenEnvUdfd = ARRAY_SIZE(envUdfd); + + envUdfdWithPEnv = (char**) taosMemoryMalloc((numEnviron + lenEnvUdfd) * sizeof(char*)); + + int i; + for (i = 0; i < numEnviron; i++) { + envUdfdWithPEnv[i] = (char*) taosMemoryMalloc(strlen(environ[i]) + 1); + strcpy(envUdfdWithPEnv[i], environ[i]); + } + for (i = 0; i < lenEnvUdfd; i++) { + if (envUdfd[i] != NULL) { + envUdfdWithPEnv[numEnviron + i] = (char*) taosMemoryMalloc(strlen(envUdfd[i]) + 1); + strcpy(envUdfdWithPEnv[numEnviron + i], envUdfd[i]); + } + } + envUdfdWithPEnv[numEnviron + lenEnvUdfd - 1] = NULL; + + options.env = envUdfdWithPEnv; + } else { + options.env = envUdfd; + } int err = uv_spawn(&pData->loop, &pData->process, &options); pData->process.data = (void *)pData; @@ -176,6 +204,16 @@ static int32_t udfSpawnUdfd(SUdfdData *pData) { } else { fnInfo("udfd is initialized"); } + + if (envUdfdWithPEnv != NULL) { + int i = 0; + while (envUdfdWithPEnv[i] != NULL) { + taosMemoryFree(envUdfdWithPEnv[i]); + i++; + } + taosMemoryFree(envUdfdWithPEnv); + } + return err; } @@ -1941,7 +1979,7 @@ int32_t doCallUdfScalarFunc(UdfcFuncHandle handle, SScalarParam *input, int32_t convertDataBlockToScalarParm(&resultBlock, output); taosArrayDestroy(resultBlock.pDataBlock); } - + blockDataFreeRes(&inputBlock); return err; }