enh: test coverage of tlog
This commit is contained in:
parent
b354bd66f5
commit
9d15245dc6
|
@ -0,0 +1,32 @@
|
||||||
|
/*
|
||||||
|
* 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _TD_UTIL_LOG_INT_H_
|
||||||
|
#define _TD_UTIL_LOG_INT_H_
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "tlog.h"
|
||||||
|
|
||||||
|
void taosOpenNewSlowLogFile();
|
||||||
|
void taosLogObjSetTimeStamp(int64_t ts);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /*_TD_UTIL_LOG_INT_H_*/
|
|
@ -101,8 +101,10 @@ bool tsLogEmbedded = 0;
|
||||||
bool tsAsyncLog = true;
|
bool tsAsyncLog = true;
|
||||||
#ifdef ASSERT_NOT_CORE
|
#ifdef ASSERT_NOT_CORE
|
||||||
bool tsAssert = false;
|
bool tsAssert = false;
|
||||||
|
#define LOG_BUFFER_WAIT_SEC 20
|
||||||
#else
|
#else
|
||||||
bool tsAssert = true;
|
bool tsAssert = true;
|
||||||
|
#define LOG_BUFFER_WAIT_SEC 2
|
||||||
#endif
|
#endif
|
||||||
int32_t tsNumOfLogLines = 10000000;
|
int32_t tsNumOfLogLines = 10000000;
|
||||||
int32_t tsLogKeepDays = 0;
|
int32_t tsLogKeepDays = 0;
|
||||||
|
@ -442,7 +444,7 @@ static OldFileKeeper *taosOpenNewFile() {
|
||||||
static void *taosThreadToCloseOldFile(void *param) {
|
static void *taosThreadToCloseOldFile(void *param) {
|
||||||
if (!param) return NULL;
|
if (!param) return NULL;
|
||||||
OldFileKeeper *oldFileKeeper = (OldFileKeeper *)param;
|
OldFileKeeper *oldFileKeeper = (OldFileKeeper *)param;
|
||||||
taosSsleep(20);
|
taosSsleep(LOG_BUFFER_WAIT_SEC);
|
||||||
taosWLockLatch(&tsLogRotateLatch);
|
taosWLockLatch(&tsLogRotateLatch);
|
||||||
taosCloseLogByFd(oldFileKeeper->pOldFile);
|
taosCloseLogByFd(oldFileKeeper->pOldFile);
|
||||||
taosKeepOldLog(oldFileKeeper->keepName);
|
taosKeepOldLog(oldFileKeeper->keepName);
|
||||||
|
@ -483,7 +485,7 @@ static int32_t taosOpenNewLogFile() {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void taosOpenNewSlowLogFile() {
|
void taosOpenNewSlowLogFile() {
|
||||||
(void)taosThreadMutexLock(&tsLogObj.logMutex);
|
(void)taosThreadMutexLock(&tsLogObj.logMutex);
|
||||||
int64_t delta = taosGetTimestampSec() - tsLogObj.timestampToday;
|
int64_t delta = taosGetTimestampSec() - tsLogObj.timestampToday;
|
||||||
if (delta >= 0 && delta < 86400) {
|
if (delta >= 0 && delta < 86400) {
|
||||||
|
@ -539,6 +541,8 @@ void taosResetLog() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void taosLogObjSetTimeStamp(int64_t ts) { tsLogObj.timestampToday = ts; }
|
||||||
|
|
||||||
static bool taosCheckFileIsOpen(char *logFileName) {
|
static bool taosCheckFileIsOpen(char *logFileName) {
|
||||||
TdFilePtr pFile = taosOpenFile(logFileName, TD_FILE_WRITE);
|
TdFilePtr pFile = taosOpenFile(logFileName, TD_FILE_WRITE);
|
||||||
if (pFile == NULL) {
|
if (pFile == NULL) {
|
||||||
|
@ -619,6 +623,7 @@ static void processLogFileName(const char *logName, int32_t maxFileNum) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t taosInitNormalLog(const char *logName, int32_t maxFileNum) {
|
static int32_t taosInitNormalLog(const char *logName, int32_t maxFileNum) {
|
||||||
|
int32_t code = 0, lino = 0;
|
||||||
#ifdef WINDOWS_STASH
|
#ifdef WINDOWS_STASH
|
||||||
/*
|
/*
|
||||||
* always set maxFileNum to 1
|
* always set maxFileNum to 1
|
||||||
|
@ -653,38 +658,27 @@ static int32_t taosInitNormalLog(const char *logName, int32_t maxFileNum) {
|
||||||
|
|
||||||
// only an estimate for number of lines
|
// only an estimate for number of lines
|
||||||
int64_t filesize = 0;
|
int64_t filesize = 0;
|
||||||
if (taosFStatFile(tsLogObj.logHandle->pFile, &filesize, NULL) != 0) {
|
TAOS_CHECK_EXIT(taosFStatFile(tsLogObj.logHandle->pFile, &filesize, NULL));
|
||||||
(void)printf("\nfailed to fstat log file:%s, reason:%s\n", name, strerror(errno));
|
|
||||||
taosUnLockLogFile(tsLogObj.logHandle->pFile);
|
|
||||||
return terrno;
|
|
||||||
}
|
|
||||||
tsLogObj.lines = (int32_t)(filesize / 60);
|
tsLogObj.lines = (int32_t)(filesize / 60);
|
||||||
|
|
||||||
if (taosLSeekFile(tsLogObj.logHandle->pFile, 0, SEEK_END) < 0) {
|
if (taosLSeekFile(tsLogObj.logHandle->pFile, 0, SEEK_END) < 0) {
|
||||||
TAOS_UNUSED(printf("failed to seek to the end of log file:%s, reason:%s\n", name, tstrerror(terrno)));
|
TAOS_CHECK_EXIT(code = terrno ? terrno : -1);
|
||||||
taosUnLockLogFile(tsLogObj.logHandle->pFile);
|
|
||||||
return terrno;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
(void)snprintf(name, sizeof(name), "==================================================\n");
|
(void)snprintf(name, sizeof(name),
|
||||||
|
"==================================================\n"
|
||||||
|
" new log file\n"
|
||||||
|
"==================================================\n");
|
||||||
if (taosWriteFile(tsLogObj.logHandle->pFile, name, (uint32_t)strlen(name)) <= 0) {
|
if (taosWriteFile(tsLogObj.logHandle->pFile, name, (uint32_t)strlen(name)) <= 0) {
|
||||||
TAOS_UNUSED(printf("failed to write to log file:%s, reason:%s\n", name, tstrerror(terrno)));
|
TAOS_CHECK_EXIT(code = terrno ? terrno : -1);
|
||||||
taosUnLockLogFile(tsLogObj.logHandle->pFile);
|
|
||||||
return terrno;
|
|
||||||
}
|
|
||||||
(void)snprintf(name, sizeof(name), " new log file \n");
|
|
||||||
if (taosWriteFile(tsLogObj.logHandle->pFile, name, (uint32_t)strlen(name)) <= 0) {
|
|
||||||
TAOS_UNUSED(printf("failed to write to log file:%s, reason:%s\n", name, tstrerror(terrno)));
|
|
||||||
taosUnLockLogFile(tsLogObj.logHandle->pFile);
|
|
||||||
return terrno;
|
|
||||||
}
|
|
||||||
(void)snprintf(name, sizeof(name), "==================================================\n");
|
|
||||||
if (taosWriteFile(tsLogObj.logHandle->pFile, name, (uint32_t)strlen(name)) <= 0) {
|
|
||||||
TAOS_UNUSED(printf("failed to write to log file:%s, reason:%s\n", name, tstrerror(terrno)));
|
|
||||||
taosUnLockLogFile(tsLogObj.logHandle->pFile);
|
|
||||||
return terrno;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_exit:
|
||||||
|
taosUnLockLogFile(tsLogObj.logHandle->pFile);
|
||||||
|
if (code != 0) {
|
||||||
|
TAOS_UNUSED(printf("failed to init normal log file:%s at line %d, reason:%s\n", name, lino, tstrerror(code)));
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -137,6 +137,10 @@ add_test(
|
||||||
NAME logTest
|
NAME logTest
|
||||||
COMMAND logTest
|
COMMAND logTest
|
||||||
)
|
)
|
||||||
|
target_include_directories(
|
||||||
|
logTest
|
||||||
|
PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/../inc"
|
||||||
|
)
|
||||||
|
|
||||||
IF(COMPILER_SUPPORT_AVX2)
|
IF(COMPILER_SUPPORT_AVX2)
|
||||||
MESSAGE(STATUS "AVX2 instructions is ACTIVATED")
|
MESSAGE(STATUS "AVX2 instructions is ACTIVATED")
|
||||||
|
|
|
@ -2,7 +2,9 @@
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include <random>
|
#include <random>
|
||||||
|
#include <tdef.h>
|
||||||
#include <tlog.h>
|
#include <tlog.h>
|
||||||
|
#include <tlogInt.h>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
@ -44,3 +46,92 @@ TEST(log, check_log_refactor) {
|
||||||
}
|
}
|
||||||
taosCloseLog();
|
taosCloseLog();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extern char *tsLogOutput;
|
||||||
|
TEST(log, misc) {
|
||||||
|
// taosInitLog
|
||||||
|
const char *path = TD_TMP_DIR_PATH "td";
|
||||||
|
taosRemoveDir(path);
|
||||||
|
taosMkDir(path);
|
||||||
|
tstrncpy(tsLogDir, path, PATH_MAX);
|
||||||
|
EXPECT_EQ(taosInitLog("taoslog", 1, true), 0);
|
||||||
|
|
||||||
|
taosOpenNewSlowLogFile();
|
||||||
|
taosLogObjSetTimeStamp(INT64_MIN);
|
||||||
|
taosPrintSlowLog("slow log test");
|
||||||
|
|
||||||
|
// test taosInitLogOutput
|
||||||
|
const char *pLogName = NULL;
|
||||||
|
tsLogOutput = (char *)taosMemCalloc(1, TSDB_FILENAME_LEN);
|
||||||
|
EXPECT_EQ(taosInitLogOutput(&pLogName), TSDB_CODE_INVALID_CFG);
|
||||||
|
tstrncpy(tsLogOutput, "stdout", TSDB_FILENAME_LEN);
|
||||||
|
EXPECT_EQ(taosInitLogOutput(&pLogName), 0);
|
||||||
|
tstrncpy(tsLogOutput, "stderr", TSDB_FILENAME_LEN);
|
||||||
|
EXPECT_EQ(taosInitLogOutput(&pLogName), 0);
|
||||||
|
tstrncpy(tsLogOutput, "/dev/null", TSDB_FILENAME_LEN);
|
||||||
|
EXPECT_EQ(taosInitLogOutput(&pLogName), 0);
|
||||||
|
tsLogOutput[0] = '#';
|
||||||
|
EXPECT_EQ(taosInitLogOutput(&pLogName), TSDB_CODE_INVALID_CFG);
|
||||||
|
tstrncpy(tsLogOutput, "/", TSDB_FILENAME_LEN);
|
||||||
|
EXPECT_EQ(taosInitLogOutput(&pLogName), 0);
|
||||||
|
tstrncpy(tsLogOutput, "\\", TSDB_FILENAME_LEN);
|
||||||
|
EXPECT_EQ(taosInitLogOutput(&pLogName), 0);
|
||||||
|
tstrncpy(tsLogOutput, "testLogOutput", TSDB_FILENAME_LEN);
|
||||||
|
EXPECT_EQ(taosInitLogOutput(&pLogName), 0);
|
||||||
|
tstrncpy(tsLogOutput, "testLogOutputDir/testLogOutput", TSDB_FILENAME_LEN);
|
||||||
|
EXPECT_EQ(taosInitLogOutput(&pLogName), 0);
|
||||||
|
tstrncpy(tsLogOutput, ".", TSDB_FILENAME_LEN);
|
||||||
|
EXPECT_EQ(taosInitLogOutput(&pLogName), TSDB_CODE_INVALID_CFG);
|
||||||
|
tstrncpy(tsLogOutput, "/..", TSDB_FILENAME_LEN);
|
||||||
|
EXPECT_EQ(taosInitLogOutput(&pLogName), TSDB_CODE_INVALID_CFG);
|
||||||
|
tsLogOutput[0] = 0;
|
||||||
|
|
||||||
|
// test taosAssertDebug
|
||||||
|
tsAssert = false;
|
||||||
|
taosAssertDebug(true, __FILE__, __LINE__, 0, "test_assert_true_without_core");
|
||||||
|
taosAssertDebug(false, __FILE__, __LINE__, 0, "test_assert_false_with_core");
|
||||||
|
tsAssert = true;
|
||||||
|
|
||||||
|
// test taosLogCrashInfo, taosReadCrashInfo and taosReleaseCrashLogFile
|
||||||
|
char nodeType[16] = "nodeType";
|
||||||
|
char *pCrashMsg = (char *)taosMemoryCalloc(1, 16);
|
||||||
|
EXPECT_NE(pCrashMsg, nullptr);
|
||||||
|
tstrncpy(pCrashMsg, "crashMsg", 16);
|
||||||
|
|
||||||
|
pid_t pid = taosGetPId();
|
||||||
|
EXPECT_EQ(pid > 0, true);
|
||||||
|
siginfo_t sigInfo = {0};
|
||||||
|
sigInfo.si_pid = pid;
|
||||||
|
taosLogCrashInfo(nodeType, pCrashMsg, strlen(pCrashMsg), 0, &sigInfo);
|
||||||
|
|
||||||
|
char crashInfo[PATH_MAX] = {0};
|
||||||
|
snprintf(crashInfo, sizeof(crashInfo), "%s%s.%sCrashLog", tsLogDir, TD_DIRSEP, nodeType);
|
||||||
|
|
||||||
|
char *pReadMsg = NULL;
|
||||||
|
int64_t readMsgLen = 0;
|
||||||
|
TdFilePtr pFile = NULL;
|
||||||
|
taosReadCrashInfo(crashInfo, &pReadMsg, &readMsgLen, &pFile);
|
||||||
|
EXPECT_NE(pReadMsg, nullptr);
|
||||||
|
EXPECT_NE(pFile, nullptr);
|
||||||
|
EXPECT_EQ(strncasecmp(pReadMsg, "crashMsg", strlen("crashMsg")), 0);
|
||||||
|
EXPECT_EQ(taosCloseFile(&pFile), 0);
|
||||||
|
taosMemoryFreeClear(pReadMsg);
|
||||||
|
|
||||||
|
pFile = taosOpenFile(crashInfo, TD_FILE_WRITE);
|
||||||
|
EXPECT_NE(pFile, nullptr);
|
||||||
|
EXPECT_EQ(taosWriteFile(pFile, "00000", 1), 1);
|
||||||
|
EXPECT_EQ(taosCloseFile(&pFile), 0);
|
||||||
|
|
||||||
|
taosReadCrashInfo(crashInfo, &pReadMsg, &readMsgLen, &pFile);
|
||||||
|
EXPECT_EQ(pReadMsg, nullptr);
|
||||||
|
EXPECT_EQ(pFile, nullptr);
|
||||||
|
|
||||||
|
pFile = taosOpenFile(crashInfo, TD_FILE_WRITE);
|
||||||
|
EXPECT_NE(pFile, nullptr);
|
||||||
|
taosReleaseCrashLogFile(pFile, true);
|
||||||
|
|
||||||
|
// clean up
|
||||||
|
taosRemoveDir(path);
|
||||||
|
|
||||||
|
taosCloseLog();
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue