Merge pull request #23794 from taosdata/fix/addHttpTest
Fix/add http test
This commit is contained in:
commit
7bfc64b8db
|
@ -28,10 +28,12 @@
|
||||||
|
|
||||||
static int32_t httpRefMgt = 0;
|
static int32_t httpRefMgt = 0;
|
||||||
static int64_t httpRef = -1;
|
static int64_t httpRef = -1;
|
||||||
|
static int32_t FAST_FAILURE_LIMIT = 120;
|
||||||
typedef struct SHttpModule {
|
typedef struct SHttpModule {
|
||||||
uv_loop_t* loop;
|
uv_loop_t* loop;
|
||||||
SAsyncPool* asyncPool;
|
SAsyncPool* asyncPool;
|
||||||
TdThread thread;
|
TdThread thread;
|
||||||
|
SHashObj* connStatusTable;
|
||||||
} SHttpModule;
|
} SHttpModule;
|
||||||
|
|
||||||
typedef struct SHttpMsg {
|
typedef struct SHttpMsg {
|
||||||
|
@ -64,6 +66,8 @@ static void httpHandleReq(SHttpMsg* msg);
|
||||||
static void httpHandleQuit(SHttpMsg* msg);
|
static void httpHandleQuit(SHttpMsg* msg);
|
||||||
static int32_t httpSendQuit();
|
static int32_t httpSendQuit();
|
||||||
|
|
||||||
|
static bool httpFailFastShoudIgnoreMsg(SHashObj* pTable, char* server, int16_t port);
|
||||||
|
static void httpFailFastMayUpdate(SHashObj* pTable, char* server, int16_t port, int8_t succ);
|
||||||
static int32_t taosSendHttpReportImpl(const char* server, const char* uri, uint16_t port, char* pCont, int32_t contLen,
|
static int32_t taosSendHttpReportImpl(const char* server, const char* uri, uint16_t port, char* pCont, int32_t contLen,
|
||||||
EHttpCompFlag flag);
|
EHttpCompFlag flag);
|
||||||
|
|
||||||
|
@ -193,11 +197,20 @@ static void httpAsyncCb(uv_async_t* handle) {
|
||||||
SHttpMsg *msg = NULL, *quitMsg = NULL;
|
SHttpMsg *msg = NULL, *quitMsg = NULL;
|
||||||
|
|
||||||
queue wq;
|
queue wq;
|
||||||
|
QUEUE_INIT(&wq);
|
||||||
|
|
||||||
|
static int32_t BATCH_SIZE = 5;
|
||||||
|
int32_t count = 0;
|
||||||
|
|
||||||
taosThreadMutexLock(&item->mtx);
|
taosThreadMutexLock(&item->mtx);
|
||||||
QUEUE_MOVE(&item->qmsg, &wq);
|
|
||||||
|
while (!QUEUE_IS_EMPTY(&item->qmsg) && count++ < BATCH_SIZE) {
|
||||||
|
queue* h = QUEUE_HEAD(&item->qmsg);
|
||||||
|
QUEUE_REMOVE(h);
|
||||||
|
QUEUE_PUSH(&wq, h);
|
||||||
|
}
|
||||||
taosThreadMutexUnlock(&item->mtx);
|
taosThreadMutexUnlock(&item->mtx);
|
||||||
|
|
||||||
int count = 0;
|
|
||||||
while (!QUEUE_IS_EMPTY(&wq)) {
|
while (!QUEUE_IS_EMPTY(&wq)) {
|
||||||
queue* h = QUEUE_HEAD(&wq);
|
queue* h = QUEUE_HEAD(&wq);
|
||||||
QUEUE_REMOVE(h);
|
QUEUE_REMOVE(h);
|
||||||
|
@ -262,14 +275,20 @@ static void clientSentCb(uv_write_t* req, int32_t status) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
static void clientConnCb(uv_connect_t* req, int32_t status) {
|
static void clientConnCb(uv_connect_t* req, int32_t status) {
|
||||||
|
SHttpModule* http = taosAcquireRef(httpRefMgt, httpRef);
|
||||||
SHttpClient* cli = req->data;
|
SHttpClient* cli = req->data;
|
||||||
if (status != 0) {
|
if (status != 0) {
|
||||||
|
httpFailFastMayUpdate(http->connStatusTable, cli->addr, cli->port, 0);
|
||||||
|
|
||||||
tError("http-report failed to conn to server, reason:%s, dst:%s:%d", uv_strerror(status), cli->addr, cli->port);
|
tError("http-report failed to conn to server, reason:%s, dst:%s:%d", uv_strerror(status), cli->addr, cli->port);
|
||||||
if (!uv_is_closing((uv_handle_t*)&cli->tcp)) {
|
if (!uv_is_closing((uv_handle_t*)&cli->tcp)) {
|
||||||
uv_close((uv_handle_t*)&cli->tcp, clientCloseCb);
|
uv_close((uv_handle_t*)&cli->tcp, clientCloseCb);
|
||||||
}
|
}
|
||||||
|
taosReleaseRef(httpRefMgt, httpRef);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
httpFailFastMayUpdate(http->connStatusTable, cli->addr, cli->port, 1);
|
||||||
|
|
||||||
status = uv_write(&cli->req, (uv_stream_t*)&cli->tcp, cli->wbuf, 2, clientSentCb);
|
status = uv_write(&cli->req, (uv_stream_t*)&cli->tcp, cli->wbuf, 2, clientSentCb);
|
||||||
if (0 != status) {
|
if (0 != status) {
|
||||||
tError("http-report failed to send data,reason:%s, dst:%s:%d", uv_strerror(status), cli->addr, cli->port);
|
tError("http-report failed to send data,reason:%s, dst:%s:%d", uv_strerror(status), cli->addr, cli->port);
|
||||||
|
@ -277,6 +296,7 @@ static void clientConnCb(uv_connect_t* req, int32_t status) {
|
||||||
uv_close((uv_handle_t*)&cli->tcp, clientCloseCb);
|
uv_close((uv_handle_t*)&cli->tcp, clientCloseCb);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
taosReleaseRef(httpRefMgt, httpRef);
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t httpSendQuit() {
|
int32_t httpSendQuit() {
|
||||||
|
@ -349,16 +369,51 @@ static void httpHandleQuit(SHttpMsg* msg) {
|
||||||
uv_walk(http->loop, httpWalkCb, NULL);
|
uv_walk(http->loop, httpWalkCb, NULL);
|
||||||
taosReleaseRef(httpRefMgt, httpRef);
|
taosReleaseRef(httpRefMgt, httpRef);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool httpFailFastShoudIgnoreMsg(SHashObj* pTable, char* server, int16_t port) {
|
||||||
|
char buf[256] = {0};
|
||||||
|
sprintf(buf, "%s:%d", server, port);
|
||||||
|
|
||||||
|
int32_t* failedTime = (int32_t*)taosHashGet(pTable, buf, strlen(buf));
|
||||||
|
if (failedTime == NULL) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t now = taosGetTimestampSec();
|
||||||
|
if (*failedTime > now - FAST_FAILURE_LIMIT) {
|
||||||
|
tDebug("http-report succ to ignore msg,reason:connection timed out, dst:%s", buf);
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
static void httpFailFastMayUpdate(SHashObj* pTable, char* server, int16_t port, int8_t succ) {
|
||||||
|
char buf[256] = {0};
|
||||||
|
sprintf(buf, "%s:%d", server, port);
|
||||||
|
|
||||||
|
if (succ) {
|
||||||
|
taosHashRemove(pTable, buf, strlen(buf));
|
||||||
|
} else {
|
||||||
|
int32_t st = taosGetTimestampSec();
|
||||||
|
taosHashPut(pTable, buf, strlen(buf), &st, sizeof(st));
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
static void httpHandleReq(SHttpMsg* msg) {
|
static void httpHandleReq(SHttpMsg* msg) {
|
||||||
|
int32_t ignore = false;
|
||||||
SHttpModule* http = taosAcquireRef(httpRefMgt, httpRef);
|
SHttpModule* http = taosAcquireRef(httpRefMgt, httpRef);
|
||||||
if (http == NULL) {
|
if (http == NULL) {
|
||||||
goto END;
|
goto END;
|
||||||
}
|
}
|
||||||
|
if (httpFailFastShoudIgnoreMsg(http->connStatusTable, msg->server, msg->port)) {
|
||||||
|
ignore = true;
|
||||||
|
goto END;
|
||||||
|
}
|
||||||
struct sockaddr_in dest = {0};
|
struct sockaddr_in dest = {0};
|
||||||
if (taosBuildDstAddr(msg->server, msg->port, &dest) < 0) {
|
if (taosBuildDstAddr(msg->server, msg->port, &dest) < 0) {
|
||||||
goto END;
|
goto END;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (msg->flag == HTTP_GZIP) {
|
if (msg->flag == HTTP_GZIP) {
|
||||||
int32_t dstLen = taosCompressHttpRport(msg->cont, msg->len);
|
int32_t dstLen = taosCompressHttpRport(msg->cont, msg->len);
|
||||||
if (dstLen > 0) {
|
if (dstLen > 0) {
|
||||||
|
@ -399,11 +454,11 @@ static void httpHandleReq(SHttpMsg* msg) {
|
||||||
uv_tcp_init(http->loop, &cli->tcp);
|
uv_tcp_init(http->loop, &cli->tcp);
|
||||||
|
|
||||||
// set up timeout to avoid stuck;
|
// set up timeout to avoid stuck;
|
||||||
int32_t fd = taosCreateSocketWithTimeout(5);
|
int32_t fd = taosCreateSocketWithTimeout(5000);
|
||||||
if (fd < 0) {
|
if (fd < 0) {
|
||||||
tError("http-report failed to open socket, dst:%s:%d", cli->addr, cli->port);
|
tError("http-report failed to open socket, dst:%s:%d", cli->addr, cli->port);
|
||||||
taosReleaseRef(httpRefMgt, httpRef);
|
|
||||||
destroyHttpClient(cli);
|
destroyHttpClient(cli);
|
||||||
|
taosReleaseRef(httpRefMgt, httpRef);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
int ret = uv_tcp_open((uv_tcp_t*)&cli->tcp, fd);
|
int ret = uv_tcp_open((uv_tcp_t*)&cli->tcp, fd);
|
||||||
|
@ -418,13 +473,16 @@ static void httpHandleReq(SHttpMsg* msg) {
|
||||||
if (ret != 0) {
|
if (ret != 0) {
|
||||||
tError("http-report failed to connect to http-server, reason:%s, dst:%s:%d", uv_strerror(ret), cli->addr,
|
tError("http-report failed to connect to http-server, reason:%s, dst:%s:%d", uv_strerror(ret), cli->addr,
|
||||||
cli->port);
|
cli->port);
|
||||||
|
httpFailFastMayUpdate(http->connStatusTable, cli->addr, cli->port, 0);
|
||||||
destroyHttpClient(cli);
|
destroyHttpClient(cli);
|
||||||
}
|
}
|
||||||
taosReleaseRef(httpRefMgt, httpRef);
|
taosReleaseRef(httpRefMgt, httpRef);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
END:
|
END:
|
||||||
tError("http-report failed to report, reason: %s, addr: %s:%d", terrstr(), msg->server, msg->port);
|
if (ignore == false) {
|
||||||
|
tError("http-report failed to report, reason: %s, addr: %s:%d", terrstr(), msg->server, msg->port);
|
||||||
|
}
|
||||||
httpDestroyMsg(msg);
|
httpDestroyMsg(msg);
|
||||||
taosReleaseRef(httpRefMgt, httpRef);
|
taosReleaseRef(httpRefMgt, httpRef);
|
||||||
}
|
}
|
||||||
|
@ -441,6 +499,8 @@ static void transHttpEnvInit() {
|
||||||
|
|
||||||
SHttpModule* http = taosMemoryMalloc(sizeof(SHttpModule));
|
SHttpModule* http = taosMemoryMalloc(sizeof(SHttpModule));
|
||||||
http->loop = taosMemoryMalloc(sizeof(uv_loop_t));
|
http->loop = taosMemoryMalloc(sizeof(uv_loop_t));
|
||||||
|
http->connStatusTable = taosHashInit(4, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_ENTRY_LOCK);
|
||||||
|
|
||||||
uv_loop_init(http->loop);
|
uv_loop_init(http->loop);
|
||||||
|
|
||||||
http->asyncPool = transAsyncPoolCreate(http->loop, 1, http, httpAsyncCb);
|
http->asyncPool = transAsyncPoolCreate(http->loop, 1, http, httpAsyncCb);
|
||||||
|
@ -474,6 +534,8 @@ void transHttpEnvDestroy() {
|
||||||
uv_loop_close(load->loop);
|
uv_loop_close(load->loop);
|
||||||
taosMemoryFree(load->loop);
|
taosMemoryFree(load->loop);
|
||||||
|
|
||||||
|
taosHashCleanup(load->connStatusTable);
|
||||||
|
|
||||||
taosReleaseRef(httpRefMgt, httpRef);
|
taosReleaseRef(httpRefMgt, httpRef);
|
||||||
taosRemoveRef(httpRefMgt, httpRef);
|
taosRemoveRef(httpRefMgt, httpRef);
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,6 +2,7 @@ add_executable(transportTest "")
|
||||||
add_executable(transUT "")
|
add_executable(transUT "")
|
||||||
add_executable(svrBench "")
|
add_executable(svrBench "")
|
||||||
add_executable(cliBench "")
|
add_executable(cliBench "")
|
||||||
|
add_executable(httpBench "")
|
||||||
|
|
||||||
target_sources(transUT
|
target_sources(transUT
|
||||||
PRIVATE
|
PRIVATE
|
||||||
|
@ -21,6 +22,10 @@ target_sources(cliBench
|
||||||
PRIVATE
|
PRIVATE
|
||||||
"cliBench.c"
|
"cliBench.c"
|
||||||
)
|
)
|
||||||
|
target_sources(httpBench
|
||||||
|
PRIVATE
|
||||||
|
"http_test.c"
|
||||||
|
)
|
||||||
|
|
||||||
target_include_directories(transportTest
|
target_include_directories(transportTest
|
||||||
PUBLIC
|
PUBLIC
|
||||||
|
@ -51,11 +56,6 @@ target_include_directories(transUT
|
||||||
"${CMAKE_CURRENT_SOURCE_DIR}/../inc"
|
"${CMAKE_CURRENT_SOURCE_DIR}/../inc"
|
||||||
)
|
)
|
||||||
|
|
||||||
target_include_directories(svrBench
|
|
||||||
PUBLIC
|
|
||||||
"${TD_SOURCE_DIR}/include/libs/transport"
|
|
||||||
"${CMAKE_CURRENT_SOURCE_DIR}/../inc"
|
|
||||||
)
|
|
||||||
target_include_directories(svrBench
|
target_include_directories(svrBench
|
||||||
PUBLIC
|
PUBLIC
|
||||||
"${TD_SOURCE_DIR}/include/libs/transport"
|
"${TD_SOURCE_DIR}/include/libs/transport"
|
||||||
|
@ -75,7 +75,8 @@ target_include_directories(cliBench
|
||||||
"${TD_SOURCE_DIR}/include/libs/transport"
|
"${TD_SOURCE_DIR}/include/libs/transport"
|
||||||
"${CMAKE_CURRENT_SOURCE_DIR}/../inc"
|
"${CMAKE_CURRENT_SOURCE_DIR}/../inc"
|
||||||
)
|
)
|
||||||
target_include_directories(cliBench
|
|
||||||
|
target_include_directories(httpBench
|
||||||
PUBLIC
|
PUBLIC
|
||||||
"${TD_SOURCE_DIR}/include/libs/transport"
|
"${TD_SOURCE_DIR}/include/libs/transport"
|
||||||
"${CMAKE_CURRENT_SOURCE_DIR}/../inc"
|
"${CMAKE_CURRENT_SOURCE_DIR}/../inc"
|
||||||
|
@ -89,6 +90,14 @@ target_link_libraries (cliBench
|
||||||
transport
|
transport
|
||||||
)
|
)
|
||||||
|
|
||||||
|
target_link_libraries(httpBench
|
||||||
|
os
|
||||||
|
util
|
||||||
|
common
|
||||||
|
gtest_main
|
||||||
|
transport
|
||||||
|
)
|
||||||
|
|
||||||
add_test(
|
add_test(
|
||||||
NAME transUT
|
NAME transUT
|
||||||
COMMAND transUT
|
COMMAND transUT
|
||||||
|
|
|
@ -0,0 +1,70 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can use, redistribute, and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License, version 3
|
||||||
|
* or later ("AGPL"), as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
#include "os.h"
|
||||||
|
#include "taoserror.h"
|
||||||
|
#include "tglobal.h"
|
||||||
|
#include "thttp.h"
|
||||||
|
#include "transLog.h"
|
||||||
|
#include "trpc.h"
|
||||||
|
#include "tutil.h"
|
||||||
|
#include "tversion.h"
|
||||||
|
|
||||||
|
void initLogEnv() {
|
||||||
|
const char * logDir = "/tmp/trans_cli";
|
||||||
|
const char * defaultLogFileNamePrefix = "taoslog";
|
||||||
|
const int32_t maxLogFileNum = 1000000;
|
||||||
|
tsAsyncLog = 0;
|
||||||
|
// rpcDebugflag = 143;
|
||||||
|
strcpy(tsLogDir, (char *)logDir);
|
||||||
|
taosRemoveDir(tsLogDir);
|
||||||
|
taosMkDir(tsLogDir);
|
||||||
|
|
||||||
|
if (taosInitLog(defaultLogFileNamePrefix, maxLogFileNum) < 0) {
|
||||||
|
printf("failed to open log file in directory:%s\n", tsLogDir);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
typedef struct TThread {
|
||||||
|
TdThread thread;
|
||||||
|
int idx;
|
||||||
|
} TThread;
|
||||||
|
|
||||||
|
void *proces(void *arg) {
|
||||||
|
char *monitor = "172.26.10.94";
|
||||||
|
while (1) {
|
||||||
|
int32_t len = 512;
|
||||||
|
char * msg = taosMemoryCalloc(1, len);
|
||||||
|
memset(msg, 1, len);
|
||||||
|
int32_t code = taosSendHttpReport(monitor, "/crash", 6050, msg, 10, HTTP_FLAT);
|
||||||
|
taosMemoryFree(msg);
|
||||||
|
taosUsleep(10);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int main(int argc, char *argv[]) {
|
||||||
|
initLogEnv();
|
||||||
|
int32_t numOfThreads = 10;
|
||||||
|
TThread *thread = taosMemoryCalloc(1, sizeof(TThread) * numOfThreads);
|
||||||
|
|
||||||
|
for (int i = 0; i < numOfThreads; i++) {
|
||||||
|
thread[i].idx = i;
|
||||||
|
taosThreadCreate(&(thread[i].thread), NULL, proces, (void *)&thread[i]);
|
||||||
|
}
|
||||||
|
while (1) {
|
||||||
|
taosMsleep(5000);
|
||||||
|
}
|
||||||
|
|
||||||
|
taosCloseLog();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
Loading…
Reference in New Issue