tlog.c 20.4 KB
Newer Older
H
hzcheng 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
/*
 * 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/>.
 */

S
slguan 已提交
16
#define _DEFAULT_SOURCE
S
log  
Shengliang Guan 已提交
17
#include "tlog.h"
S
Shengliang Guan 已提交
18
#include "tutil.h"
L
Liu Jicong 已提交
19

S
Shengliang Guan 已提交
20 21 22 23
#define LOG_MAX_LINE_SIZE             (1024)
#define LOG_MAX_LINE_BUFFER_SIZE      (LOG_MAX_LINE_SIZE + 3)
#define LOG_MAX_LINE_DUMP_SIZE        (65 * 1024)
#define LOG_MAX_LINE_DUMP_BUFFER_SIZE (LOG_MAX_LINE_DUMP_SIZE + 3)
S
slguan 已提交
24

S
ulog  
Shengliang Guan 已提交
25 26
#define LOG_FILE_NAME_LEN    300
#define LOG_DEFAULT_BUF_SIZE (20 * 1024 * 1024)  // 20MB
H
hzcheng 已提交
27

S
ulog  
Shengliang Guan 已提交
28 29 30 31 32
#define LOG_DEFAULT_INTERVAL 25
#define LOG_INTERVAL_STEP    5
#define LOG_MIN_INTERVAL     5
#define LOG_MAX_INTERVAL     25
#define LOG_MAX_WAIT_MSEC    1000
D
fix bug  
dapan1121 已提交
33

S
slguan 已提交
34
#define LOG_BUF_BUFFER(x) ((x)->buffer)
S
ulog  
Shengliang Guan 已提交
35 36 37 38
#define LOG_BUF_START(x)  ((x)->buffStart)
#define LOG_BUF_END(x)    ((x)->buffEnd)
#define LOG_BUF_SIZE(x)   ((x)->buffSize)
#define LOG_BUF_MUTEX(x)  ((x)->buffMutex)
S
slguan 已提交
39

H
hzcheng 已提交
40
typedef struct {
L
Liu Jicong 已提交
41
  char           *buffer;
S
slguan 已提交
42 43 44
  int32_t         buffStart;
  int32_t         buffEnd;
  int32_t         buffSize;
D
fix bu  
dapan1121 已提交
45
  int32_t         minBuffSize;
46
  TdFilePtr       pFile;
S
slguan 已提交
47
  int32_t         stop;
wafwerar's avatar
wafwerar 已提交
48 49
  TdThread       asyncThread;
  TdThreadMutex buffMutex;
S
slguan 已提交
50
  tsem_t          buffNotEmpty;
H
hzcheng 已提交
51 52
} SLogBuff;

S
slguan 已提交
53
typedef struct {
L
Liu Jicong 已提交
54 55 56 57 58 59 60 61
  int32_t         fileNum;
  int32_t         maxLines;
  int32_t         lines;
  int32_t         flag;
  int32_t         openInProgress;
  pid_t           pid;
  char            logName[LOG_FILE_NAME_LEN];
  SLogBuff       *logHandle;
wafwerar's avatar
wafwerar 已提交
62
  TdThreadMutex logMutex;
S
slguan 已提交
63 64
} SLogObj;

S
Shengliang Guan 已提交
65 66
static int8_t  tsLogInited = 0;
static SLogObj tsLogObj = {.fileNum = 1};
S
Shengliang Guan 已提交
67 68
static int64_t tsAsyncLogLostLines = 0;
static int32_t tsWriteInterval = LOG_DEFAULT_INTERVAL;
L
Liu Jicong 已提交
69

S
Shengliang Guan 已提交
70
bool    tsLogEmbedded = 0;
S
Shengliang Guan 已提交
71
bool    tsAsyncLog = true;
S
Shengliang Guan 已提交
72
int32_t tsNumOfLogLines = 10000000;
S
Shengliang Guan 已提交
73
int32_t tsLogKeepDays = 0;
S
Shengliang Guan 已提交
74
LogFp   tsLogFp = NULL;
S
Shengliang Guan 已提交
75 76 77 78
int64_t tsNumOfErrorLogs = 0;
int64_t tsNumOfInfoLogs = 0;
int64_t tsNumOfDebugLogs = 0;
int64_t tsNumOfTraceLogs = 0;
D
fix bug  
dapan1121 已提交
79

S
Shengliang Guan 已提交
80 81 82
// log
int32_t dDebugFlag = 135;
int32_t vDebugFlag = 135;
S
Shengliang Guan 已提交
83
int32_t mDebugFlag = 131;
S
Shengliang Guan 已提交
84 85
int32_t cDebugFlag = 131;
int32_t jniDebugFlag = 131;
S
Shengliang Guan 已提交
86
int32_t tmrDebugFlag = 131;
S
Shengliang Guan 已提交
87
int32_t uDebugFlag = 131;
S
Shengliang Guan 已提交
88 89
int32_t rpcDebugFlag = 131;
int32_t qDebugFlag = 131;
S
Shengliang Guan 已提交
90
int32_t wDebugFlag = 135;
S
Shengliang Guan 已提交
91
int32_t sDebugFlag = 135;
S
Shengliang Guan 已提交
92
int32_t tsdbDebugFlag = 131;
L
Liu Jicong 已提交
93
int32_t tqDebugFlag = 135;
S
Shengliang Guan 已提交
94
int32_t fsDebugFlag = 135;
D
dapan1121 已提交
95

D
fix bug  
dapan1121 已提交
96
int64_t dbgEmptyW = 0;
D
fix bug  
dapan1121 已提交
97 98 99
int64_t dbgWN = 0;
int64_t dbgSmallWN = 0;
int64_t dbgBigWN = 0;
D
fix bug  
dapan1121 已提交
100 101
int64_t dbgWSize = 0;

