Status Server::autoResizeBlockAndSST()

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();
}