TDengine/source/util/test/trefTest.c

189 lines
4.7 KiB
C
Raw Normal View History

2022-10-13 03:49:46 +00:00
#include "tref.h"
2020-10-25 13:17:23 +00:00
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include "os.h"
#include "taoserror.h"
2022-10-13 03:49:46 +00:00
#include "tglobal.h"
2022-02-27 03:05:46 +00:00
#include "tlog.h"
2020-10-25 13:17:23 +00:00
typedef struct {
2022-10-13 03:49:46 +00:00
int refNum;
int steps;
int rsetId;
int64_t *rid;
void **p;
2020-10-25 13:17:23 +00:00
} SRefSpace;
2020-11-05 07:28:20 +00:00
void iterateRefs(int rsetId) {
2022-10-13 03:49:46 +00:00
int count = 0;
2020-10-29 14:20:57 +00:00
void *p = taosIterateRef(rsetId, 0);
2020-10-29 14:20:57 +00:00
while (p) {
// process P
count++;
2022-10-13 03:49:46 +00:00
p = taosIterateRef(rsetId, (int64_t)p);
}
2020-10-29 14:20:57 +00:00
2022-10-13 03:49:46 +00:00
printf(" %d ", count);
2020-10-29 14:20:57 +00:00
}
2020-11-05 07:28:20 +00:00
void *addRef(void *param) {
2020-10-25 13:17:23 +00:00
SRefSpace *pSpace = (SRefSpace *)param;
2022-10-13 03:49:46 +00:00
int id;
2020-10-25 13:17:23 +00:00
2022-10-13 03:49:46 +00:00
for (int i = 0; i < pSpace->steps; ++i) {
2020-11-05 07:28:20 +00:00
printf("a");
2022-10-13 03:49:46 +00:00
id = taosRand() % pSpace->refNum;
2020-11-05 07:28:20 +00:00
if (pSpace->rid[id] <= 0) {
2022-03-25 16:29:53 +00:00
pSpace->p[id] = taosMemoryMalloc(128);
2020-11-05 07:28:20 +00:00
pSpace->rid[id] = taosAddRef(pSpace->rsetId, pSpace->p[id]);
2020-10-25 13:17:23 +00:00
}
2022-03-10 03:56:11 +00:00
taosUsleep(100);
2022-10-13 03:49:46 +00:00
}
2020-10-25 13:17:23 +00:00
2020-11-05 07:28:20 +00:00
return NULL;
}
2022-10-13 03:49:46 +00:00
2020-11-05 07:28:20 +00:00
void *removeRef(void *param) {
SRefSpace *pSpace = (SRefSpace *)param;
2022-10-13 03:49:46 +00:00
int id, code;
2020-11-05 07:28:20 +00:00
2022-10-13 03:49:46 +00:00
for (int i = 0; i < pSpace->steps; ++i) {
2020-11-05 07:28:20 +00:00
printf("d");
2022-10-13 03:49:46 +00:00
id = taosRand() % pSpace->refNum;
2020-11-05 07:28:20 +00:00
if (pSpace->rid[id] > 0) {
code = taosRemoveRef(pSpace->rsetId, pSpace->rid[id]);
if (code == 0) pSpace->rid[id] = 0;
}
2020-10-25 13:17:23 +00:00
2022-03-10 03:56:11 +00:00
taosUsleep(100);
2022-10-13 03:49:46 +00:00
}
2020-11-05 07:28:20 +00:00
return NULL;
}
2022-10-13 03:49:46 +00:00
2020-11-05 07:28:20 +00:00
void *acquireRelease(void *param) {
SRefSpace *pSpace = (SRefSpace *)param;
2022-10-13 03:49:46 +00:00
int id;
2020-11-05 07:28:20 +00:00
2022-10-13 03:49:46 +00:00
for (int i = 0; i < pSpace->steps; ++i) {
2020-11-05 07:28:20 +00:00
printf("a");
2022-10-13 03:49:46 +00:00
id = taosRand() % pSpace->refNum;
void *p = taosAcquireRef(pSpace->rsetId, (int64_t)pSpace->p[id]);
if (p) {
2022-03-10 03:56:11 +00:00
taosUsleep(id % 5 + 1);
2022-10-13 03:49:46 +00:00
taosReleaseRef(pSpace->rsetId, (int64_t)pSpace->p[id]);
2020-10-25 13:17:23 +00:00
}
2022-10-13 03:49:46 +00:00
}
2020-10-25 13:17:23 +00:00
return NULL;
}
2022-10-13 03:49:46 +00:00
void myfree(void *p) { taosMemoryFree(p); }
2020-10-25 13:17:23 +00:00
void *openRefSpace(void *param) {
SRefSpace *pSpace = (SRefSpace *)param;
printf("c");
2020-11-05 07:28:20 +00:00
pSpace->rsetId = taosOpenRef(50, myfree);
2020-10-25 13:17:23 +00:00
2020-11-05 07:28:20 +00:00
if (pSpace->rsetId < 0) {
printf("failed to open ref, reason:%s\n", tstrerror(pSpace->rsetId));
2020-10-25 13:17:23 +00:00
return NULL;
2022-10-13 03:49:46 +00:00
}
2020-10-25 13:17:23 +00:00
2022-10-13 03:49:46 +00:00
pSpace->p = (void **)taosMemoryCalloc(sizeof(void *), pSpace->refNum);
2022-03-25 16:29:53 +00:00
pSpace->rid = taosMemoryCalloc(pSpace->refNum, sizeof(int64_t));
2020-10-25 13:17:23 +00:00
2022-03-19 16:45:00 +00:00
TdThreadAttr thattr;
taosThreadAttrInit(&thattr);
taosThreadAttrSetDetachState(&thattr, PTHREAD_CREATE_JOINABLE);
2020-10-25 13:17:23 +00:00
2022-03-19 16:45:00 +00:00
TdThread thread1, thread2, thread3;
taosThreadCreate(&(thread1), &thattr, addRef, (void *)(pSpace));
taosThreadCreate(&(thread2), &thattr, removeRef, (void *)(pSpace));
taosThreadCreate(&(thread3), &thattr, acquireRelease, (void *)(pSpace));
2020-10-25 13:17:23 +00:00
2022-03-19 16:45:00 +00:00
taosThreadJoin(thread1, NULL);
taosThreadJoin(thread2, NULL);
taosThreadJoin(thread3, NULL);
2020-10-25 13:17:23 +00:00
2022-10-13 03:49:46 +00:00
for (int i = 0; i < pSpace->refNum; ++i) {
2020-11-05 07:28:20 +00:00
taosRemoveRef(pSpace->rsetId, pSpace->rid[i]);
2020-10-25 13:17:23 +00:00
}
2020-11-05 07:28:20 +00:00
taosCloseRef(pSpace->rsetId);
uInfo("rsetId:%d main thread exit", pSpace->rsetId);
2022-03-25 16:29:53 +00:00
taosMemoryFree(pSpace->p);
2020-10-25 13:17:23 +00:00
pSpace->p = NULL;
return NULL;
}
int main(int argc, char *argv[]) {
int refNum = 100;
int threads = 10;
2022-10-13 03:49:46 +00:00
int steps = 10000;
2020-10-25 13:17:23 +00:00
int loops = 1;
uDebugFlag = 143;
2022-10-13 03:49:46 +00:00
for (int i = 1; i < argc; ++i) {
if (strcmp(argv[i], "-n") == 0 && i < argc - 1) {
2020-10-25 13:17:23 +00:00
refNum = atoi(argv[++i]);
2022-10-13 03:49:46 +00:00
} else if (strcmp(argv[i], "-s") == 0 && i < argc - 1) {
2020-10-25 13:17:23 +00:00
steps = atoi(argv[++i]);
2022-10-13 03:49:46 +00:00
} else if (strcmp(argv[i], "-t") == 0 && i < argc - 1) {
2020-10-25 13:17:23 +00:00
threads = atoi(argv[++i]);
2022-10-13 03:49:46 +00:00
} else if (strcmp(argv[i], "-l") == 0 && i < argc - 1) {
2020-10-25 13:17:23 +00:00
loops = atoi(argv[++i]);
2022-10-13 03:49:46 +00:00
} else if (strcmp(argv[i], "-d") == 0 && i < argc - 1) {
2020-10-25 13:17:23 +00:00
uDebugFlag = atoi(argv[i]);
} else {
printf("\nusage: %s [options] \n", argv[0]);
printf(" [-n]: number of references, default: %d\n", refNum);
printf(" [-s]: steps to run for each reference, default: %d\n", steps);
2020-11-05 07:28:20 +00:00
printf(" [-t]: number of rsetIds running in parallel, default: %d\n", threads);
2020-10-25 13:17:23 +00:00
printf(" [-l]: number of loops, default: %d\n", loops);
printf(" [-d]: debugFlag, default: %d\n", uDebugFlag);
exit(0);
}
}
2022-02-23 02:35:53 +00:00
taosInitLog("tref.log", 10);
2020-10-25 13:17:23 +00:00
2022-10-13 03:49:46 +00:00
SRefSpace *pSpaceList = (SRefSpace *)taosMemoryCalloc(sizeof(SRefSpace), threads);
TdThread *pThreadList = (TdThread *)taosMemoryCalloc(sizeof(TdThread), threads);
2020-10-25 13:17:23 +00:00
2022-03-19 16:45:00 +00:00
TdThreadAttr thattr;
taosThreadAttrInit(&thattr);
taosThreadAttrSetDetachState(&thattr, PTHREAD_CREATE_JOINABLE);
2020-10-25 13:17:23 +00:00
2022-10-13 03:49:46 +00:00
for (int i = 0; i < loops; ++i) {
2020-10-25 13:17:23 +00:00
printf("\nloop: %d\n", i);
2022-10-13 03:49:46 +00:00
for (int j = 0; j < threads; ++j) {
2020-10-25 13:17:23 +00:00
pSpaceList[j].steps = steps;
pSpaceList[j].refNum = refNum;
2022-10-13 03:49:46 +00:00
taosThreadCreate(&(pThreadList[j]), &thattr, openRefSpace, (void *)(pSpaceList + j));
2020-10-25 13:17:23 +00:00
}
2022-10-13 03:49:46 +00:00
for (int j = 0; j < threads; ++j) {
2022-03-19 16:45:00 +00:00
taosThreadJoin(pThreadList[j], NULL);
2020-10-25 13:17:23 +00:00
}
}
int num = taosListRef();
printf("\nnumber of references:%d\n", num);
2022-03-25 16:29:53 +00:00
taosMemoryFree(pSpaceList);
taosMemoryFree(pThreadList);
2020-10-25 13:17:23 +00:00
taosCloseLog();
return num;
}