L
Liu Jicong 已提交
102
static void     *taosAsyncOutputLog(void *param);
S
Shengliang Guan 已提交
103
static int32_t   taosPushLogBuffer(SLogBuff *tLogBuff, const char *msg, int32_t msgLen);
S
slguan 已提交
104
static SLogBuff *taosLogBuffNew(int32_t bufSize);
105
static void      taosCloseLogByFd(TdFilePtr pFile);
S
slguan 已提交
106
static int32_t   taosOpenLogFile(char *fn, int32_t maxLines, int32_t maxFileNum);
S
Shengliang Guan 已提交
107
static int32_t   taosCompressFile(char *srcFileName, char *destFileName);
S
slguan 已提交
108 109

static int32_t taosStartLog() {
wafwerar's avatar
wafwerar 已提交
110 111 112
  TdThreadAttr threadAttr;
  taosThreadAttrInit(&threadAttr);
  if (taosThreadCreate(&(tsLogObj.logHandle->asyncThread), &threadAttr, taosAsyncOutputLog, tsLogObj.logHandle) != 0) {
H
hzcheng 已提交
113 114
    return -1;
  }
wafwerar's avatar
wafwerar 已提交
115
  taosThreadAttrDestroy(&threadAttr);
H
hzcheng 已提交
116 117 118
  return 0;
}

S
Shengliang Guan 已提交
119
int32_t taosInitLog(const char *logName, int32_t maxFiles) {
S
Shengliang Guan 已提交
120
  if (atomic_val_compare_exchange_8(&tsLogInited, 0, 1) != 0) return 0;
S
osenv  
Shengliang Guan 已提交
121
  osUpdate();
S
Shengliang Guan 已提交
122

S
Shengliang Guan 已提交
123
  char fullName[PATH_MAX] = {0};
S
os env  
Shengliang Guan 已提交
124
  snprintf(fullName, PATH_MAX, "%s" TD_DIRSEP "%s", tsLogDir, logName);
S
Shengliang Guan 已提交
125

S
ulog  
Shengliang Guan 已提交
126
  tsLogObj.logHandle = taosLogBuffNew(LOG_DEFAULT_BUF_SIZE);
S
slguan 已提交
127
  if (tsLogObj.logHandle == NULL) return -1;
S
Shengliang Guan 已提交
128
  if (taosOpenLogFile(fullName, tsNumOfLogLines, maxFiles) < 0) return -1;
H
hzcheng 已提交
129 130 131 132
  if (taosStartLog() < 0) return -1;
  return 0;
}

S
slguan 已提交
133 134 135 136
static void taosStopLog() {
  if (tsLogObj.logHandle) {
    tsLogObj.logHandle->stop = 1;
  }
H
hzcheng 已提交
137 138
}

S
slguan 已提交
139
void taosCloseLog() {
H
hzcheng 已提交
140
  taosStopLog();
S
slguan 已提交
141
  if (taosCheckPthreadValid(tsLogObj.logHandle->asyncThread)) {
wafwerar's avatar
wafwerar 已提交
142
    taosThreadJoin(tsLogObj.logHandle->asyncThread, NULL);
S
slguan 已提交
143
  }
S
shm  
Shengliang Guan 已提交
144
  tsLogInited = 0;
S
slguan 已提交
145 146 147
  // In case that other threads still use log resources causing invalid write in valgrind
  // we comment two lines below.
  // taosLogBuffDestroy(tsLogObj.logHandle);
H
hzcheng 已提交
148 149 150
  // taosCloseLog();
}

151 152
static bool taosLockLogFile(TdFilePtr pFile) {
  if (pFile == NULL) return false;
H
hzcheng 已提交
153

S
slguan 已提交
154
  if (tsLogObj.fileNum > 1) {
155
    int32_t ret = taosLockFile(pFile);
H
hzcheng 已提交
156 157 158 159 160 161 162 163
    if (ret == 0) {
      return true;
    }
  }

  return false;
}

164 165
static void taosUnLockLogFile(TdFilePtr pFile) {
  if (pFile == NULL) return;
H
hzcheng 已提交
166

S
slguan 已提交
167
  if (tsLogObj.fileNum > 1) {
168
    taosUnLockFile(pFile);
H
hzcheng 已提交
169 170 171
  }
}

S
TD-1263  
Shengliang Guan 已提交
172
static void taosKeepOldLog(char *oldName) {
S
TD-1574  
Shengliang Guan 已提交
173
  if (tsLogKeepDays == 0) return;
S
TD-1263  
Shengliang Guan 已提交
174

S
TD-1263  
Shengliang Guan 已提交
175
  int64_t fileSec = taosGetTimestampSec();
S
TD-1263  
Shengliang Guan 已提交
176
  char    fileName[LOG_FILE_NAME_LEN + 20];
S
TD-1263  
Shengliang Guan 已提交
177
  snprintf(fileName, LOG_FILE_NAME_LEN + 20, "%s.%" PRId64, tsLogObj.logName, fileSec);
S
TD-1263  
Shengliang Guan 已提交
178

S
Shengliang Guan 已提交
179
  taosRenameFile(oldName, fileName);
S
TD-1574  
Shengliang Guan 已提交
180 181 182 183
  if (tsLogKeepDays < 0) {
    char compressFileName[LOG_FILE_NAME_LEN + 20];
    snprintf(compressFileName, LOG_FILE_NAME_LEN + 20, "%s.%" PRId64 ".gz", tsLogObj.logName, fileSec);
    if (taosCompressFile(fileName, compressFileName) == 0) {
184
      (void)taosRemoveFile(fileName);
S
TD-1574  
Shengliang Guan 已提交
185 186 187
    }
  }

S
os env  
Shengliang Guan 已提交
188
  taosRemoveOldFiles(tsLogDir, TABS(tsLogKeepDays));
S
TD-1263  
Shengliang Guan 已提交
189 190
}

S
slguan 已提交
191
static void *taosThreadToOpenNewFile(void *param) {
S
TD-1263  
Shengliang Guan 已提交
192 193
  char keepName[LOG_FILE_NAME_LEN + 20];
  sprintf(keepName, "%s.%d", tsLogObj.logName, tsLogObj.flag);
H
hzcheng 已提交
194

S
slguan 已提交
195 196
  tsLogObj.flag ^= 1;
  tsLogObj.lines = 0;
S
TD-1263  
Shengliang Guan 已提交
197
  char name[LOG_FILE_NAME_LEN + 20];
S
slguan 已提交
198
  sprintf(name, "%s.%d", tsLogObj.logName, tsLogObj.flag);
H
hzcheng 已提交
199

S
Shengliang Guan 已提交
200
  taosUmaskFile(0);
H
hzcheng 已提交
201

202 203
  TdFilePtr pFile = taosOpenFile(name, TD_FILE_CTEATE | TD_FILE_WRITE | TD_FILE_TRUNC);
  if (pFile == NULL) {
204 205
    tsLogObj.openInProgress = 0;
    tsLogObj.lines = tsLogObj.maxLines - 1000;
206
    uError("open new log file fail! reason:%s, reuse lastlog", strerror(errno));
H
Hui Li 已提交
207 208
    return NULL;
  }
S
TD-1263  
Shengliang Guan 已提交
209

210 211
  taosLockLogFile(pFile);
  (void)taosLSeekFile(pFile, 0, SEEK_SET);
H
hzcheng 已提交
212

213 214
  TdFilePtr pOldFile = tsLogObj.logHandle->pFile;
  tsLogObj.logHandle->pFile = pFile;
S
slguan 已提交
215 216
  tsLogObj.lines = 0;
  tsLogObj.openInProgress = 0;
217
  taosSsleep(3);
218
  taosCloseLogByFd(pOldFile);
L
Liu Jicong 已提交
219

S
TD-1263  
Shengliang Guan 已提交
220 221
  uInfo("   new log file:%d is opened", tsLogObj.flag);
  uInfo("==================================");
S
TD-1263  
Shengliang Guan 已提交
222 223
  taosKeepOldLog(keepName);

H
hzcheng 已提交
224 225 226
  return NULL;
}

S
slguan 已提交
227
static int32_t taosOpenNewLogFile() {
wafwerar's avatar
wafwerar 已提交
228
  taosThreadMutexLock(&tsLogObj.logMutex);
H
hzcheng 已提交
229

S
slguan 已提交
230 231
  if (tsLogObj.lines > tsLogObj.maxLines && tsLogObj.openInProgress == 0) {
    tsLogObj.openInProgress = 1;
H
hzcheng 已提交
232

233
    uInfo("open new log file ......");
wafwerar's avatar
wafwerar 已提交
234 235 236 237
    TdThread      thread;
    TdThreadAttr attr;
    taosThreadAttrInit(&attr);
    taosThreadAttrSetDetachState(&attr, PTHREAD_CREATE_DETACHED);
H
hzcheng 已提交
238

wafwerar's avatar
wafwerar 已提交
239 240
    taosThreadCreate(&thread, &attr, taosThreadToOpenNewFile, NULL);
    taosThreadAttrDestroy(&attr);
H
hzcheng 已提交
241 242
  }

wafwerar's avatar
wafwerar 已提交
243
  taosThreadMutexUnlock(&tsLogObj.logMutex);
H
hzcheng 已提交
244 245 246 247

  return 0;
}

S
slguan 已提交
248 249 250
void taosResetLog() {
  char lastName[LOG_FILE_NAME_LEN + 20];
  sprintf(lastName, "%s.%d", tsLogObj.logName, tsLogObj.flag);
H
hzcheng 已提交
251 252

  // force create a new log file
S
slguan 已提交
253
  tsLogObj.lines = tsLogObj.maxLines + 10;
H
hzcheng 已提交
254 255

  taosOpenNewLogFile();
256
  (void)taosRemoveFile(lastName);
H
hzcheng 已提交
257

258 259
  uInfo("==================================");
  uInfo("   reset log file ");
H
hzcheng 已提交
260 261
}

S
slguan 已提交
262
static bool taosCheckFileIsOpen(char *logFileName) {
263 264
  TdFilePtr pFile = taosOpenFile(logFileName, TD_FILE_WRITE);
  if (pFile == NULL) {
265 266 267 268 269 270
    if (errno == ENOENT) {
      return false;
    } else {
      printf("\nfailed to open log file:%s, reason:%s\n", logFileName, strerror(errno));
      return true;
    }
H
hzcheng 已提交
271 272
  }

273 274 275
  if (taosLockLogFile(pFile)) {
    taosUnLockLogFile(pFile);
    taosCloseFile(&pFile);
H
hzcheng 已提交
276 277
    return false;
  } else {
278
    taosCloseFile(&pFile);
H
hzcheng 已提交
279 280 281 282
    return true;
  }
}

S
slguan 已提交
283 284 285
static void taosGetLogFileName(char *fn) {
  if (tsLogObj.fileNum > 1) {
    for (int32_t i = 0; i < tsLogObj.fileNum; i++) {
H
hzcheng 已提交
286 287 288 289 290 291 292 293 294
      char fileName[LOG_FILE_NAME_LEN];

      sprintf(fileName, "%s%d.0", fn, i);
      bool file1open = taosCheckFileIsOpen(fileName);

      sprintf(fileName, "%s%d.1", fn, i);
      bool file2open = taosCheckFileIsOpen(fileName);

      if (!file1open && !file2open) {
S
slguan 已提交
295
        sprintf(tsLogObj.logName, "%s%d", fn, i);
H
hzcheng 已提交
296 297 298 299 300
        return;
      }
    }
  }

H
Hui Li 已提交
301 302 303
  if (strlen(fn) < LOG_FILE_NAME_LEN) {
    strcpy(tsLogObj.logName, fn);
  }
H
hzcheng 已提交
304 305
}

S
slguan 已提交
306
static int32_t taosOpenLogFile(char *fn, int32_t maxLines, int32_t maxFileNum) {
S
slguan 已提交
307 308
#ifdef WINDOWS
  /*
L
Liu Jicong 已提交
309 310 311
   * always set maxFileNum to 1
   * means client log filename is unique in windows
   */
S
slguan 已提交
312 313 314
  maxFileNum = 1;
#endif

S
Shengliang Guan 已提交
315 316 317
  char    name[LOG_FILE_NAME_LEN + 50] = "\0";
  int32_t logstat0_mtime, logstat1_mtime;
  int32_t size;
H
hzcheng 已提交
318

S
slguan 已提交
319 320
  tsLogObj.maxLines = maxLines;
  tsLogObj.fileNum = maxFileNum;
H
hzcheng 已提交
321 322
  taosGetLogFileName(fn);

H
Hui Li 已提交
323 324 325 326
  if (strlen(fn) < LOG_FILE_NAME_LEN + 50 - 2) {
    strcpy(name, fn);
    strcat(name, ".0");
  }
S
Shengliang Guan 已提交
327
  bool log0Exist = taosStatFile(name, NULL, &logstat0_mtime) >= 0;
H
hzcheng 已提交
328

S
TD-1263  
Shengliang Guan 已提交
329 330 331 332
  if (strlen(fn) < LOG_FILE_NAME_LEN + 50 - 2) {
    strcpy(name, fn);
    strcat(name, ".1");
  }
S
Shengliang Guan 已提交
333 334
  bool log1Exist = taosStatFile(name, NULL, &logstat1_mtime) >= 0;

H
hzcheng 已提交
335
  // if none of the log files exist, open 0, if both exists, open the old one
S
TD-1263  
Shengliang Guan 已提交
336 337 338
  if (!log0Exist && !log1Exist) {
    tsLogObj.flag = 0;
  } else if (!log1Exist) {
S
slguan 已提交
339
    tsLogObj.flag = 0;
S
TD-1263  
Shengliang Guan 已提交
340 341
  } else if (!log0Exist) {
    tsLogObj.flag = 1;
H
hzcheng 已提交
342
  } else {
S
Shengliang Guan 已提交
343
    tsLogObj.flag = (logstat0_mtime > logstat1_mtime) ? 0 : 1;
H
hzcheng 已提交
344 345
  }

H
Hui Li 已提交
346 347
  char fileName[LOG_FILE_NAME_LEN + 50] = "\0";
  sprintf(fileName, "%s.%d", tsLogObj.logName, tsLogObj.flag);
wafwerar's avatar
wafwerar 已提交
348
  taosThreadMutexInit(&tsLogObj.logMutex, NULL);
H
hzcheng 已提交
349

S
Shengliang Guan 已提交
350
  taosUmaskFile(0);
351
  tsLogObj.logHandle->pFile = taosOpenFile(fileName, TD_FILE_CTEATE | TD_FILE_WRITE);
H
hzcheng 已提交
352

353
  if (tsLogObj.logHandle->pFile == NULL) {
H
Hui Li 已提交
354
    printf("\nfailed to open log file:%s, reason:%s\n", fileName, strerror(errno));
H
hzcheng 已提交
355 356
    return -1;
  }
357
  taosLockLogFile(tsLogObj.logHandle->pFile);
H
hzcheng 已提交
358 359

  // only an estimate for number of lines
S
Shengliang Guan 已提交
360
  int64_t filesize = 0;
361
  if (taosFStatFile(tsLogObj.logHandle->pFile, &filesize, NULL) < 0) {
H
Hui Li 已提交
362
    printf("\nfailed to fstat log file:%s, reason:%s\n", fileName, strerror(errno));
H
Hui Li 已提交
363 364
    return -1;
  }
S
Shengliang Guan 已提交
365
  size = (int32_t)filesize;
S
slguan 已提交
366
  tsLogObj.lines = size / 60;
H
hzcheng 已提交
367

368
  taosLSeekFile(tsLogObj.logHandle->pFile, 0, SEEK_END);
H
hzcheng 已提交
369 370

  sprintf(name, "==================================================\n");
371
  taosWriteFile(tsLogObj.logHandle->pFile, name, (uint32_t)strlen(name));
H
hzcheng 已提交
372
  sprintf(name, "                new log file                      \n");
373
  taosWriteFile(tsLogObj.logHandle->pFile, name, (uint32_t)strlen(name));
H
hzcheng 已提交
374
  sprintf(name, "==================================================\n");
375
  taosWriteFile(tsLogObj.logHandle->pFile, name, (uint32_t)strlen(name));
H
hzcheng 已提交
376 377 378 379

  return 0;
}

