From 475c30611b58de40485494cababa91c658b03bb0 Mon Sep 17 00:00:00 2001 From: xsren <285808407@qq.com> Date: Wed, 28 Aug 2024 14:12:19 +0800 Subject: [PATCH 1/2] fix: regex crashes on windows --- source/util/src/tcompare.c | 49 +++++++++++++++++++++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-) diff --git a/source/util/src/tcompare.c b/source/util/src/tcompare.c index 0dee177faf..11997d089c 100644 --- a/source/util/src/tcompare.c +++ b/source/util/src/tcompare.c @@ -1253,6 +1253,9 @@ void regexCacheFree(void *ppUsingRegex) { } int32_t InitRegexCache() { + #ifdef WINDOWS + return 0; + #endif sRegexCache.regexHash = taosHashInit(64, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), false, HASH_ENTRY_LOCK); if (sRegexCache.regexHash == NULL) { uError("failed to create RegexCache"); @@ -1277,6 +1280,9 @@ int32_t InitRegexCache() { } void DestroyRegexCache(){ + #ifdef WINDOWS + return; + #endif int32_t code = 0; uInfo("[regex cache] destory regex cache"); (void)taosTmrStopA(&sRegexCache.timer); @@ -1359,6 +1365,46 @@ void releaseRegComp(UsingRegex **regex){ static threadlocal UsingRegex ** ppUsingRegex; static threadlocal regex_t * pRegex; static threadlocal char *pOldPattern = NULL; + +#ifdef WINDOWS +static threadlocal regex_t gRegex; + +void DestoryThreadLocalRegComp() { + if (NULL != pOldPattern) { + regfree(&gRegex); + taosMemoryFree(pOldPattern); + pOldPattern = NULL; + } +} + +int32_t threadGetRegComp(regex_t **regex, const char *pPattern) { + if (NULL != pOldPattern) { + if (strcmp(pOldPattern, pPattern) == 0) { + *regex = &gRegex; + return 0; + } else { + DestoryThreadLocalRegComp(); + } + } + pOldPattern = taosStrdup(pPattern); + if (NULL == pOldPattern) { + uError("Failed to Malloc when compile regex pattern %s.", pPattern); + return terrno; + } + int32_t cflags = REG_EXTENDED; + int32_t ret = regcomp(&gRegex, pPattern, cflags); + if (ret != 0) { + char msgbuf[256] = {0}; + (void)regerror(ret, &gRegex, msgbuf, tListLen(msgbuf)); + uError("Failed to compile regex pattern %s. reason %s", pPattern, msgbuf); + taosMemoryFree(pOldPattern); + pOldPattern = NULL; + return TSDB_CODE_PAR_REGULAR_EXPRESSION_ERROR; + } + *regex = &gRegex; + return 0; +} +#else void DestoryThreadLocalRegComp() { if (NULL != pOldPattern) { releaseRegComp(ppUsingRegex); @@ -1390,10 +1436,11 @@ int32_t threadGetRegComp(regex_t **regex, const char *pPattern) { return terrno; } ppUsingRegex = ppRegex; - pRegex = &((*ppUsingRegex)->pRegex); + pRegex = &((*ppUsingRegex)->pRegex); *regex = &(*ppRegex)->pRegex; return 0; } +#endif static int32_t doExecRegexMatch(const char *pString, const char *pPattern) { int32_t ret = 0; From 37b70d46e98c3726ab0987caf338f1b0a38ca3c7 Mon Sep 17 00:00:00 2001 From: xsren <285808407@qq.com> Date: Wed, 28 Aug 2024 20:07:44 +0800 Subject: [PATCH 2/2] fix: ctest --- source/util/test/regexTest.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/source/util/test/regexTest.cpp b/source/util/test/regexTest.cpp index 5fe3701700..05d2f3b703 100644 --- a/source/util/test/regexTest.cpp +++ b/source/util/test/regexTest.cpp @@ -66,6 +66,7 @@ TEST(testCase, regexCacheTest1) { char s1[] = "abc"; auto start = std::chrono::high_resolution_clock::now(); +#ifndef WINDOWS uint64_t t0 = taosGetTimestampUs(); for (int i = 0; i < times; i++) { HashRegexPtr* ret = NULL; @@ -77,6 +78,7 @@ TEST(testCase, regexCacheTest1) { uint64_t t1 = taosGetTimestampUs(); printf("%s regex(current) %d times:%" PRIu64 " us.\n", s1, times, t1 - t0); + #endif uint64_t t2 = taosGetTimestampUs(); for(int i = 0; i < times; i++) { @@ -101,6 +103,7 @@ TEST(testCase, regexCacheTest2) { char s1[] = "abc%*"; auto start = std::chrono::high_resolution_clock::now(); +#ifndef WINDOWS uint64_t t0 = taosGetTimestampUs(); for (int i = 0; i < times; i++) { HashRegexPtr* ret = NULL; @@ -112,6 +115,7 @@ TEST(testCase, regexCacheTest2) { uint64_t t1 = taosGetTimestampUs(); printf("%s regex(current) %d times:%" PRIu64 " us.\n", s1, times, t1 - t0); + #endif uint64_t t2 = taosGetTimestampUs(); for(int i = 0; i < times; i++) { @@ -137,6 +141,7 @@ TEST(testCase, regexCacheTest3) { char s2[] = "abc"; auto start = std::chrono::high_resolution_clock::now(); +#ifndef WINDOWS uint64_t t0 = taosGetTimestampUs(); for (int i = 0; i < times; i++) { HashRegexPtr* ret = NULL; @@ -148,6 +153,7 @@ TEST(testCase, regexCacheTest3) { uint64_t t1 = taosGetTimestampUs(); printf("'%s' and '%s' take place by turn regex(current) %d times:%" PRIu64 " us.\n", s1, s2, times, t1 - t0); +#endif uint64_t t2 = taosGetTimestampUs(); for(int i = 0; i < times; i++) { @@ -176,6 +182,7 @@ TEST(testCase, regexCacheTest4) { char s2[] = "abc"; auto start = std::chrono::high_resolution_clock::now(); +#ifndef WINDOWS uint64_t t0 = taosGetTimestampUs(); for (int i = 0; i < times; i++) { for (int j = 0; j < count; ++j) { @@ -196,6 +203,7 @@ TEST(testCase, regexCacheTest4) { uint64_t t1 = taosGetTimestampUs(); printf("'%s' and '%s' take place by turn(per %d count) regex(current) %d times:%" PRIu64 " us.\n", s1, s2, count, times, t1 - t0); +#endif uint64_t t2 = taosGetTimestampUs(); for (int i = 0; i < times; i++) {