opt log to aovid stack overflow
This commit is contained in:
parent
c08ab1cffe
commit
b8a9e4d364
|
@ -21,10 +21,12 @@
|
||||||
#include "tjson.h"
|
#include "tjson.h"
|
||||||
#include "tutil.h"
|
#include "tutil.h"
|
||||||
|
|
||||||
#define LOG_MAX_LINE_SIZE (10024)
|
#define LOG_MAX_LINE_SIZE (10024)
|
||||||
#define LOG_MAX_LINE_BUFFER_SIZE (LOG_MAX_LINE_SIZE + 3)
|
#define LOG_MAX_LINE_BUFFER_SIZE (LOG_MAX_LINE_SIZE + 3)
|
||||||
#define LOG_MAX_LINE_DUMP_SIZE (1024 * 1024)
|
#define LOG_MAX_STACK_LINE_SIZE (512)
|
||||||
#define LOG_MAX_LINE_DUMP_BUFFER_SIZE (LOG_MAX_LINE_DUMP_SIZE + 128)
|
#define LOG_MAX_STACK_LINE_BUFFER_SIZE (LOG_MAX_STACK_LINE_SIZE + 3)
|
||||||
|
#define LOG_MAX_LINE_DUMP_SIZE (1024 * 1024)
|
||||||
|
#define LOG_MAX_LINE_DUMP_BUFFER_SIZE (LOG_MAX_LINE_DUMP_SIZE + 128)
|
||||||
|
|
||||||
#define LOG_FILE_DAY_LEN 64
|
#define LOG_FILE_DAY_LEN 64
|
||||||
|
|
||||||
|
@ -669,16 +671,40 @@ static inline void taosPrintLogImp(ELogLevel level, int32_t dflag, const char *b
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void taosPrintLog(const char *flags, int32_t level, int32_t dflag, const char *format, ...) {
|
/*
|
||||||
if (!(dflag & DEBUG_FILE) && !(dflag & DEBUG_SCREEN)) return;
|
use taosPrintLogImpl_useStackBuffer to avoid stack overflow
|
||||||
|
|
||||||
char buffer[LOG_MAX_LINE_BUFFER_SIZE];
|
*/
|
||||||
|
int8_t taosPrintLogImpl_useStackBuffer(const char *flags, int32_t level, int32_t dflag, const char *format,
|
||||||
|
va_list args) {
|
||||||
|
char buffer[LOG_MAX_STACK_LINE_BUFFER_SIZE];
|
||||||
int32_t len = taosBuildLogHead(buffer, flags);
|
int32_t len = taosBuildLogHead(buffer, flags);
|
||||||
|
|
||||||
va_list argpointer;
|
int32_t writeLen = len + vsnprintf(buffer + len, LOG_MAX_STACK_LINE_BUFFER_SIZE - len - 1, format, args);
|
||||||
va_start(argpointer, format);
|
if (writeLen > LOG_MAX_STACK_LINE_SIZE) {
|
||||||
int32_t writeLen = len + vsnprintf(buffer + len, LOG_MAX_LINE_BUFFER_SIZE - len, format, argpointer);
|
return 1;
|
||||||
va_end(argpointer);
|
}
|
||||||
|
|
||||||
|
buffer[writeLen++] = '\n';
|
||||||
|
buffer[writeLen] = 0;
|
||||||
|
|
||||||
|
taosPrintLogImp(level, dflag, buffer, writeLen);
|
||||||
|
|
||||||
|
if (tsLogFp && level <= DEBUG_INFO) {
|
||||||
|
buffer[writeLen - 1] = 0;
|
||||||
|
(*tsLogFp)(taosGetTimestampMs(), level, buffer + len);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
int8_t taosPrintLogImpl_useHeapBuffer(const char *flags, int32_t level, int32_t dflag, const char *format,
|
||||||
|
va_list args) {
|
||||||
|
char *buffer = taosMemoryCalloc(1, LOG_MAX_LINE_BUFFER_SIZE + 1);
|
||||||
|
if (buffer == NULL) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
int32_t len = taosBuildLogHead(buffer, flags);
|
||||||
|
|
||||||
|
int32_t writeLen = len + vsnprintf(buffer + len, LOG_MAX_LINE_BUFFER_SIZE - len - 1, format, args);
|
||||||
|
|
||||||
if (writeLen > LOG_MAX_LINE_SIZE) writeLen = LOG_MAX_LINE_SIZE;
|
if (writeLen > LOG_MAX_LINE_SIZE) writeLen = LOG_MAX_LINE_SIZE;
|
||||||
buffer[writeLen++] = '\n';
|
buffer[writeLen++] = '\n';
|
||||||
|
@ -690,6 +716,22 @@ void taosPrintLog(const char *flags, int32_t level, int32_t dflag, const char *f
|
||||||
buffer[writeLen - 1] = 0;
|
buffer[writeLen - 1] = 0;
|
||||||
(*tsLogFp)(taosGetTimestampMs(), level, buffer + len);
|
(*tsLogFp)(taosGetTimestampMs(), level, buffer + len);
|
||||||
}
|
}
|
||||||
|
taosMemoryFree(buffer);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
void taosPrintLog(const char *flags, int32_t level, int32_t dflag, const char *format, ...) {
|
||||||
|
if (!(dflag & DEBUG_FILE) && !(dflag & DEBUG_SCREEN)) return;
|
||||||
|
|
||||||
|
va_list argpointer, argpointer_copy;
|
||||||
|
va_start(argpointer, format);
|
||||||
|
va_copy(argpointer_copy, argpointer);
|
||||||
|
|
||||||
|
if (taosPrintLogImpl_useStackBuffer(flags, level, dflag, format, argpointer) == 0) {
|
||||||
|
} else {
|
||||||
|
TAOS_UNUSED(taosPrintLogImpl_useHeapBuffer(flags, level, dflag, format, argpointer_copy));
|
||||||
|
}
|
||||||
|
va_end(argpointer_copy);
|
||||||
|
va_end(argpointer);
|
||||||
}
|
}
|
||||||
|
|
||||||
void taosPrintLongString(const char *flags, int32_t level, int32_t dflag, const char *format, ...) {
|
void taosPrintLongString(const char *flags, int32_t level, int32_t dflag, const char *format, ...) {
|
||||||
|
|
|
@ -126,6 +126,13 @@ add_test(
|
||||||
COMMAND regexTest
|
COMMAND regexTest
|
||||||
)
|
)
|
||||||
|
|
||||||
|
add_executable(logTest "log.cpp")
|
||||||
|
target_link_libraries(logTest os util common gtest_main)
|
||||||
|
add_test(
|
||||||
|
NAME logTest
|
||||||
|
COMMAND logTest
|
||||||
|
)
|
||||||
|
|
||||||
add_executable(decompressTest "decompressTest.cpp")
|
add_executable(decompressTest "decompressTest.cpp")
|
||||||
target_link_libraries(decompressTest os util common gtest_main)
|
target_link_libraries(decompressTest os util common gtest_main)
|
||||||
add_test(
|
add_test(
|
||||||
|
|
|
@ -0,0 +1,46 @@
|
||||||
|
#include <gtest/gtest.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <random>
|
||||||
|
#include <tlog.h>
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
|
||||||
|
TEST(log, check_log_refactor) {
|
||||||
|
const char *logDir = "/tmp";
|
||||||
|
const char *defaultLogFileNamePrefix = "taoslog";
|
||||||
|
const int32_t maxLogFileNum = 10000;
|
||||||
|
tsAsyncLog = 0;
|
||||||
|
// idxDebugFlag = 143;
|
||||||
|
strcpy(tsLogDir, (char *)logDir);
|
||||||
|
taosInitLog(tsLogDir, 10, false);
|
||||||
|
tsAsyncLog = 0;
|
||||||
|
uDebugFlag = 143;
|
||||||
|
|
||||||
|
std::string str;
|
||||||
|
str.push_back('a');
|
||||||
|
|
||||||
|
for (int i = 0; i < 10000; i += 2) {
|
||||||
|
str.push_back('a');
|
||||||
|
uError("write to file %s", str.c_str());
|
||||||
|
}
|
||||||
|
str.clear();
|
||||||
|
for (int i = 0; i < 10000; i += 2) {
|
||||||
|
str.push_back('a');
|
||||||
|
uDebug("write to file %s", str.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < 10000; i += 2) {
|
||||||
|
str.push_back('a');
|
||||||
|
uInfo("write to file %s", str.c_str());
|
||||||
|
}
|
||||||
|
str.clear();
|
||||||
|
|
||||||
|
for (int i = 0; i < 10000; i += 2) {
|
||||||
|
str.push_back('a');
|
||||||
|
uTrace("write to file %s", str.c_str());
|
||||||
|
}
|
||||||
|
taosCloseLog();
|
||||||
|
}
|
Loading…
Reference in New Issue