380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399
static void taosUpdateLogNums(ELogLevel level) {
  switch (level) {
    case DEBUG_ERROR:
      atomic_add_fetch_64(&tsNumOfErrorLogs, 1);
      break;
    case DEBUG_INFO:
      atomic_add_fetch_64(&tsNumOfInfoLogs, 1);
      break;
    case DEBUG_DEBUG:
      atomic_add_fetch_64(&tsNumOfDebugLogs, 1);
      break;
    case DEBUG_DUMP:
    case DEBUG_TRACE:
      atomic_add_fetch_64(&tsNumOfTraceLogs, 1);
      break;
    default:
      break;
  }
}

S
Shengliang Guan 已提交
400
static inline int32_t taosBuildLogHead(char *buffer, const char *flags) {
H
hzcheng 已提交
401 402 403
  struct tm      Tm, *ptm;
  struct timeval timeSecs;

S
Shengliang Guan 已提交
404
  taosGetTimeOfDay(&timeSecs);
S
Shengliang Guan 已提交
405
  time_t curTime = timeSecs.tv_sec;
wafwerar's avatar
wafwerar 已提交
406
  ptm = taosLocalTime(&curTime, &Tm);
S
slguan 已提交
407

S
Shengliang Guan 已提交
408 409 410
  return sprintf(buffer, "%02d/%02d %02d:%02d:%02d.%06d %08" PRId64 " %s", ptm->tm_mon + 1, ptm->tm_mday, ptm->tm_hour,
                 ptm->tm_min, ptm->tm_sec, (int32_t)timeSecs.tv_usec, taosGetSelfPthreadId(), flags);
}
H
hzcheng 已提交
411

S
Shengliang Guan 已提交
412
static inline void taosPrintLogImp(ELogLevel level, int32_t dflag, const char *buffer, int32_t len) {
413
  if ((dflag & DEBUG_FILE) && tsLogObj.logHandle && tsLogObj.logHandle->pFile != NULL) {
414
    taosUpdateLogNums(level);
H
hzcheng 已提交
415
    if (tsAsyncLog) {
S
slguan 已提交
416
      taosPushLogBuffer(tsLogObj.logHandle, buffer, len);
H
hzcheng 已提交
417
    } else {
418
      taosWriteFile(tsLogObj.logHandle->pFile, buffer, len);
H
hzcheng 已提交
419 420
    }

S
slguan 已提交
421 422
    if (tsLogObj.maxLines > 0) {
      atomic_add_fetch_32(&tsLogObj.lines, 1);
S
Shengliang Guan 已提交
423 424 425
      if ((tsLogObj.lines > tsLogObj.maxLines) && (tsLogObj.openInProgress == 0)) {
        taosOpenNewLogFile();
      }
H
hzcheng 已提交
426 427 428
    }
  }

429 430 431
  if (dflag & DEBUG_SCREEN) {
    write(1, buffer, (uint32_t)len);
  }
H
hzcheng 已提交
432 433
}

S
Shengliang Guan 已提交
434
void taosPrintLog(const char *flags, ELogLevel level, int32_t dflag, const char *format, ...) {
S
os env  
Shengliang Guan 已提交
435
  if (!osLogSpaceAvailable()) return;
S
Shengliang Guan 已提交
436
  if (!(dflag & DEBUG_FILE) && !(dflag & DEBUG_SCREEN)) return;
S
slguan 已提交
437

S
Shengliang Guan 已提交
438 439
  char    buffer[LOG_MAX_LINE_BUFFER_SIZE];
  int32_t len = taosBuildLogHead(buffer, flags);
H
hzcheng 已提交
440

S
Shengliang Guan 已提交
441 442
  va_list argpointer;
  va_start(argpointer, format);
S
Shengliang Guan 已提交
443
  int32_t writeLen = len + vsnprintf(buffer + len, LOG_MAX_LINE_BUFFER_SIZE - len, format, argpointer);
S
Shengliang Guan 已提交
444
  va_end(argpointer);
H
hzcheng 已提交
445

S
Shengliang Guan 已提交
446 447 448
  if (writeLen > LOG_MAX_LINE_SIZE) writeLen = LOG_MAX_LINE_SIZE;
  buffer[writeLen++] = '\n';
  buffer[writeLen] = 0;
H
hzcheng 已提交
449

S
Shengliang Guan 已提交
450 451 452 453 454 455
  taosPrintLogImp(level, dflag, buffer, writeLen);

  if (tsLogFp && level <= DEBUG_INFO) {
    buffer[writeLen - 1] = 0;
    (*tsLogFp)(taosGetTimestampMs(), level, buffer + len);
  }
H
hzcheng 已提交
456 457
}

458
void taosPrintLongString(const char *flags, ELogLevel level, int32_t dflag, const char *format, ...) {
S
os env  
Shengliang Guan 已提交
459
  if (!osLogSpaceAvailable()) return;
S
Shengliang Guan 已提交
460
  if (!(dflag & DEBUG_FILE) && !(dflag & DEBUG_SCREEN)) return;
S
slguan 已提交
461

S
Shengliang Guan 已提交
462 463
  char    buffer[LOG_MAX_LINE_DUMP_BUFFER_SIZE];
  int32_t len = taosBuildLogHead(buffer, flags);
H
hzcheng 已提交
464

S
Shengliang Guan 已提交
465
  va_list argpointer;
H
hzcheng 已提交
466
  va_start(argpointer, format);
S
Shengliang Guan 已提交
467
  len += vsnprintf(buffer + len, LOG_MAX_LINE_DUMP_BUFFER_SIZE - len, format, argpointer);
H
hzcheng 已提交
468 469
  va_end(argpointer);

S
Shengliang Guan 已提交
470
  if (len > LOG_MAX_LINE_DUMP_SIZE) len = LOG_MAX_LINE_DUMP_SIZE;
H
hzcheng 已提交
471 472 473
  buffer[len++] = '\n';
  buffer[len] = 0;

S
Shengliang Guan 已提交
474 475
  taosPrintLogImp(level, dflag, buffer, len);
}
L
Liu Jicong 已提交
476

