📄 tctmttest.c
字号:
} else { usage(); } } if(!path || !tstr || !rstr) usage(); int tnum = tcatoix(tstr); int rnum = tcatoix(rstr); if(tnum < 1 || rnum < 1) usage(); int bnum = bstr ? tcatoix(bstr) : -1; int apow = astr ? tcatoix(astr) : -1; int fpow = fstr ? tcatoix(fstr) : -1; int rv = proctypical(path, tnum, rnum, bnum, apow, fpow, opts, rcnum, lcnum, ncnum, xmsiz, omode, rratio); return rv;}/* perform write command */static int procwrite(const char *path, int tnum, int rnum, int bnum, int apow, int fpow, int opts, int rcnum, int lcnum, int ncnum, int xmsiz, int iflags, int omode, bool rnd){ iprintf("<Writing Test>\n seed=%u path=%s tnum=%d rnum=%d bnum=%d apow=%d fpow=%d" " opts=%d rcnum=%d lcnum=%d ncnum=%d xmsiz=%d iflags=%d omode=%d rnd=%d\n\n", g_randseed, path, tnum, rnum, bnum, apow, fpow, opts, rcnum, lcnum, ncnum, xmsiz, iflags, omode, rnd); bool err = false; double stime = tctime(); TCTDB *tdb = tctdbnew(); if(g_dbgfd >= 0) tctdbsetdbgfd(tdb, g_dbgfd); if(!tctdbsetmutex(tdb)){ eprint(tdb, "tctdbsetmutex"); err = true; } if(!tctdbsetcodecfunc(tdb, _tc_recencode, NULL, _tc_recdecode, NULL)){ eprint(tdb, "tctdbsetcodecfunc"); err = true; } if(!tctdbtune(tdb, bnum, apow, fpow, opts)){ eprint(tdb, "tctdbtune"); err = true; } if(!tctdbsetcache(tdb, rcnum, lcnum, ncnum)){ eprint(tdb, "tctdbsetcache"); err = true; } if(xmsiz >= 0 && !tctdbsetxmsiz(tdb, xmsiz)){ eprint(tdb, "tctdbsetxmsiz"); err = true; } if(!tctdbopen(tdb, path, TDBOWRITER | TDBOCREAT | TDBOTRUNC | omode)){ eprint(tdb, "tctdbopen"); err = true; } if((iflags & (1 << 0)) && !tctdbsetindex(tdb, "", TDBITDECIMAL)){ eprint(tdb, "tctdbsetindex"); err = true; } if((iflags & (1 << 1)) && !tctdbsetindex(tdb, "str", TDBITLEXICAL)){ eprint(tdb, "tctdbsetindex"); err = true; } if((iflags & (1 << 2)) && !tctdbsetindex(tdb, "num", TDBITDECIMAL)){ eprint(tdb, "tctdbsetindex"); err = true; } if((iflags & (1 << 3)) && !tctdbsetindex(tdb, "type", TDBITDECIMAL)){ eprint(tdb, "tctdbsetindex"); err = true; } if((iflags & (1 << 4)) && !tctdbsetindex(tdb, "flag", TDBITLEXICAL)){ eprint(tdb, "tctdbsetindex"); err = true; } TARGWRITE targs[tnum]; pthread_t threads[tnum]; if(tnum == 1){ targs[0].tdb = tdb; targs[0].rnum = rnum; targs[0].rnd = rnd; targs[0].id = 0; if(threadwrite(targs) != NULL) err = true; } else { for(int i = 0; i < tnum; i++){ targs[i].tdb = tdb; targs[i].rnum = rnum; targs[i].rnd = rnd; targs[i].id = i; if(pthread_create(threads + i, NULL, threadwrite, targs + i) != 0){ eprint(tdb, "pthread_create"); targs[i].id = -1; err = true; } } for(int i = 0; i < tnum; i++){ if(targs[i].id == -1) continue; void *rv; if(pthread_join(threads[i], &rv) != 0){ eprint(tdb, "pthread_join"); err = true; } else if(rv){ err = true; } } } iprintf("record number: %llu\n", (unsigned long long)tctdbrnum(tdb)); iprintf("size: %llu\n", (unsigned long long)tctdbfsiz(tdb)); sysprint(); if(!tctdbclose(tdb)){ eprint(tdb, "tctdbclose"); err = true; } tctdbdel(tdb); iprintf("time: %.3f\n", tctime() - stime); iprintf("%s\n\n", err ? "error" : "ok"); return err ? 1 : 0;}/* perform read command */static int procread(const char *path, int tnum, int rcnum, int lcnum, int ncnum, int xmsiz, int omode, bool rnd){ iprintf("<Reading Test>\n seed=%u path=%s tnum=%d rcnum=%d lcnum=%d ncnum=%d xmsiz=%d" " omode=%d rnd=%d\n\n", g_randseed, path, tnum, rcnum, lcnum, ncnum, xmsiz, omode, rnd); bool err = false; double stime = tctime(); TCTDB *tdb = tctdbnew(); if(g_dbgfd >= 0) tctdbsetdbgfd(tdb, g_dbgfd); if(!tctdbsetmutex(tdb)){ eprint(tdb, "tctdbsetmutex"); err = true; } if(!tctdbsetcodecfunc(tdb, _tc_recencode, NULL, _tc_recdecode, NULL)){ eprint(tdb, "tctdbsetcodecfunc"); err = true; } if(!tctdbsetcache(tdb, rcnum, lcnum, ncnum)){ eprint(tdb, "tctdbsetcache"); err = true; } if(xmsiz >= 0 && !tctdbsetxmsiz(tdb, xmsiz)){ eprint(tdb, "tctdbsetxmsiz"); err = true; } if(!tctdbopen(tdb, path, TDBOREADER | omode)){ eprint(tdb, "tctdbopen"); err = true; } int rnum = tctdbrnum(tdb) / tnum; TARGREAD targs[tnum]; pthread_t threads[tnum]; if(tnum == 1){ targs[0].tdb = tdb; targs[0].rnum = rnum; targs[0].rnd = rnd; targs[0].id = 0; if(threadread(targs) != NULL) err = true; } else { for(int i = 0; i < tnum; i++){ targs[i].tdb = tdb; targs[i].rnum = rnum; targs[i].rnd = rnd; targs[i].id = i; if(pthread_create(threads + i, NULL, threadread, targs + i) != 0){ eprint(tdb, "pthread_create"); targs[i].id = -1; err = true; } } for(int i = 0; i < tnum; i++){ if(targs[i].id == -1) continue; void *rv; if(pthread_join(threads[i], &rv) != 0){ eprint(tdb, "pthread_join"); err = true; } else if(rv){ err = true; } } } iprintf("record number: %llu\n", (unsigned long long)tctdbrnum(tdb)); iprintf("size: %llu\n", (unsigned long long)tctdbfsiz(tdb)); sysprint(); if(!tctdbclose(tdb)){ eprint(tdb, "tctdbclose"); err = true; } tctdbdel(tdb); iprintf("time: %.3f\n", tctime() - stime); iprintf("%s\n\n", err ? "error" : "ok"); return err ? 1 : 0;}/* perform remove command */static int procremove(const char *path, int tnum, int rcnum, int lcnum, int ncnum, int xmsiz, int omode, bool rnd){ iprintf("<Removing Test>\n seed=%u path=%s tnum=%d rcnum=%d lcnum=%d ncnum=%d xmsiz=%d" " omode=%d rnd=%d\n\n", g_randseed, path, tnum, rcnum, lcnum, ncnum, xmsiz, omode, rnd); bool err = false; double stime = tctime(); TCTDB *tdb = tctdbnew(); if(g_dbgfd >= 0) tctdbsetdbgfd(tdb, g_dbgfd); if(!tctdbsetmutex(tdb)){ eprint(tdb, "tctdbsetmutex"); err = true; } if(!tctdbsetcodecfunc(tdb, _tc_recencode, NULL, _tc_recdecode, NULL)){ eprint(tdb, "tctdbsetcodecfunc"); err = true; } if(!tctdbsetcache(tdb, rcnum, lcnum, ncnum)){ eprint(tdb, "tctdbsetcache"); err = true; } if(xmsiz >= 0 && !tctdbsetxmsiz(tdb, xmsiz)){ eprint(tdb, "tctdbsetxmsiz"); err = true; } if(!tctdbopen(tdb, path, TDBOWRITER | omode)){ eprint(tdb, "tctdbopen"); err = true; } int rnum = tctdbrnum(tdb) / tnum; TARGREMOVE targs[tnum]; pthread_t threads[tnum]; if(tnum == 1){ targs[0].tdb = tdb; targs[0].rnum = rnum; targs[0].rnd = rnd; targs[0].id = 0; if(threadremove(targs) != NULL) err = true; } else { for(int i = 0; i < tnum; i++){ targs[i].tdb = tdb; targs[i].rnum = rnum; targs[i].rnd = rnd; targs[i].id = i; if(pthread_create(threads + i, NULL, threadremove, targs + i) != 0){ eprint(tdb, "pthread_create"); targs[i].id = -1; err = true; } } for(int i = 0; i < tnum; i++){ if(targs[i].id == -1) continue; void *rv; if(pthread_join(threads[i], &rv) != 0){ eprint(tdb, "pthread_join"); err = true; } else if(rv){ err = true; } } } iprintf("record number: %llu\n", (unsigned long long)tctdbrnum(tdb)); iprintf("size: %llu\n", (unsigned long long)tctdbfsiz(tdb)); sysprint(); if(!tctdbclose(tdb)){ eprint(tdb, "tctdbclose"); err = true; } tctdbdel(tdb); iprintf("time: %.3f\n", tctime() - stime); iprintf("%s\n\n", err ? "error" : "ok"); return err ? 1 : 0;}/* perform wicked command */static int procwicked(const char *path, int tnum, int rnum, int opts, int omode){ iprintf("<Writing Test>\n seed=%u path=%s tnum=%d rnum=%d opts=%d omode=%d\n\n", g_randseed, path, tnum, rnum, opts, omode); bool err = false; double stime = tctime(); TCTDB *tdb = tctdbnew(); if(g_dbgfd >= 0) tctdbsetdbgfd(tdb, g_dbgfd); if(!tctdbsetmutex(tdb)){ eprint(tdb, "tctdbsetmutex"); err = true; } if(!tctdbsetcodecfunc(tdb, _tc_recencode, NULL, _tc_recdecode, NULL)){ eprint(tdb, "tctdbsetcodecfunc"); err = true; } if(!tctdbtune(tdb, rnum / 50, 2, -1, opts)){ eprint(tdb, "tctdbtune"); err = true; } if(!tctdbsetcache(tdb, rnum / 10, 128, 256)){ eprint(tdb, "tctdbsetcache"); err = true; } if(!tctdbsetxmsiz(tdb, rnum * sizeof(int))){ eprint(tdb, "tctdbsetxmsiz"); err = true; } if(!tctdbopen(tdb, path, TDBOWRITER | TDBOCREAT | TDBOTRUNC | omode)){ eprint(tdb, "tctdbopen"); err = true; } if(!tctdbsetindex(tdb, "", TDBITDECIMAL)){ eprint(tdb, "tctdbsetindex"); err = true; } if(!tctdbsetindex(tdb, "str", TDBITLEXICAL)){ eprint(tdb, "tctdbsetindex"); err = true; } if(!tctdbsetindex(tdb, "num", TDBITDECIMAL)){ eprint(tdb, "tctdbsetindex"); err = true; } if(!tctdbsetindex(tdb, "type", TDBITDECIMAL)){ eprint(tdb, "tctdbsetindex"); err = true; } if(!tctdbsetindex(tdb, "flag", TDBITLEXICAL)){ eprint(tdb, "tctdbsetindex"); err = true; } if(!tctdbiterinit(tdb)){ eprint(tdb, "tctdbiterinit"); err = true; } TARGWICKED targs[tnum]; pthread_t threads[tnum]; if(tnum == 1){ targs[0].tdb = tdb; targs[0].rnum = rnum; targs[0].id = 0; if(threadwicked(targs) != NULL) err = true; } else { for(int i = 0; i < tnum; i++){ targs[i].tdb = tdb; targs[i].rnum = rnum; targs[i].id = i; if(pthread_create(threads + i, NULL, threadwicked, targs + i) != 0){ eprint(tdb, "pthread_create"); targs[i].id = -1; err = true; } } for(int i = 0; i < tnum; i++){ if(targs[i].id == -1) continue; void *rv; if(pthread_join(threads[i], &rv) != 0){ eprint(tdb, "pthread_join"); err = true; } else if(rv){ err = true; } } } iprintf("record number: %llu\n", (unsigned long long)tctdbrnum(tdb)); iprintf("size: %llu\n", (unsigned long long)tctdbfsiz(tdb)); sysprint(); if(!tctdbclose(tdb)){ eprint(tdb, "tctdbclose"); err = true; } tctdbdel(tdb); iprintf("time: %.3f\n", tctime() - stime); iprintf("%s\n\n", err ? "error" : "ok"); return err ? 1 : 0;}/* perform typical command */static int proctypical(const char *path, int tnum, int rnum, int bnum, int apow, int fpow, int opts, int rcnum, int lcnum, int ncnum, int xmsiz, int omode, int rratio){ iprintf("<Typical Access Test>\n seed=%u path=%s tnum=%d rnum=%d bnum=%d apow=%d" " fpow=%d opts=%d rcnum=%d lcnum=%d ncnum=%d xmsiz=%d omode=%d rratio=%d\n\n", g_randseed, path, tnum, rnum, bnum, apow, fpow, opts, rcnum, lcnum, ncnum, xmsiz, omode, rratio); bool err = false; double stime = tctime(); TCTDB *tdb = tctdbnew(); if(g_dbgfd >= 0) tctdbsetdbgfd(tdb, g_dbgfd); if(!tctdbsetmutex(tdb)){ eprint(tdb, "tctdbsetmutex"); err = true; } if(!tctdbsetcodecfunc(tdb, _tc_recencode, NULL, _tc_recdecode, NULL)){ eprint(tdb, "tctdbsetcodecfunc"); err = true; } if(!tctdbtune(tdb, bnum, apow, fpow, opts)){ eprint(tdb, "tctdbtune"); err = true; } if(!tctdbsetcache(tdb, rcnum, lcnum, ncnum)){ eprint(tdb, "tctdbsetcache"); err = true; } if(xmsiz >= 0 && !tctdbsetxmsiz(tdb, xmsiz)){ eprint(tdb, "tctdbsetxmsiz"); err = true; } if(!tctdbopen(tdb, path, TDBOWRITER | TDBOCREAT | TDBOTRUNC | omode)){ eprint(tdb, "tctdbopen"); err = true; } if(!tctdbsetindex(tdb, "", TDBITDECIMAL)){ eprint(tdb, "tctdbsetindex"); err = true; } if(!tctdbsetindex(tdb, "str", TDBITLEXICAL)){ eprint(tdb, "tctdbsetindex"); err = true; } if(!tctdbsetindex(tdb, "num", TDBITDECIMAL)){ eprint(tdb, "tctdbsetindex"); err = true; } if(!tctdbsetindex(tdb, "type", TDBITDECIMAL)){ eprint(tdb, "tctdbsetindex"); err = true; } if(!tctdbsetindex(tdb, "flag", TDBITLEXICAL)){ eprint(tdb, "tctdbsetindex"); err = true; } TARGTYPICAL targs[tnum]; pthread_t threads[tnum]; if(tnum == 1){ targs[0].tdb = tdb; targs[0].rnum = rnum; targs[0].rratio = rratio; targs[0].id = 0; if(threadtypical(targs) != NULL) err = true; } else { for(int i = 0; i < tnum; i++){ targs[i].tdb = tdb; targs[i].rnum = rnum; targs[i].rratio= rratio; targs[i].id = i; if(pthread_create(threads + i, NULL, threadtypical, targs + i) != 0){ eprint(tdb, "pthread_create"); targs[i].id = -1; err = true; } } for(int i = 0; i < tnum; i++){ if(targs[i].id == -1) continue; void *rv; if(pthread_join(threads[i], &rv) != 0){ eprint(tdb, "pthread_join"); err = true; } else if(rv){ err = true; } } } iprintf("record number: %llu\n", (unsigned long long)tctdbrnum(tdb)); iprintf("size: %llu\n", (unsigned long long)tctdbfsiz(tdb)); sysprint(); if(!tctdbclose(tdb)){ eprint(tdb, "tctdbclose"); err = true; } tctdbdel(tdb); iprintf("time: %.3f\n", tctime() - stime); iprintf("%s\n\n", err ? "error" : "ok"); return err ? 1 : 0;}/* thread the write function */static void *threadwrite(void *targ){ TCTDB *tdb = ((TARGWRITE *)targ)->tdb; int rnum = ((TARGWRITE *)targ)->rnum; bool rnd = ((TARGWRITE *)targ)->rnd; int id = ((TARGWRITE *)targ)->id; bool err = false; int base = id * rnum; for(int i = 1; i <= rnum; i++){ int uid = rnd ? (base + myrand(i) + 1) : tctdbgenuid(tdb); char pkbuf[RECBUFSIZ]; int pksiz = sprintf(pkbuf, "%d", uid); TCMAP *cols = tcmapnew2(7); char vbuf[RECBUFSIZ*5]; int vsiz = sprintf(vbuf, "%d", uid); tcmapput(cols, "str", 3, vbuf, vsiz); vsiz = sprintf(vbuf, "%d", myrand(i) + 1); tcmapput(cols, "num", 3, vbuf, vsiz); vsiz = sprintf(vbuf, "%d", myrand(32) + 1); tcmapput(cols, "type", 4, vbuf, vsiz); int num = myrand(5);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -