add rpc update interface
This commit is contained in:
parent
b8e9b00564
commit
b485a61767
|
@ -56,6 +56,8 @@ typedef struct SSvrConn {
|
||||||
char user[TSDB_UNI_LEN]; // user ID for the link
|
char user[TSDB_UNI_LEN]; // user ID for the link
|
||||||
char secret[TSDB_PASSWORD_LEN];
|
char secret[TSDB_PASSWORD_LEN];
|
||||||
char ckey[TSDB_PASSWORD_LEN]; // ciphering key
|
char ckey[TSDB_PASSWORD_LEN]; // ciphering key
|
||||||
|
|
||||||
|
int64_t whiteListVer;
|
||||||
} SSvrConn;
|
} SSvrConn;
|
||||||
|
|
||||||
typedef struct SSvrMsg {
|
typedef struct SSvrMsg {
|
||||||
|
@ -69,6 +71,10 @@ typedef struct SSvrMsg {
|
||||||
|
|
||||||
} SSvrMsg;
|
} SSvrMsg;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
SHashObj* pList;
|
||||||
|
int64_t ver;
|
||||||
|
} SWhiteList;
|
||||||
typedef struct SWorkThrd {
|
typedef struct SWorkThrd {
|
||||||
TdThread thread;
|
TdThread thread;
|
||||||
uv_connect_t connect_req;
|
uv_connect_t connect_req;
|
||||||
|
@ -83,7 +89,8 @@ typedef struct SWorkThrd {
|
||||||
void* pTransInst;
|
void* pTransInst;
|
||||||
bool quit;
|
bool quit;
|
||||||
|
|
||||||
SHashObj* pWhiteList;
|
SWhiteList* pWhiteList;
|
||||||
|
int64_t whiteListVer;
|
||||||
} SWorkThrd;
|
} SWorkThrd;
|
||||||
|
|
||||||
typedef struct SServerObj {
|
typedef struct SServerObj {
|
||||||
|
@ -106,6 +113,14 @@ typedef struct SServerObj {
|
||||||
bool inited;
|
bool inited;
|
||||||
} SServerObj;
|
} SServerObj;
|
||||||
|
|
||||||
|
SWhiteList* uvWhiteListCreate();
|
||||||
|
void uvWhiteListDestroy(SWhiteList* pWhite);
|
||||||
|
void uvWhiteListAdd(SWhiteList* pWhite, char* user, char* ip);
|
||||||
|
void uvWhiteListUpdate(SWhiteList* pWhite, SHashObj* pTable);
|
||||||
|
bool uvWhiteListCheckConn(SWhiteList* pWhite, SSvrConn* pConn);
|
||||||
|
bool uvWhiteListFilte(SWhiteList* pWhite, char* user, uint32_t ip);
|
||||||
|
void uvWhiteListSetConnVer(SWhiteList* pWhite, SSvrConn* pConn);
|
||||||
|
|
||||||
static void uvAllocConnBufferCb(uv_handle_t* handle, size_t suggested_size, uv_buf_t* buf);
|
static void uvAllocConnBufferCb(uv_handle_t* handle, size_t suggested_size, uv_buf_t* buf);
|
||||||
static void uvAllocRecvBufferCb(uv_handle_t* handle, size_t suggested_size, uv_buf_t* buf);
|
static void uvAllocRecvBufferCb(uv_handle_t* handle, size_t suggested_size, uv_buf_t* buf);
|
||||||
static void uvOnRecvCb(uv_stream_t* cli, ssize_t nread, const uv_buf_t* buf);
|
static void uvOnRecvCb(uv_stream_t* cli, ssize_t nread, const uv_buf_t* buf);
|
||||||
|
@ -263,44 +278,57 @@ static bool uvCheckIp(char* range, int32_t ip) {
|
||||||
return subnetCheckIp(&subnet, ip);
|
return subnetCheckIp(&subnet, ip);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void uvWhiteListDestroy(SHashObj* pWhiteList) {
|
SWhiteList* uvWhiteListCreate() {
|
||||||
void* pIter = taosHashIterate(pWhiteList, NULL);
|
SWhiteList* pWhiteList = taosMemoryCalloc(1, sizeof(SWhiteList));
|
||||||
|
|
||||||
|
pWhiteList->pList = taosHashInit(8, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), 0, HASH_NO_LOCK);
|
||||||
|
pWhiteList->ver = 0;
|
||||||
|
return pWhiteList;
|
||||||
|
}
|
||||||
|
void uvWhiteListDestroy(SWhiteList* pWhite) {
|
||||||
|
SHashObj* pWhiteList = pWhite->pList;
|
||||||
|
void* pIter = taosHashIterate(pWhiteList, NULL);
|
||||||
while (pIter) {
|
while (pIter) {
|
||||||
SArray* list = *(SArray**)pIter;
|
SArray* pArr = *(SArray**)pIter;
|
||||||
for (int i = 0; i < taosArrayGetSize(list); i++) {
|
for (int i = 0; i < taosArrayGetSize(pArr); i++) {
|
||||||
char* range = taosArrayGetP(list, i);
|
char* range = taosArrayGetP(pArr, i);
|
||||||
taosMemoryFree(range);
|
taosMemoryFree(range);
|
||||||
}
|
}
|
||||||
taosArrayDestroy(list);
|
taosArrayDestroy(pArr);
|
||||||
pIter = taosHashIterate(pWhiteList, pIter);
|
pIter = taosHashIterate(pWhiteList, pIter);
|
||||||
}
|
}
|
||||||
taosHashCleanup(pWhiteList);
|
taosHashCleanup(pWhiteList);
|
||||||
}
|
taosMemoryFree(pWhite);
|
||||||
static bool uvWhiteListAdd(SHashObj* pWhiteList, char* user, char* ip) {
|
|
||||||
SArray** pWhite = taosHashGet(pWhiteList, user, strlen(user));
|
|
||||||
if (pWhite == NULL || *pWhite == NULL) {
|
|
||||||
SArray* list = taosArrayInit(8, sizeof(void*));
|
|
||||||
taosArrayPush(list, &ip);
|
|
||||||
taosHashPut(pWhiteList, user, strlen(user), &list, sizeof(void*));
|
|
||||||
} else {
|
|
||||||
taosArrayPush(*pWhite, &ip);
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool uvWhiteListFilte(SHashObj* pWhiteList, char* user, uint32_t ip) {
|
void uvWhiteListAdd(SWhiteList* pWhite, char* user, char* ip) {
|
||||||
|
SHashObj* pWhiteList = pWhite->pList;
|
||||||
|
|
||||||
|
SArray** ppArr = taosHashGet(pWhiteList, user, strlen(user));
|
||||||
|
if (ppArr == NULL || *ppArr == NULL) {
|
||||||
|
SArray* pArr = taosArrayInit(8, sizeof(void*));
|
||||||
|
taosArrayPush(pArr, &ip);
|
||||||
|
taosHashPut(pWhiteList, user, strlen(user), &pArr, sizeof(void*));
|
||||||
|
} else {
|
||||||
|
taosArrayPush(*ppArr, &ip);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void uvWhiteListUpdate(SWhiteList* pWhite, SHashObj* pTable) {
|
||||||
|
// impl later
|
||||||
|
}
|
||||||
|
|
||||||
|
bool uvWhiteListFilte(SWhiteList* pWhite, char* user, uint32_t ip) {
|
||||||
// impl check
|
// impl check
|
||||||
bool valid = false;
|
SHashObj* pWhiteList = pWhite->pList;
|
||||||
SArray** pWhite = taosHashGet(pWhiteList, user, strlen(user));
|
bool valid = false;
|
||||||
if (pWhite == NULL || *pWhite == NULL) {
|
SArray** ppArr = taosHashGet(pWhiteList, user, strlen(user));
|
||||||
|
if (ppArr == NULL || *ppArr == NULL) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// char userIp[64] = {0};
|
for (int i = 0; i < taosArrayGetSize(*ppArr); i++) {
|
||||||
// tinet_ntoa(userIp, ip);
|
char* range = taosArrayGetP(*ppArr, i);
|
||||||
|
|
||||||
for (int i = 0; i < taosArrayGetSize(*pWhite); i++) {
|
|
||||||
char* range = taosArrayGetP(*pWhite, i);
|
|
||||||
if (uvCheckIp(range, ip)) {
|
if (uvCheckIp(range, ip)) {
|
||||||
valid = true;
|
valid = true;
|
||||||
break;
|
break;
|
||||||
|
@ -308,6 +336,16 @@ static bool uvWhiteListFilte(SHashObj* pWhiteList, char* user, uint32_t ip) {
|
||||||
}
|
}
|
||||||
return valid;
|
return valid;
|
||||||
}
|
}
|
||||||
|
bool uvWhiteListCheckConn(SWhiteList* pWhite, SSvrConn* pConn) {
|
||||||
|
if (pWhite->ver == pConn->whiteListVer) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return uvWhiteListFilte(pWhite, pConn->user, pConn->clientIp);
|
||||||
|
}
|
||||||
|
void uvWhiteListSetConnVer(SWhiteList* pWhite, SSvrConn* pConn) {
|
||||||
|
// if conn already check by current whiteLis
|
||||||
|
pConn->whiteListVer = pWhite->ver;
|
||||||
|
}
|
||||||
|
|
||||||
static bool uvHandleReq(SSvrConn* pConn) {
|
static bool uvHandleReq(SSvrConn* pConn) {
|
||||||
STrans* pTransInst = pConn->pTransInst;
|
STrans* pTransInst = pConn->pTransInst;
|
||||||
|
@ -320,9 +358,6 @@ static bool uvHandleReq(SSvrConn* pConn) {
|
||||||
tError("%s conn %p read invalid packet", transLabel(pTransInst), pConn);
|
tError("%s conn %p read invalid packet", transLabel(pTransInst), pConn);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (uvWhiteListFilte(pThrd->pWhiteList, pHead->user, pConn->clientIp) == false) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (transDecompressMsg((char**)&pHead, msgLen) < 0) {
|
if (transDecompressMsg((char**)&pHead, msgLen) < 0) {
|
||||||
tError("%s conn %p recv invalid packet, failed to decompress", transLabel(pTransInst), pConn);
|
tError("%s conn %p recv invalid packet, failed to decompress", transLabel(pTransInst), pConn);
|
||||||
|
@ -333,6 +368,12 @@ static bool uvHandleReq(SSvrConn* pConn) {
|
||||||
|
|
||||||
memcpy(pConn->user, pHead->user, strlen(pHead->user));
|
memcpy(pConn->user, pHead->user, strlen(pHead->user));
|
||||||
|
|
||||||
|
if (uvWhiteListCheckConn(pThrd->pWhiteList, pConn) == false) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
uvWhiteListSetConnVer(pThrd->pWhiteList, pConn);
|
||||||
|
}
|
||||||
|
|
||||||
if (uvRecvReleaseReq(pConn, pHead)) {
|
if (uvRecvReleaseReq(pConn, pHead)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -1199,7 +1240,7 @@ void* transInitServer(uint32_t ip, uint32_t port, char* label, int numOfThreads,
|
||||||
thrd->pTransInst = shandle;
|
thrd->pTransInst = shandle;
|
||||||
thrd->quit = false;
|
thrd->quit = false;
|
||||||
thrd->pTransInst = shandle;
|
thrd->pTransInst = shandle;
|
||||||
thrd->pWhiteList = taosHashInit(8, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_NO_LOCK);
|
thrd->pWhiteList = uvWhiteListCreate();
|
||||||
|
|
||||||
srv->pThreadObj[i] = thrd;
|
srv->pThreadObj[i] = thrd;
|
||||||
srv->pipe[i] = (uv_pipe_t*)taosMemoryCalloc(2, sizeof(uv_pipe_t));
|
srv->pipe[i] = (uv_pipe_t*)taosMemoryCalloc(2, sizeof(uv_pipe_t));
|
||||||
|
@ -1226,7 +1267,7 @@ void* transInitServer(uint32_t ip, uint32_t port, char* label, int numOfThreads,
|
||||||
thrd->pTransInst = shandle;
|
thrd->pTransInst = shandle;
|
||||||
thrd->quit = false;
|
thrd->quit = false;
|
||||||
thrd->pTransInst = shandle;
|
thrd->pTransInst = shandle;
|
||||||
thrd->pWhiteList = taosHashInit(8, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), 0, HASH_NO_LOCK);
|
thrd->pWhiteList = uvWhiteListCreate();
|
||||||
|
|
||||||
srv->pipe[i] = (uv_pipe_t*)taosMemoryCalloc(2, sizeof(uv_pipe_t));
|
srv->pipe[i] = (uv_pipe_t*)taosMemoryCalloc(2, sizeof(uv_pipe_t));
|
||||||
srv->pThreadObj[i] = thrd;
|
srv->pThreadObj[i] = thrd;
|
||||||
|
@ -1342,16 +1383,7 @@ void destroyWorkThrd(SWorkThrd* pThrd) {
|
||||||
TRANS_DESTROY_ASYNC_POOL_MSG(pThrd->asyncPool, SSvrMsg, destroySmsg);
|
TRANS_DESTROY_ASYNC_POOL_MSG(pThrd->asyncPool, SSvrMsg, destroySmsg);
|
||||||
transAsyncPoolDestroy(pThrd->asyncPool);
|
transAsyncPoolDestroy(pThrd->asyncPool);
|
||||||
|
|
||||||
void* pIter = taosHashIterate(pThrd->pWhiteList, NULL);
|
uvWhiteListDestroy(pThrd->pWhiteList);
|
||||||
while (pIter) {
|
|
||||||
SArray* arr = *(SArray**)pIter;
|
|
||||||
for (int i = 0; i < taosArrayGetSize(arr); i++) {
|
|
||||||
char* p = taosArrayGetP(arr, i);
|
|
||||||
taosMemoryFree(p);
|
|
||||||
}
|
|
||||||
pIter = taosHashIterate(pThrd->pWhiteList, pIter);
|
|
||||||
}
|
|
||||||
taosHashCleanup(pThrd->pWhiteList);
|
|
||||||
|
|
||||||
taosMemoryFree(pThrd->prepare);
|
taosMemoryFree(pThrd->prepare);
|
||||||
taosMemoryFree(pThrd->loop);
|
taosMemoryFree(pThrd->loop);
|
||||||
|
|
Loading…
Reference in New Issue