S
Shengliang Guan 已提交
477 478 479
void taosDumpData(unsigned char *msg, int32_t len) {
  if (!osLogSpaceAvailable()) return;
  taosUpdateLogNums(DEBUG_DUMP);
H
hzcheng 已提交
480

S
Shengliang Guan 已提交
481 482 483 484 485 486 487 488 489 490 491 492
  char    temp[256];
  int32_t i, pos = 0, c = 0;

  for (i = 0; i < len; ++i) {
    sprintf(temp + pos, "%02x ", msg[i]);
    c++;
    pos += 3;
    if (c >= 16) {
      temp[pos++] = '\n';
      taosWriteFile(tsLogObj.logHandle->pFile, temp, (uint32_t)pos);
      c = 0;
      pos = 0;
H
hzcheng 已提交
493 494 495
    }
  }

S
Shengliang Guan 已提交
496 497 498
  temp[pos++] = '\n';

  taosWriteFile(tsLogObj.logHandle->pFile, temp, (uint32_t)pos);
H
hzcheng 已提交
499 500
}

501 502 503 504
static void taosCloseLogByFd(TdFilePtr pFile) {
  if (pFile != NULL) {
    taosUnLockLogFile(pFile);
    taosCloseFile(&pFile);
H
hzcheng 已提交
505 506 507
  }
}

S
slguan 已提交
508
static SLogBuff *taosLogBuffNew(int32_t bufSize) {
H
hzcheng 已提交
509 510
  SLogBuff *tLogBuff = NULL;

wafwerar's avatar
wafwerar 已提交
511
  tLogBuff = taosMemoryCalloc(1, sizeof(SLogBuff));
H
hzcheng 已提交
512 513
  if (tLogBuff == NULL) return NULL;

wafwerar's avatar
wafwerar 已提交
514
  LOG_BUF_BUFFER(tLogBuff) = taosMemoryMalloc(bufSize);
H
hzcheng 已提交
515 516 517 518
  if (LOG_BUF_BUFFER(tLogBuff) == NULL) goto _err;

  LOG_BUF_START(tLogBuff) = LOG_BUF_END(tLogBuff) = 0;
  LOG_BUF_SIZE(tLogBuff) = bufSize;
D
fix bu  
dapan1121 已提交
519
  tLogBuff->minBuffSize = bufSize / 10;
H
hzcheng 已提交
520 521
  tLogBuff->stop = 0;

wafwerar's avatar
wafwerar 已提交
522
  if (taosThreadMutexInit(&LOG_BUF_MUTEX(tLogBuff), NULL) < 0) goto _err;
L
Liu Jicong 已提交
523
  // tsem_init(&(tLogBuff->buffNotEmpty), 0, 0);
H
hzcheng 已提交
524 525 526 527

  return tLogBuff;

_err:
wafwerar's avatar
wafwerar 已提交
528 529
  taosMemoryFreeClear(LOG_BUF_BUFFER(tLogBuff));
  taosMemoryFreeClear(tLogBuff);
H
hzcheng 已提交
530 531 532
  return NULL;
}

S
Shengliang Guan 已提交
533
static void taosCopyLogBuffer(SLogBuff *tLogBuff, int32_t start, int32_t end, const char *msg, int32_t msgLen) {
D
fix bug  
dapan1121 已提交
534 535 536 537 538 539 540 541 542 543 544 545 546
  if (start > end) {
    memcpy(LOG_BUF_BUFFER(tLogBuff) + end, msg, msgLen);
  } else {
    if (LOG_BUF_SIZE(tLogBuff) - end < msgLen) {
      memcpy(LOG_BUF_BUFFER(tLogBuff) + end, msg, LOG_BUF_SIZE(tLogBuff) - end);
      memcpy(LOG_BUF_BUFFER(tLogBuff), msg + LOG_BUF_SIZE(tLogBuff) - end, msgLen - LOG_BUF_SIZE(tLogBuff) + end);
    } else {
      memcpy(LOG_BUF_BUFFER(tLogBuff) + end, msg, msgLen);
    }
  }
  LOG_BUF_END(tLogBuff) = (LOG_BUF_END(tLogBuff) + msgLen) % LOG_BUF_SIZE(tLogBuff);
}

