add rpc update interface

This commit is contained in:
yihaoDeng 2023-09-04 09:56:32 +08:00
parent e3682628a3
commit 59ce623efe
1 changed files with 32 additions and 22 deletions

View File

@ -71,6 +71,10 @@ typedef struct SSvrMsg {
} SSvrMsg; } SSvrMsg;
typedef struct {
int64_t ver;
SArray* list;
} SWhiteUserList;
typedef struct { typedef struct {
SHashObj* pList; SHashObj* pList;
int64_t ver; int64_t ver;
@ -118,7 +122,7 @@ void uvWhiteListDestroy(SWhiteList* pWhite);
void uvWhiteListAdd(SWhiteList* pWhite, char* user, char* ip); void uvWhiteListAdd(SWhiteList* pWhite, char* user, char* ip);
void uvWhiteListUpdate(SWhiteList* pWhite, SHashObj* pTable); void uvWhiteListUpdate(SWhiteList* pWhite, SHashObj* pTable);
bool uvWhiteListCheckConn(SWhiteList* pWhite, SSvrConn* pConn); bool uvWhiteListCheckConn(SWhiteList* pWhite, SSvrConn* pConn);
bool uvWhiteListFilte(SWhiteList* pWhite, char* user, uint32_t ip); bool uvWhiteListFilte(SWhiteList* pWhite, char* user, uint32_t ip, int64_t ver);
void uvWhiteListSetConnVer(SWhiteList* pWhite, SSvrConn* pConn); 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);
@ -289,12 +293,13 @@ void uvWhiteListDestroy(SWhiteList* pWhite) {
SHashObj* pWhiteList = pWhite->pList; SHashObj* pWhiteList = pWhite->pList;
void* pIter = taosHashIterate(pWhiteList, NULL); void* pIter = taosHashIterate(pWhiteList, NULL);
while (pIter) { while (pIter) {
SArray* pArr = *(SArray**)pIter; SWhiteUserList* pList = *(SWhiteUserList**)pIter;
for (int i = 0; i < taosArrayGetSize(pArr); i++) { for (int i = 0; i < taosArrayGetSize(pList->list); i++) {
char* range = taosArrayGetP(pArr, i); char* range = taosArrayGetP(pList->list, i);
taosMemoryFree(range); taosMemoryFree(range);
} }
taosArrayDestroy(pArr); taosArrayDestroy(pList->list);
taosMemoryFree(pList);
pIter = taosHashIterate(pWhiteList, pIter); pIter = taosHashIterate(pWhiteList, pIter);
} }
taosHashCleanup(pWhiteList); taosHashCleanup(pWhiteList);
@ -304,13 +309,17 @@ void uvWhiteListDestroy(SWhiteList* pWhite) {
void uvWhiteListAdd(SWhiteList* pWhite, char* user, char* ip) { void uvWhiteListAdd(SWhiteList* pWhite, char* user, char* ip) {
SHashObj* pWhiteList = pWhite->pList; SHashObj* pWhiteList = pWhite->pList;
SArray** ppArr = taosHashGet(pWhiteList, user, strlen(user)); SWhiteUserList** ppList = taosHashGet(pWhiteList, user, strlen(user));
if (ppArr == NULL || *ppArr == NULL) { if (ppList == NULL || *ppList == NULL) {
SArray* pArr = taosArrayInit(8, sizeof(void*)); SWhiteUserList* pList = taosMemoryCalloc(1, sizeof(SWhiteUserList));
taosArrayPush(pArr, &ip); pList->list = taosArrayInit(8, sizeof(void*));
taosHashPut(pWhiteList, user, strlen(user), &pArr, sizeof(void*)); taosArrayPush(pList->list, &ip);
pList->ver += 1;
taosHashPut(pWhiteList, user, strlen(user), &pList, sizeof(void*));
} else { } else {
taosArrayPush(*ppArr, &ip); SWhiteUserList* pList = *ppList;
pList->ver += 1;
taosArrayPush(pList->list, &ip);
} }
} }
@ -319,17 +328,19 @@ void uvWhiteListUpdate(SWhiteList* pWhite, SHashObj* pTable) {
// impl later // impl later
} }
bool uvWhiteListFilte(SWhiteList* pWhite, char* user, uint32_t ip) { bool uvWhiteListFilte(SWhiteList* pWhite, char* user, uint32_t ip, int64_t ver) {
// impl check // impl check
SHashObj* pWhiteList = pWhite->pList; SHashObj* pWhiteList = pWhite->pList;
bool valid = false; bool valid = false;
SArray** ppArr = taosHashGet(pWhiteList, user, strlen(user)); SWhiteUserList** ppList = taosHashGet(pWhiteList, user, strlen(user));
if (ppArr == NULL || *ppArr == NULL) { if (ppList == NULL || *ppList == NULL) {
return true; return true;
} }
SWhiteUserList* pList = *ppList;
if (pList->ver == ver) return true;
for (int i = 0; i < taosArrayGetSize(*ppArr); i++) { for (int i = 0; i < taosArrayGetSize(pList->list); i++) {
char* range = taosArrayGetP(*ppArr, i); char* range = taosArrayGetP(pList->list, i);
if (uvCheckIp(range, ip)) { if (uvCheckIp(range, ip)) {
valid = true; valid = true;
break; break;
@ -338,10 +349,9 @@ bool uvWhiteListFilte(SWhiteList* pWhite, char* user, uint32_t ip) {
return valid; return valid;
} }
bool uvWhiteListCheckConn(SWhiteList* pWhite, SSvrConn* pConn) { bool uvWhiteListCheckConn(SWhiteList* pWhite, SSvrConn* pConn) {
if (pWhite->ver == pConn->whiteListVer) { if (pWhite->ver == pConn->whiteListVer) return true;
return true;
} return uvWhiteListFilte(pWhite, pConn->user, pConn->clientIp, pConn->whiteListVer);
return uvWhiteListFilte(pWhite, pConn->user, pConn->clientIp);
} }
void uvWhiteListSetConnVer(SWhiteList* pWhite, SSvrConn* pConn) { void uvWhiteListSetConnVer(SWhiteList* pWhite, SSvrConn* pConn) {
// if conn already check by current whiteLis // if conn already check by current whiteLis