¡Es navidad (en la CPU)!

Durante los últimos días se han producido un par de cambios críticos en deMartina de los cuales soy responsable. A saber:

  • Sistema embellecedor de URLs a medida con distribución de carga inteligente a nuestros CDN, theming para los widgets de página, caché por página, etc.
  • Sistema de creación, nombramiento, thumbnailing y distribución de imágenes de producto.

Se trata de un sistemas muy complejos. En principio funcionaban bien. Sin embargo, tras un refactoring sin una batería de tests en la que apoyarse, introduje un bug que consiguió poner a prueba la capacidad de nuestro servidor.

¿Navidades en Junio?

Dado que somos una tienda de juguetes, nuestra máxima actividad en la CPU del servidor se encuentra entre los meses de noviembre y diciembre. Sin embargo, durante la semana pasada fue superada con creces.

Una función encargada de generar identificadores únicos de página para la caché estaba funcionando incorrectamente y siempre devolvía el mismo identificador.

/**
 * Devuelve la firma de una página, con una URL semicanonicalizada. 
 * Si se llama sin parámetros, se utiliza el contexto actual.
 */
 public static function getPageDigest($page = '', $parameters = '', $b_use_prefix = true) 
 {
  // Calcular prefix
  $s_prefix = $b_use_prefix?self::getCurrentPoorsManPseudoCanonicalRelativeUrl():'';
  // Cuidado al modificar esta funcion...
  $s_url = self::getPoorsManPseudoCanonicalRelativeUrl($page, $parameters);
  return sha1("$s_prefix@$s_url");
 }

Pues en la variable $b_use_prefix = true, introducida durante la refactorización, se puso a false. Por lo tanto siempre se estaba devolviendo el mismo identificador de página y cada vez que una página accedía a consultar la caché de urls, se traía unos 400.000 registros, sobrecargando al servidor innecesariamente con cada petición a la página. Me queda así claro que los parámetros por defecto son peligrosos…

tl;dr Nunca introduzcáis parámetros por defecto cuando refactoriceis si no tenéis una batería de tests lo suficientemente extensa.

Anuncios
¡Es navidad (en la CPU)!

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s