set parent environ to udfd

This commit is contained in:
laiyongtao 2024-04-25 20:58:50 +08:00
parent 3986f392b5
commit 739acf425a
1 changed files with 40 additions and 2 deletions

View File

@ -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;
}