S
Shengliang Guan 已提交
547
static int32_t taosPushLogBuffer(SLogBuff *tLogBuff, const char *msg, int32_t msgLen) {
L
Liu Jicong 已提交
548 549 550
  int32_t        start = 0;
  int32_t        end = 0;
  int32_t        remainSize = 0;
D
fix bug  
dapan1121 已提交
551
  static int64_t lostLine = 0;
L
Liu Jicong 已提交
552 553
  char           tmpBuf[40] = {0};
  int32_t        tmpBufLen = 0;
H
hzcheng 已提交
554 555 556

  if (tLogBuff == NULL || tLogBuff->stop) return -1;

wafwerar's avatar
wafwerar 已提交
557
  taosThreadMutexLock(&LOG_BUF_MUTEX(tLogBuff));
H
hzcheng 已提交
558 559 560
  start = LOG_BUF_START(tLogBuff);
  end = LOG_BUF_END(tLogBuff);

D
fix bug  
dapan1121 已提交
561
  remainSize = (start > end) ? (start - end - 1) : (start + LOG_BUF_SIZE(tLogBuff) - end - 1);
H
hzcheng 已提交
562

D
fix bug  
dapan1121 已提交
563
  if (lostLine > 0) {
L
Liu Jicong 已提交
564
    sprintf(tmpBuf, "...Lost %" PRId64 " lines here...\n", lostLine);
D
dapan1121 已提交
565
    tmpBufLen = (int32_t)strlen(tmpBuf);
D
fix bug  
dapan1121 已提交
566 567 568 569
  }

  if (remainSize <= msgLen || ((lostLine > 0) && (remainSize <= (msgLen + tmpBufLen)))) {
    lostLine++;
S
Shengliang Guan 已提交
570
    tsAsyncLogLostLines++;
wafwerar's avatar
wafwerar 已提交
571
    taosThreadMutexUnlock(&LOG_BUF_MUTEX(tLogBuff));
H
hzcheng 已提交
572 573 574
    return -1;
  }

D
fix bug  
dapan1121 已提交
575 576 577
  if (lostLine > 0) {
    taosCopyLogBuffer(tLogBuff, start, end, tmpBuf, tmpBufLen);
    lostLine = 0;
H
hzcheng 已提交
578
  }
D
fix bug  
dapan1121 已提交
579 580

  taosCopyLogBuffer(tLogBuff, LOG_BUF_START(tLogBuff), LOG_BUF_END(tLogBuff), msg, msgLen);
H
hzcheng 已提交
581

L
Liu Jicong 已提交
582
  // int32_t w = atomic_sub_fetch_32(&waitLock, 1);
D
fix bug  
dapan1121 已提交
583
  /*
D
fix bug  
dapan1121 已提交
584 585
  if (w <= 0 || ((remainSize - msgLen - tmpBufLen) < (LOG_BUF_SIZE(tLogBuff) * 4 /5))) {
    tsem_post(&(tLogBuff->buffNotEmpty));
D
fix bug  
dapan1121 已提交
586 587 588
    dbgPostN++;
  } else {
    dbgNoPostN++;
D
fix bug  
dapan1121 已提交
589
  }
D
fix bug  
dapan1121 已提交
590
  */
H
hzcheng 已提交
591

wafwerar's avatar
wafwerar 已提交
592
  taosThreadMutexUnlock(&LOG_BUF_MUTEX(tLogBuff));
H
hzcheng 已提交
593 594 595 596

  return 0;
}

D
fix bu  
dapan1121 已提交
597
static int32_t taosGetLogRemainSize(SLogBuff *tLogBuff, int32_t start, int32_t end) {
D
fix bug  
dapan1121 已提交
598
  int32_t rSize = end - start;
H
hzcheng 已提交
599

D
fix bug  
dapan1121 已提交
600 601
  return rSize >= 0 ? rSize : LOG_BUF_SIZE(tLogBuff) + rSize;
}
H
hzcheng 已提交
602

D
fix bug  
dapan1121 已提交
603
static void taosWriteLog(SLogBuff *tLogBuff) {
D
fix bu  
dapan1121 已提交
604
  static int32_t lastDuration = 0;
L
Liu Jicong 已提交
605 606 607
  int32_t        remainChecked = 0;
  int32_t        start, end, pollSize;

D
fix bug  
dapan1121 已提交
608
  do {
D
fix bu  
dapan1121 已提交
609 610 611 612 613 614
    if (remainChecked == 0) {
      start = LOG_BUF_START(tLogBuff);
      end = LOG_BUF_END(tLogBuff);

      if (start == end) {
        dbgEmptyW++;
S
Shengliang Guan 已提交
615
        tsWriteInterval = LOG_MAX_INTERVAL;
D
fix bu  
dapan1121 已提交
616 617
        return;
      }
H
hzcheng 已提交
618

D
fix bu  
dapan1121 已提交
619 620
      pollSize = taosGetLogRemainSize(tLogBuff, start, end);
      if (pollSize < tLogBuff->minBuffSize) {
S
Shengliang Guan 已提交
621
        lastDuration += tsWriteInterval;
D
fix bug  
dapan1121 已提交
622
        if (lastDuration < LOG_MAX_WAIT_MSEC) {
D
fix bu  
dapan1121 已提交
623 624 625
          break;
        }
      }
D
fix bug  
dapan1121 已提交
626

D
fix bu  
dapan1121 已提交
627 628 629 630
      lastDuration = 0;
    }

    if (start < end) {
631
      taosWriteFile(tLogBuff->pFile, LOG_BUF_BUFFER(tLogBuff) + start, pollSize);
H
hzcheng 已提交
632
    } else {
L
Liu Jicong 已提交
633
      int32_t tsize = LOG_BUF_SIZE(tLogBuff) - start;
634
      taosWriteFile(tLogBuff->pFile, LOG_BUF_BUFFER(tLogBuff) + start, tsize);
D
fix bug  
dapan1121 已提交
635

636
      taosWriteFile(tLogBuff->pFile, LOG_BUF_BUFFER(tLogBuff), end);
H
hzcheng 已提交
637
    }
D
fix bug  
dapan1121 已提交
638 639

    dbgWN++;
L
Liu Jicong 已提交
640 641
    dbgWSize += pollSize;

D
fix bu  
dapan1121 已提交
642
    if (pollSize < tLogBuff->minBuffSize) {
D
fix bug  
dapan1121 已提交
643
      dbgSmallWN++;
S
Shengliang Guan 已提交
644 645
      if (tsWriteInterval < LOG_MAX_INTERVAL) {
        tsWriteInterval += LOG_INTERVAL_STEP;
D
fix bug  
dapan1121 已提交
646
      }
L
Liu Jicong 已提交
647
    } else if (pollSize > LOG_BUF_SIZE(tLogBuff) / 3) {
D
fix bug  
dapan1121 已提交
648
      dbgBigWN++;
S
Shengliang Guan 已提交
649
      tsWriteInterval = LOG_MIN_INTERVAL;
L
Liu Jicong 已提交
650
    } else if (pollSize > LOG_BUF_SIZE(tLogBuff) / 4) {
S
Shengliang Guan 已提交
651 652
      if (tsWriteInterval > LOG_MIN_INTERVAL) {
        tsWriteInterval -= LOG_INTERVAL_STEP;
D
fix bug  
dapan1121 已提交
653
      }
D
fix bug  
dapan1121 已提交
654 655 656 657
    }

    LOG_BUF_START(tLogBuff) = (LOG_BUF_START(tLogBuff) + pollSize) % LOG_BUF_SIZE(tLogBuff);

D
fix bu  
dapan1121 已提交
658 659 660
    start = LOG_BUF_START(tLogBuff);
    end = LOG_BUF_END(tLogBuff);

D
fix bug  
dapan1121 已提交
661
    pollSize = taosGetLogRemainSize(tLogBuff, start, end);
D
fix bu  
dapan1121 已提交
662
    if (pollSize < tLogBuff->minBuffSize) {
D
fix bug  
dapan1121 已提交
663 664 665
      break;
    }

S
Shengliang Guan 已提交
666
    tsWriteInterval = LOG_MIN_INTERVAL;
D
fix bu  
dapan1121 已提交
667 668

    remainChecked = 1;
L
Liu Jicong 已提交
669
  } while (1);
H
hzcheng 已提交
670 671
}

