Skip to content

Commit cdaf44f

Browse files
committed
Enlarge log size cap when printing file summary
Summary: Now the file summary is too small for printing. Enlarge it. To enable it, allow to pass a size to log buffer. Test Plan: Add a unit test. make all check Reviewers: ljin, yhchiang Reviewed By: yhchiang Subscribers: leveldb Differential Revision: https://reviews.facebook.net/D21723
1 parent 7cc1ed7 commit cdaf44f

File tree

5 files changed

+61
-10
lines changed

5 files changed

+61
-10
lines changed

db/compaction_picker.cc

+1-1
Original file line numberDiff line numberDiff line change
@@ -575,7 +575,7 @@ Compaction* UniversalCompactionPicker::PickCompaction(Version* version,
575575
return nullptr;
576576
}
577577
Version::FileSummaryStorage tmp;
578-
LogToBuffer(log_buffer, "[%s] Universal: candidate files(%zu): %s\n",
578+
LogToBuffer(log_buffer, 3072, "[%s] Universal: candidate files(%zu): %s\n",
579579
version->cfd_->GetName().c_str(), version->files_[level].size(),
580580
version->LevelFileSummary(&tmp, 0));
581581

db/version_set.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -183,10 +183,10 @@ class Version {
183183
// Return a human-readable short (single-line) summary of the number
184184
// of files per level. Uses *scratch as backing store.
185185
struct LevelSummaryStorage {
186-
char buffer[100];
186+
char buffer[1000];
187187
};
188188
struct FileSummaryStorage {
189-
char buffer[1000];
189+
char buffer[3000];
190190
};
191191
const char* LevelSummary(LevelSummaryStorage* scratch) const;
192192
// Return a human-readable short (single-line) summary of files

util/env_test.cc

+35
Original file line numberDiff line numberDiff line change
@@ -768,6 +768,41 @@ TEST(EnvPosixTest, LogBufferTest) {
768768
ASSERT_EQ(10, test_logger.char_x_count);
769769
}
770770

771+
class TestLogger2 : public Logger {
772+
public:
773+
explicit TestLogger2(size_t max_log_size) : max_log_size_(max_log_size) {}
774+
virtual void Logv(const char* format, va_list ap) override {
775+
char new_format[2000];
776+
std::fill_n(new_format, sizeof(new_format), '2');
777+
{
778+
va_list backup_ap;
779+
va_copy(backup_ap, ap);
780+
int n = vsnprintf(new_format, sizeof(new_format) - 1, format, backup_ap);
781+
// 48 bytes for extra information + bytes allocated
782+
ASSERT_TRUE(
783+
n <= 48 + static_cast<int>(max_log_size_ - sizeof(struct timeval)));
784+
ASSERT_TRUE(n > static_cast<int>(max_log_size_ - sizeof(struct timeval)));
785+
va_end(backup_ap);
786+
}
787+
}
788+
size_t max_log_size_;
789+
};
790+
791+
TEST(EnvPosixTest, LogBufferMaxSizeTest) {
792+
char bytes9000[9000];
793+
std::fill_n(bytes9000, sizeof(bytes9000), '1');
794+
bytes9000[sizeof(bytes9000) - 1] = '\0';
795+
796+
for (size_t max_log_size = 256; max_log_size <= 1024;
797+
max_log_size += 1024 - 256) {
798+
TestLogger2 test_logger(max_log_size);
799+
test_logger.SetInfoLogLevel(InfoLogLevel::INFO_LEVEL);
800+
LogBuffer log_buffer(InfoLogLevel::INFO_LEVEL, &test_logger);
801+
LogToBuffer(&log_buffer, max_log_size, "%s", bytes9000);
802+
log_buffer.FlushBufferToLog();
803+
}
804+
}
805+
771806
} // namespace rocksdb
772807

773808
int main(int argc, char** argv) {

util/log_buffer.cc

+16-5
Original file line numberDiff line numberDiff line change
@@ -13,17 +13,17 @@ LogBuffer::LogBuffer(const InfoLogLevel log_level,
1313
Logger*info_log)
1414
: log_level_(log_level), info_log_(info_log) {}
1515

16-
void LogBuffer::AddLogToBuffer(const char* format, va_list ap) {
16+
void LogBuffer::AddLogToBuffer(size_t max_log_size, const char* format,
17+
va_list ap) {
1718
if (!info_log_ || log_level_ < info_log_->GetInfoLogLevel()) {
1819
// Skip the level because of its level.
1920
return;
2021
}
2122

22-
const size_t kLogSizeLimit = 512;
23-
char* alloc_mem = arena_.AllocateAligned(kLogSizeLimit);
23+
char* alloc_mem = arena_.AllocateAligned(max_log_size);
2424
BufferedLog* buffered_log = new (alloc_mem) BufferedLog();
2525
char* p = buffered_log->message;
26-
char* limit = alloc_mem + kLogSizeLimit - 1;
26+
char* limit = alloc_mem + max_log_size - 1;
2727

2828
// store the time
2929
gettimeofday(&(buffered_log->now_tv), nullptr);
@@ -61,11 +61,22 @@ void LogBuffer::FlushBufferToLog() {
6161
logs_.clear();
6262
}
6363

64+
void LogToBuffer(LogBuffer* log_buffer, size_t max_log_size, const char* format,
65+
...) {
66+
if (log_buffer != nullptr) {
67+
va_list ap;
68+
va_start(ap, format);
69+
log_buffer->AddLogToBuffer(max_log_size, format, ap);
70+
va_end(ap);
71+
}
72+
}
73+
6474
void LogToBuffer(LogBuffer* log_buffer, const char* format, ...) {
75+
const size_t kDefaultMaxLogSize = 512;
6576
if (log_buffer != nullptr) {
6677
va_list ap;
6778
va_start(ap, format);
68-
log_buffer->AddLogToBuffer(format, ap);
79+
log_buffer->AddLogToBuffer(kDefaultMaxLogSize, format, ap);
6980
va_end(ap);
7081
}
7182
}

util/log_buffer.h

+7-2
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,9 @@ class LogBuffer {
2121
// info_log: logger to write the logs to
2222
LogBuffer(const InfoLogLevel log_level, Logger* info_log);
2323

24-
// Add a log entry to the buffer.
25-
void AddLogToBuffer(const char* format, va_list ap);
24+
// Add a log entry to the buffer. Use default max_log_size.
25+
// max_log_size indicates maximize log size, including some metadata.
26+
void AddLogToBuffer(size_t max_log_size, const char* format, va_list ap);
2627

2728
size_t IsEmpty() const { return logs_.empty(); }
2829

@@ -44,6 +45,10 @@ class LogBuffer {
4445

4546
// Add log to the LogBuffer for a delayed info logging. It can be used when
4647
// we want to add some logs inside a mutex.
48+
// max_log_size indicates maximize log size, including some metadata.
49+
extern void LogToBuffer(LogBuffer* log_buffer, size_t max_log_size,
50+
const char* format, ...);
51+
// Same as previous function, but with default max log size.
4752
extern void LogToBuffer(LogBuffer* log_buffer, const char* format, ...);
4853

4954
} // namespace rocksdb

0 commit comments

Comments
 (0)