YugabyteDB (2.13.0.0-b42, bfc6a6643e7399ac8a0e81d06a3ee6d6571b33ab)

Coverage Report

Created: 2022-03-09 17:30

/Users/deen/code/yugabyte-db/src/yb/rocksutil/yb_rocksdb_logger.cc
Line
Count
Source (jump to first uncovered line)
1
// Copyright (c) YugaByte, Inc.
2
//
3
// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
4
// in compliance with the License.  You may obtain a copy of the License at
5
//
6
// http://www.apache.org/licenses/LICENSE-2.0
7
//
8
// Unless required by applicable law or agreed to in writing, software distributed under the License
9
// is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
10
// or implied.  See the License for the specific language governing permissions and limitations
11
// under the License.
12
//
13
14
#include "yb/rocksutil/yb_rocksdb_logger.h"
15
16
#include <stdarg.h>
17
18
#include <glog/logging.h>
19
20
using rocksdb::InfoLogLevel;
21
22
namespace yb {
23
24
void YBRocksDBLogger::Logv(const rocksdb::InfoLogLevel log_level,
25
                                      const char *format,
26
0
                                      va_list ap) {
27
0
  LogvWithContext(__FILE__, __LINE__, log_level, format, ap);
28
0
}
29
30
void YBRocksDBLogger::LogvWithContext(const char* file,
31
    const int line,
32
    const rocksdb::InfoLogLevel log_level,
33
    const char* format,
34
3.65M
    va_list ap) {
35
  // We try first to use 1024-bytes buffer on stack and then dynamically allocated buffer of larger
36
  // size.
37
3.65M
  static constexpr size_t kInitialBufferSize = 1024;
38
3.65M
  static const size_t kMaxBufferSize = google::LogMessage::kMaxLogMessageLen;
39
40
3.65M
  char initial_buffer[kInitialBufferSize];
41
3.65M
  std::unique_ptr<char[]> dynamic_buffer;
42
3.65M
  char* buffer = initial_buffer;
43
44
3.65M
  auto print = [&buffer, &ap, &format](size_t buffer_size) -> size_t {
45
3.65M
    va_list backup_ap;
46
3.65M
    va_copy(backup_ap, ap);
47
3.65M
    const size_t size = vsnprintf(buffer, buffer_size, format, backup_ap);
48
3.65M
    va_end(backup_ap);
49
3.65M
    return size;
50
3.65M
  };
51
52
3.65M
  const size_t required_buffer_size = print(kInitialBufferSize) + 1;
53
3.65M
  if (required_buffer_size > kInitialBufferSize) {
54
2.00k
    const size_t buffer_size = std::min(required_buffer_size, kMaxBufferSize);
55
2.00k
    dynamic_buffer.reset(buffer = new char[buffer_size]);
56
2.00k
    print(buffer_size);
57
2.00k
  }
58
59
3.65M
  google::LogMessage(file, line, YBRocksDBLogger::ConvertToGLogLevel(log_level)).stream()
60
3.65M
      << prefix_ << buffer;
61
3.65M
}
62
63
3.65M
int YBRocksDBLogger::ConvertToGLogLevel(const rocksdb::InfoLogLevel rocksdb_log_level) {
64
3.65M
  switch (rocksdb_log_level) {
65
249k
    case InfoLogLevel::DEBUG_LEVEL:
66
3.65M
    case InfoLogLevel::INFO_LEVEL:
67
3.65M
    case InfoLogLevel::HEADER_LEVEL:
68
      // GLOG doesn't have separate levels for DEBUG or HEADER. Default those to INFO also.
69
3.65M
      return google::GLOG_INFO;
70
2.07k
    case InfoLogLevel::WARN_LEVEL:
71
2.07k
      return google::GLOG_WARNING;
72
4
    case InfoLogLevel::ERROR_LEVEL:
73
4
      return google::GLOG_ERROR;
74
0
    case InfoLogLevel::FATAL_LEVEL:
75
0
      return google::GLOG_FATAL;
76
0
    default:
77
0
      LOG(FATAL) << "Unknown rocksdb log level: " << rocksdb_log_level;
78
3.65M
  }
79
3.65M
}
80
81
430k
rocksdb::InfoLogLevel YBRocksDBLogger::ConvertToRocksDBLogLevel(const int glog_level) {
82
430k
  switch (glog_level) {
83
430k
    case google::GLOG_INFO:
84
430k
      return InfoLogLevel::INFO_LEVEL;
85
0
    case google::GLOG_WARNING:
86
0
      return InfoLogLevel::WARN_LEVEL;
87
0
    case google::GLOG_ERROR:
88
0
      return InfoLogLevel::ERROR_LEVEL;
89
0
    case google::GLOG_FATAL:
90
0
      return InfoLogLevel::FATAL_LEVEL;
91
0
    default:
92
0
      LOG(FATAL) << "Unknown glog level: " << glog_level;
93
430k
  }
94
430k
}
95
96
} //  namespace yb