Fix truncating last character in the StderrLogger (#12620)

Summary:
This PR fixes a bug in the StderrLogger that truncated the last character in the logline. The problem was that we provided an incorrect max size parameter into the vsnprintf function. The size didn't take into account the null byte that the function automatically adds.

Before fix
```
** File Read Latency Histogram By Level [default] **
2024/05/04-18:50:24.209304 4788 [/db_impl/db_impl.cc:498] Shutdown: canceling all background wor
2024/05/04-18:50:24.209598 4788 [/db_impl/db_impl.cc:692] Shutdown complet
```

After fix
```
** File Read Latency Histogram By Level [default] **

2024/05/04-18:51:19.814584 4d4d [/db_impl/db_impl.cc:498] Shutdown: canceling all background work
2024/05/04-18:51:19.815528 4d4d [/db_impl/db_impl.cc:692] Shutdown complete
```

Pull Request resolved: https://github.com/facebook/rocksdb/pull/12620

Test Plan:
tested on examples/simple_example.cc with StderrLogger
Fixes: https://github.com/facebook/rocksdb/issues/12576

Reviewed By: jaykorean

Differential Revision: D56972332

Pulled By: ajkr

fbshipit-source-id: 70405e8231ae6e90d24fe0b351bc8e749176bd15
This commit is contained in:
Patrik Valo 2024-05-06 08:53:06 -07:00 committed by Facebook GitHub Bot
parent 7bf6d4c9d5
commit 3fdc7243f3
1 changed files with 3 additions and 4 deletions

View File

@ -38,12 +38,12 @@ void StderrLogger::Logv(const char* format, va_list ap) {
va_list ap_copy;
va_copy(ap_copy, ap);
const size_t log_suffix_len = vsnprintf(nullptr, 0, format, ap_copy);
const size_t log_suffix_len = vsnprintf(nullptr, 0, format, ap_copy) + 1;
va_end(ap_copy);
// Allocate space for the context, log_prefix, and log itself
// Extra byte for null termination
size_t buf_len = ctx_len + log_prefix_len + log_suffix_len + 1;
size_t buf_len = ctx_len + log_prefix_len + log_suffix_len;
std::unique_ptr<char[]> buf(new char[buf_len]);
// If the logger was created without a prefix, the prefix is a nullptr
@ -55,8 +55,7 @@ void StderrLogger::Logv(const char* format, va_list ap) {
t.tm_year + 1900, t.tm_mon + 1, t.tm_mday, t.tm_hour, t.tm_min,
t.tm_sec, static_cast<int>(now_tv.tv_usec),
static_cast<long long unsigned int>(thread_id), prefix);
written += vsnprintf(buf.get() + written, log_suffix_len, format, ap);
buf[written] = '\0';
vsnprintf(buf.get() + written, log_suffix_len, format, ap);
fprintf(stderr, "%s%c", buf.get(), '\n');
}