Coverage Report

Created: 2025-07-23 07:17

/src/rocksdb/logging/log_buffer.cc
Line
Count
Source (jump to first uncovered line)
1
//  Copyright (c) 2011-present, Facebook, Inc.  All rights reserved.
2
//  This source code is licensed under both the GPLv2 (found in the
3
//  COPYING file in the root directory) and Apache 2.0 License
4
//  (found in the LICENSE.Apache file in the root directory).
5
6
#include "logging/log_buffer.h"
7
8
#include "port/port.h"
9
#include "port/sys_time.h"
10
11
namespace ROCKSDB_NAMESPACE {
12
13
LogBuffer::LogBuffer(const InfoLogLevel log_level, Logger* info_log)
14
14.1k
    : log_level_(log_level), info_log_(info_log) {}
15
16
void LogBuffer::AddLogToBuffer(size_t max_log_size, const char* format,
17
46.7k
                               va_list ap) {
18
46.7k
  if (!info_log_ || log_level_ < info_log_->GetInfoLogLevel()) {
19
    // Skip the level because of its level.
20
0
    return;
21
0
  }
22
23
46.7k
  char* alloc_mem = arena_.AllocateAligned(max_log_size);
24
46.7k
  BufferedLog* buffered_log = new (alloc_mem) BufferedLog();
25
46.7k
  char* p = buffered_log->message;
26
46.7k
  char* limit = alloc_mem + max_log_size - 1;
27
28
  // store the time
29
46.7k
  port::GetTimeOfDay(&(buffered_log->now_tv), nullptr);
30
31
  // Print the message
32
46.7k
  if (p < limit) {
33
46.7k
    va_list backup_ap;
34
46.7k
    va_copy(backup_ap, ap);
35
46.7k
    auto n = vsnprintf(p, limit - p, format, backup_ap);
36
46.7k
#ifndef OS_WIN
37
    // MS reports -1 when the buffer is too short
38
46.7k
    assert(n >= 0);
39
46.7k
#endif
40
46.7k
    if (n > 0) {
41
46.7k
      p += n;
42
46.7k
    } else {
43
0
      p = limit;
44
0
    }
45
46.7k
    va_end(backup_ap);
46
46.7k
  }
47
48
46.7k
  if (p > limit) {
49
1.65k
    p = limit;
50
1.65k
  }
51
52
  // Add '\0' to the end
53
46.7k
  *p = '\0';
54
55
46.7k
  logs_.push_back(buffered_log);
56
46.7k
}
57
58
21.7k
void LogBuffer::FlushBufferToLog() {
59
46.7k
  for (BufferedLog* log : logs_) {
60
46.7k
    const time_t seconds = log->now_tv.tv_sec;
61
46.7k
    struct tm t;
62
46.7k
    if (port::LocalTimeR(&seconds, &t) != nullptr) {
63
46.7k
      Log(log_level_, info_log_,
64
46.7k
          "(Original Log Time %04d/%02d/%02d-%02d:%02d:%02d.%06d) %s",
65
46.7k
          t.tm_year + 1900, t.tm_mon + 1, t.tm_mday, t.tm_hour, t.tm_min,
66
46.7k
          t.tm_sec, static_cast<int>(log->now_tv.tv_usec), log->message);
67
46.7k
    }
68
46.7k
  }
69
21.7k
  logs_.clear();
70
21.7k
}
71
72
void LogToBuffer(LogBuffer* log_buffer, size_t max_log_size, const char* format,
73
11.2k
                 ...) {
74
11.2k
  if (log_buffer != nullptr) {
75
11.2k
    va_list ap;
76
11.2k
    va_start(ap, format);
77
11.2k
    log_buffer->AddLogToBuffer(max_log_size, format, ap);
78
11.2k
    va_end(ap);
79
11.2k
  }
80
11.2k
}
81
82
35.5k
void LogToBuffer(LogBuffer* log_buffer, const char* format, ...) {
83
35.5k
  if (log_buffer != nullptr) {
84
35.5k
    va_list ap;
85
35.5k
    va_start(ap, format);
86
35.5k
    log_buffer->AddLogToBuffer(LogBuffer::kDefaultMaxLogSize, format, ap);
87
35.5k
    va_end(ap);
88
35.5k
  }
89
35.5k
}
90
91
}  // namespace ROCKSDB_NAMESPACE