S
slguan 已提交
672
static void *taosAsyncOutputLog(void *param) {
H
hzcheng 已提交
673
  SLogBuff *tLogBuff = (SLogBuff *)param;
H
Haojun Liao 已提交
674
  setThreadName("log");
L
Liu Jicong 已提交
675

H
hzcheng 已提交
676
  while (1) {
S
Shengliang Guan 已提交
677
    taosMsleep(tsWriteInterval);
H
hzcheng 已提交
678 679

    // Polling the buffer
D
fix bug  
dapan1121 已提交
680
    taosWriteLog(tLogBuff);
H
hzcheng 已提交
681 682 683 684 685 686

    if (tLogBuff->stop) break;
  }

  return NULL;
}
S
Shengliang Guan 已提交
687 688 689 690 691

int32_t taosCompressFile(char *srcFileName, char *destFileName) {
  int32_t compressSize = 163840;
  int32_t ret = 0;
  int32_t len = 0;
wafwerar's avatar
wafwerar 已提交
692
  char   *data = taosMemoryMalloc(compressSize);
S
ulog  
Shengliang Guan 已提交
693
  //  gzFile  dstFp = NULL;
S
Shengliang Guan 已提交
694

695 696 697
  // srcFp = fopen(srcFileName, "r");
  TdFilePtr pSrcFile = taosOpenFile(srcFileName, TD_FILE_READ);
  if (pSrcFile == NULL) {
S
Shengliang Guan 已提交
698 699 700 701
    ret = -1;
    goto cmp_end;
  }

702 703
  TdFilePtr pFile = taosOpenFile(destFileName, TD_FILE_CTEATE | TD_FILE_WRITE | TD_FILE_TRUNC);
  if (pFile == NULL) {
S
Shengliang Guan 已提交
704 705 706 707
    ret = -2;
    goto cmp_end;
  }

S
ulog  
Shengliang Guan 已提交
708 709 710 711 712 713 714 715 716 717 718
  //  dstFp = gzdopen(fd, "wb6f");
  //  if (dstFp == NULL) {
  //    ret = -3;
  //    close(fd);
  //    goto cmp_end;
  //  }
  //
  //  while (!feof(srcFp)) {
  //    len = (int32_t)fread(data, 1, compressSize, srcFp);
  //    (void)gzwrite(dstFp, data, len);
  //  }
S
Shengliang Guan 已提交
719 720

cmp_end:
721 722
  if (pSrcFile) {
    taosCloseFile(&pSrcFile);
S
Shengliang Guan 已提交
723
  }
S
ulog  
Shengliang Guan 已提交
724 725 726
  //  if (dstFp) {
  //    gzclose(dstFp);
  //  }
wafwerar's avatar
wafwerar 已提交
727
  taosMemoryFree(data);
S
Shengliang Guan 已提交
728 729 730 731

  return ret;
}

S
Shengliang Guan 已提交
732 733
void taosSetAllDebugFlag(int32_t flag) {
  if (!(flag & DEBUG_TRACE || flag & DEBUG_DEBUG || flag & DEBUG_DUMP)) return;
S
Shengliang Guan 已提交
734 735

  dDebugFlag = flag;
S
Shengliang Guan 已提交
736 737
  vDebugFlag = flag;
  mDebugFlag = flag;
S
Shengliang Guan 已提交
738
  cDebugFlag = flag;
S
Shengliang Guan 已提交
739 740 741 742 743 744 745 746 747 748 749
  jniDebugFlag = flag;
  uDebugFlag = flag;
  rpcDebugFlag = flag;
  qDebugFlag = flag;
  wDebugFlag = flag;
  sDebugFlag = flag;
  tsdbDebugFlag = flag;
  tqDebugFlag = flag;
  fsDebugFlag = flag;

  uInfo("all debug flag are set to %d", flag);
L
temp  
Liu Jicong 已提交
750
}