in src/server/server.cc [1476:1559]
Status Server::autoResizeBlockAndSST() {
auto total_size = storage->GetTotalSize(kDefaultNamespace);
uint64_t total_keys = 0, estimate_keys = 0;
for (const auto &cf_handle : *storage->GetCFHandles()) {
storage->GetDB()->GetIntProperty(cf_handle, "rocksdb.estimate-num-keys", &estimate_keys);
total_keys += estimate_keys;
}
if (total_size == 0 || total_keys == 0) {
return Status::OK();
}
auto average_kv_size = total_size / total_keys;
int target_file_size_base = 0;
int block_size = 0;
if (average_kv_size > 512 * KiB) {
target_file_size_base = 1024;
block_size = 1 * MiB;
} else if (average_kv_size > 256 * KiB) {
target_file_size_base = 512;
block_size = 512 * KiB;
} else if (average_kv_size > 32 * KiB) {
target_file_size_base = 256;
block_size = 256 * KiB;
} else if (average_kv_size > 1 * KiB) {
target_file_size_base = 128;
block_size = 32 * KiB;
} else if (average_kv_size > 128) {
target_file_size_base = 64;
block_size = 8 * KiB;
} else {
target_file_size_base = 16;
block_size = 2 * KiB;
}
if (target_file_size_base == config_->rocks_db.target_file_size_base &&
target_file_size_base == config_->rocks_db.write_buffer_size && block_size == config_->rocks_db.block_size) {
return Status::OK();
}
if (target_file_size_base != config_->rocks_db.target_file_size_base) {
auto old_target_file_size_base = config_->rocks_db.target_file_size_base;
auto s = config_->Set(this, "rocksdb.target_file_size_base", std::to_string(target_file_size_base));
info(
"[server] Resize rocksdb.target_file_size_base from {} to {}, "
"average_kv_size: {}, total_size: {}, total_keys: {}, result: {}",
old_target_file_size_base, target_file_size_base, average_kv_size, total_size, total_keys, s.Msg());
if (!s.IsOK()) {
return s;
}
}
if (target_file_size_base != config_->rocks_db.write_buffer_size) {
auto old_write_buffer_size = config_->rocks_db.write_buffer_size;
auto s = config_->Set(this, "rocksdb.write_buffer_size", std::to_string(target_file_size_base));
info(
"[server] Resize rocksdb.write_buffer_size from {} to {}, "
"average_kv_size: {}, total_size: {}, "
"total_keys: {}, result: {}",
old_write_buffer_size, target_file_size_base, average_kv_size, total_size, total_keys, s.Msg());
if (!s.IsOK()) {
return s;
}
}
if (block_size != config_->rocks_db.block_size) {
auto s = storage->SetOptionForAllColumnFamilies("table_factory.block_size", std::to_string(block_size));
info(
"[server] Resize rocksdb.block_size from {} to {}, "
"average_kv_size: {}, total_size: {}, "
"total_keys: {}, result: {}",
config_->rocks_db.block_size, block_size, average_kv_size, total_size, total_keys, s.Msg());
if (!s.IsOK()) {
return s;
}
config_->rocks_db.block_size = block_size;
}
auto s = config_->Rewrite(namespace_.List());
info("[server] Rewrite config, result: {}", s.Msg());
return Status::OK();
}