enhance: support resident functions
This commit is contained in:
parent
75e8813386
commit
d156bff782
|
@ -29,7 +29,7 @@
|
||||||
#include "trpc.h"
|
#include "trpc.h"
|
||||||
// clang-foramt on
|
// clang-foramt on
|
||||||
|
|
||||||
SArray* udfdResidentFuncs;
|
SArray* udfdResidentFuncs = NULL;
|
||||||
|
|
||||||
typedef struct SUdfdContext {
|
typedef struct SUdfdContext {
|
||||||
uv_loop_t * loop;
|
uv_loop_t * loop;
|
||||||
|
@ -69,6 +69,7 @@ typedef struct SUdf {
|
||||||
EUdfState state;
|
EUdfState state;
|
||||||
uv_mutex_t lock;
|
uv_mutex_t lock;
|
||||||
uv_cond_t condReady;
|
uv_cond_t condReady;
|
||||||
|
bool resident;
|
||||||
|
|
||||||
char name[TSDB_FUNC_NAME_LEN];
|
char name[TSDB_FUNC_NAME_LEN];
|
||||||
int8_t funcType;
|
int8_t funcType;
|
||||||
|
@ -202,6 +203,14 @@ void udfdProcessSetupRequest(SUvUdfWork *uvUdf, SUdfRequest *request) {
|
||||||
if (udf->initFunc) {
|
if (udf->initFunc) {
|
||||||
udf->initFunc();
|
udf->initFunc();
|
||||||
}
|
}
|
||||||
|
udf->resident = false;
|
||||||
|
for (int32_t i = 0; i < taosArrayGetSize(udfdResidentFuncs); ++i) {
|
||||||
|
char* funcName = taosArrayGet(udfdResidentFuncs, i);
|
||||||
|
if (strcmp(setup->udfName, funcName) == 0) {
|
||||||
|
udf->resident = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
udf->state = UDF_STATE_READY;
|
udf->state = UDF_STATE_READY;
|
||||||
uv_cond_broadcast(&udf->condReady);
|
uv_cond_broadcast(&udf->condReady);
|
||||||
uv_mutex_unlock(&udf->lock);
|
uv_mutex_unlock(&udf->lock);
|
||||||
|
@ -347,7 +356,7 @@ void udfdProcessTeardownRequest(SUvUdfWork *uvUdf, SUdfRequest *request) {
|
||||||
|
|
||||||
uv_mutex_lock(&global.udfsMutex);
|
uv_mutex_lock(&global.udfsMutex);
|
||||||
udf->refCount--;
|
udf->refCount--;
|
||||||
if (udf->refCount == 0) {
|
if (udf->refCount == 0 && !udf->resident) {
|
||||||
unloadUdf = true;
|
unloadUdf = true;
|
||||||
taosHashRemove(global.udfsHash, udf->name, strlen(udf->name));
|
taosHashRemove(global.udfsHash, udf->name, strlen(udf->name));
|
||||||
}
|
}
|
||||||
|
@ -944,10 +953,28 @@ void udfdConnectMnodeThreadFunc(void *args) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t udfdInitResidentFuncs() {
|
int32_t udfdInitResidentFuncs() {
|
||||||
|
udfdResidentFuncs = taosArrayInit(2, TSDB_FUNC_NAME_LEN);
|
||||||
|
char gpd[TSDB_FUNC_NAME_LEN] = "gpd";
|
||||||
|
taosArrayPush(udfdResidentFuncs, gpd);
|
||||||
|
char gpdBatch[TSDB_FUNC_NAME_LEN] = "gpdbatch";
|
||||||
|
taosArrayPush(udfdResidentFuncs, gpdBatch);
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t udfdDeinitResidentFuncs() {
|
int32_t udfdDeinitResidentFuncs() {
|
||||||
|
for (int32_t i = 0; i < taosArrayGetSize(udfdResidentFuncs); ++i) {
|
||||||
|
char* funcName = taosArrayGet(udfdResidentFuncs, i);
|
||||||
|
SUdf** udfInHash = taosHashGet(global.udfsHash, funcName, strlen(funcName));
|
||||||
|
if (udfInHash) {
|
||||||
|
taosHashRemove(global.udfsHash, funcName, strlen(funcName));
|
||||||
|
SUdf* udf = *udfInHash;
|
||||||
|
if (udf->destroyFunc) {
|
||||||
|
(udf->destroyFunc)();
|
||||||
|
}
|
||||||
|
uv_dlclose(&udf->lib);
|
||||||
|
taosMemoryFree(udf);
|
||||||
|
}
|
||||||
|
}
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -40,10 +40,6 @@ DLL_EXPORT int32_t udf1(SUdfDataBlock* block, SUdfColumn *resultCol) {
|
||||||
udfColDataSet(resultCol, i, (char *)&luckyNum, false);
|
udfColDataSet(resultCol, i, (char *)&luckyNum, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
TAOS* taos = taos_connect("127.0.0.1", "root", "taosdata", "gpd", 6030);
|
|
||||||
taos_query(taos, "create st (ts timestamp, f int) tags(t int)");
|
|
||||||
taos_query(taos, "insert into t using st tags(1) values(now, 1) ");
|
|
||||||
taos_query(taos, "select * from gpd.t");
|
|
||||||
//to simulate actual processing delay by udf
|
//to simulate actual processing delay by udf
|
||||||
#ifdef LINUX
|
#ifdef LINUX
|
||||||
usleep(1 * 1000); // usleep takes sleep time in us (1 millionth of a second)
|
usleep(1 * 1000); // usleep takes sleep time in us (1 millionth of a second)
|
||||||
|
|
|
@ -0,0 +1,77 @@
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#ifdef LINUX
|
||||||
|
#include <unistd.h>
|
||||||
|
#endif
|
||||||
|
#ifdef WINDOWS
|
||||||
|
#include <windows.h>
|
||||||
|
#endif
|
||||||
|
#include "taosudf.h"
|
||||||
|
|
||||||
|
|
||||||
|
DLL_EXPORT int32_t gpd_init() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
DLL_EXPORT int32_t gpd_destroy() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
DLL_EXPORT int32_t gpd(SUdfDataBlock* block, SUdfColumn *resultCol) {
|
||||||
|
SUdfColumnMeta *meta = &resultCol->colMeta;
|
||||||
|
meta->bytes = 4;
|
||||||
|
meta->type = TSDB_DATA_TYPE_INT;
|
||||||
|
meta->scale = 0;
|
||||||
|
meta->precision = 0;
|
||||||
|
|
||||||
|
SUdfColumnData *resultData = &resultCol->colData;
|
||||||
|
resultData->numOfRows = block->numOfRows;
|
||||||
|
for (int32_t i = 0; i < resultData->numOfRows; ++i) {
|
||||||
|
int j = 0;
|
||||||
|
for (; j < block->numOfCols; ++j) {
|
||||||
|
if (udfColDataIsNull(block->udfCols[j], i)) {
|
||||||
|
udfColDataSetNull(resultCol, i);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ( j == block->numOfCols) {
|
||||||
|
int32_t luckyNum = 88;
|
||||||
|
udfColDataSet(resultCol, i, (char *)&luckyNum, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
taos_init();
|
||||||
|
TAOS* taos = taos_connect("localhost", "root", "taosdata", "", 7100);
|
||||||
|
if (taos == NULL) {
|
||||||
|
char* errstr = "can not connect";
|
||||||
|
}
|
||||||
|
TAOS_RES* res = taos_query(taos, "create database if not exists gpd");
|
||||||
|
if (taos_errno(res) != 0) {
|
||||||
|
char* errstr = taos_errstr(res);
|
||||||
|
}
|
||||||
|
res = taos_query(taos, "create table gpd.st (ts timestamp, f int) tags(t int)");
|
||||||
|
if (taos_errno(res) != 0) {
|
||||||
|
char* errstr = taos_errstr(res);
|
||||||
|
}
|
||||||
|
|
||||||
|
taos_query(taos, "insert into gpd.t using gpd.st tags(1) values(now, 1) ");
|
||||||
|
if (taos_errno(res) != 0) {
|
||||||
|
char* errstr = taos_errstr(res);
|
||||||
|
}
|
||||||
|
|
||||||
|
taos_query(taos, "select * from gpd.t");
|
||||||
|
if (taos_errno(res) != 0) {
|
||||||
|
char* errstr = taos_errstr(res);
|
||||||
|
}
|
||||||
|
|
||||||
|
taos_close(taos);
|
||||||
|
taos_cleanup();
|
||||||
|
//to simulate actual processing delay by udf
|
||||||
|
#ifdef LINUX
|
||||||
|
usleep(1 * 1000); // usleep takes sleep time in us (1 millionth of a second)
|
||||||
|
#endif
|
||||||
|
#ifdef WINDOWS
|
||||||
|
Sleep(1);
|
||||||
|
#endif
|
||||||
|
return 0;
|
||||||
|
}
|
Loading…
Reference in New Issue