Cagadas en producción #HO

bornex

A veces, es mejor aprender a saber lo que no hay que hacer, y así de cierta forma se aprende a como hacer las cosas.

He creado este hilo para que todos vayamos exponiendo nuestras cagadas en producción, cual era el fallo y como se solucionó, a modo de anécdota.

Empiezo yo:

Hace poco (no mas de dos semanas) uno de los clientes principales de mi empresa, hizo una liquidación (tengo que decir que era la primera) de los ingresos. Cuando vio que los ingresos estaban muy por debajo de lo que la aplicación mostraba en el reporte de ventas empezó el panic attack. La aplicación lleva en producción alrededor de dos meses aproximadamente.

De pronto suena el teléfono, nos cuenta el problema y empezamos a ver que desde el panel del TPV hay pagos que ni siquiera existen en la aplicación, pagos de 1$, 0.2$ y cosas así.

A partir de aquí empieza lo bueno, nuestra integración del TPV (como casi todos los TPVs) necesita el valor de la cantidad a cobrar de forma entera y en formato cadena de texto, es decir, si vamos a cobrar 20$ al TPV le tiene que llegar un cobro de 2000.

Los valores de la BD (MySQL) vienen en formato NUMERIC de 2 decimales, y PHP los coge tal cual, y amigos y señores, si de la base de datos nos viene un valor de 20.00 PHP lo deja como 20, nuestra función lo pasa a string para pasarselo al TPV y al TPV llega un 20 como un castillo, es decir, 0.2 tienen que ser cobrados.

Usando la función number_format() de PHP solucionamos el problema, pero de nuevo y a los dos días, el cliente vuelve a llamar porque siguen apareciendo pagos extraños, nada mas y nada menos que los pagos mayores de 999$ todos están mal. Ya que nosotros estábamos haciendo un number_format a el punto, se nos había olvidado que cuando tenemos cantidades mayores de 1000, tenemos una puta coma que también debemos de formatear.

Al final, un pufo de unos 30 mil aproximadamente se ha cobrado este fallo, que se han tenido que recaudar gracias a la abogada y a los clientes que se habían aprovechado de este bug.

1
Ranthas

#1 Tirar un update sin where y dejar todo un padrón de IBI urbana bonificado al 100%.

Merkury

#1 Y quien hizo eso, sigue currando en la empresa? Eso no es una cagada en producción eh, es no haber testeado y de no saber bien lo que se esta haciendo.

12 1 respuesta
bornex

#3 Totalmente de acuerdo, pues realmente los que hicieron eso ya han salido de la empresa. Pero ha sido fixeado por los que estamos ahora.

1 respuesta
Merkury

#4 Es que macho, 30k de error... XD Eso no es un fallo en producción.

Un fallo en producción, es comentar la función que escupe el canonical tag de 2500 paginas (me paso hace tiempo ya) y darte cuenta a los dos dias XD.

1 respuesta
RaymaN

No he cometido muchas cagadas importantes en producción respecto a código, la más grave quizá es no haber intuido que la api de inicio de sesión de FB no siempre devuelve el email, provocando que algunos usuarios tuviesen el avatar de otra persona.

Eso sí, soy adicto a actualizar los servidores de producción sin prueba previa. Ayer mismo estuve 1h peleándome con mysql al pasar de 5.5 a 5.6 porque los logs que genera son infumables y en la 5.6 no se ignoran errores de variables de configuración. Suerte que no había fútbol y no había mucha gente xD

1 respuesta
bornex

#5 El caso es que el TPV estaba ya implementado cuando nosotros cogimos el proyecto. Creo que le error también fue por parte del cliente, que se puso a liquidar después de dos meses, cuando debería de hacerlo casi a diario, o incluso varias veces al día.

También tengo que decir que no usamos test de prueba, si no, que vamos con el extremme programming a diario, los requisitos cambian y las nuevas funcionalidades son como el pan de cada día.

1 respuesta
Merkury

#7 Extreme programing no incluye testing? Lo dudo mucho.

2 2 respuestas
bornex

#8 Pues si te digo la verdad ni puta idea. Solo soy un junior, jijiji

#6 Cambiar de versión de MySQL es jugarsela mucho eh!

1 respuesta
radykal

#8 Una de las bases del Extreme programing es precisamente el testing.

1 respuesta
D

Permitir a developers hacer un deploy un Viernes.

No volverá a ocurrir.

8 2 respuestas
RaymaN

#9 ya, también estuve un par de horas pasando de PHP 5.5 a 7 porque no comprobé si todas las extensiones que uso (redis, igbinary, twig...) eran compatibles y me tocó compilar versiones experimentales xD

1 respuesta
bornex

#10 No probamos nada, simplemente por el tiempo, los test se hacen a manopla.

#11 Esa regla la tenemos en mi empresa igual, nunca poner nada en producción ni los viernes, ni antes de irte xD.

#12 Ahí hemos caído todos tio

1 respuesta
D

#13 Lo siguen haciendo, pero ya me encargué, por escrito, de confirmar que en caso de que pete algo en producción, a mi no me vengan llorando.

cabron

#11

Eso me recuerda a una vez que me obligaron a desplegar una cosa súper urgente un viernes a las 6 de la tarde, me tiré una hora intentándolo y el despliegue no funcionaba de ninguna manera, y finalmente descubrimos que la máquina que hacía la build petaba por que se había quedado sin espacio para los logs y no había nadie de sistemas disponible para arreglarlo ¯_(ツ)_/¯

1 respuesta
D

#15 Bien hecho por el de sistemas.
Luego las alertas de madrugada no suenan a los developers :clint:

eXtreM3

El único que recuerdo así grave fue que modifiqué un parámetro de la API de las TPVs de nuestros clientes y crashearon unas 15 (las que consultaron ese método antes de que me diera cuenta, que fueron 2 minutos) xdd

Le dije a mi compañero de soporte: oops... me parece que te van a llamar en 3, 2, 1... ring ring! xD

1
babri

instalar una aplicación en yum y dar a actualizar se actulizó hasta el php y mysql y las aplicacion de la empresa eran taaaaaaaaaan antiguas que necesitaban php antiguo y me toco repasar toooooodos los proyectos 1 a 1 arreglando las funcionas y errores. 3 semanas de trabajo :O

2 respuestas
Troyer

Hacer apt-get upgrade en consola pensando que era mi consola local, me olvidé que me había conectado con ssh al servidor live, benditas snapshots automáticas.

#18 No era más fácil instalar las versiones antiguas de PHP y hacer un virtualhost para cada aplicación con su correspondiente versión de PHP? xD

1 respuesta
B

Cagada gorda gorda no recuerdo, pero más de una vez después de un deploy hemos tenido que volver atrás porque un mínimo cambio en cache/configuración de bd/etc colgaba el sistema. El asunto es que cuando tienes una aplicación con millones de visitas es imposible testear en local ese tipo de problemas.

1 respuesta
babri

#19 después de la cagada el jefe supremo dijo que ya arreglábamos y parcheamos todo que poner versiones anteriores es perder el tiempo XD oye yo soy un mandado jaaj

B

Cagadas mías:

  • Deployear un ejecutable originario de código en C++ con -O0 y -gstabs (info de debug). El ejecutable era encargado de realizar unos cálculos más bien jodidos y largos, y sin -O2 esa mierda tardaba 5 veces más, provocando un cuello de botella en un sistema más complejo, que a su vez retrasaba a otra gente, que a su vez...

  • Deployear una branch de development en lugar de la prod. El programa en cuestión emitía XMLs de resultados que se guardaban y procesaban en un sitio de terceros. La branch de development añadía información "de debug" extra tan útil como <cagada tipo="hostia tio que no lo he enchufao">, y etc. Por suerte esos XML no los miraba a mano ni cristo y el programa que los procesaba descartaba los fields que desconocía, así que creo que el único que se dio cuenta fui yo. Esa misma branch tenía comentada la línea que llamaba a la función de borrar el directorio de archivos temporales, colapsando el servidor en menos de un día.

  • Implementar una mierda de seguridad usando md5, deployearla... en 2015. Lo mejor es que sabía que está broken, y en toda la semana que dediqué a implementar esa mierda ni caí en la cuenta de lo que estaba haciendo. Fue muy subnormal.

3 respuestas
eXtreM3

#22 lo del md5 lo añadimos a la lista de "eso no es una cagada en producción".

Traber

#22 La palabra "deploy" es muy chula, pero "desplegar" no muerde xD.

Nosotros hicimos un FreeBSD personalizado para unas máquinas de almacenamiento masivo, tipo rack, de estas que tienen tropecientos discos cada una, con un monton de opciones como mapeado de discos en un interfaz web para cuando cascara uno saber cuál se había roto (posición física), cron de comprobación de los discos, sistema de alertas, etc...

Se compraron más máquinas para otro proyecto (que había que entregar en una semana) y al ir a instalar dicho sistema operativo, no reconocía la controladora de discos... Nos aparecía únicamente el disco de sistema. Resulta que las máquinas llevaban ahora otra controladora diferente, y tuvimos que correr para sacar lo mismo pero con FreeBSD 10, en lugar del 9.3, que sí que llevaba el driver. Que conste que antes intenté meter el driver como módulo del kernel, pero no hubo manera, así que tocó matar la mosca a cañonazos xD.

Otra fue que en un proyecto tenía que desplegarse un sistema para meter en una base de datos un montón de imágenes y a su vez integrar los metadatos en un sistema personalizado, y la idea fue hacer, ya que había un servidor web montado previamente, el script en PHP y desplegarlo allí. Cuando llego, veo primero que la versión de PHP del Apache (5.3) es diferente a la de consola de comandos (5.1), y luego que, por lo que sea, lanzando el PHP (5.3) desde consola no cargaba las mismas extensiones que el PHP de Apache... Total, que con un poco de disimulo tuve que compilar a mano en ese servidor dichas extensiones y, en cada comando de PHP, incluir a mano cada extensión que me faltaba... Un despropósito, pero salí del apuro mejor de lo que me esperaba (pensé que no salía de esa).

2 1 respuesta
bornex

#18 Dios que locura, nosotros hemos migrado de PHP 5.6 al 7 con pocos cambios gracias al señor!.

#20 Hablando de caches y de cuelgues, este fin de semana hemos tenido un problema bastante gordo con una consulta a base de datos que hacía un JOIN con una columna que no tenía ningún índice. MySQL no podía optimizarla y nos ponía los ocho núcleos al 100%.

#22 Nosotros seguimos usando md5 para algunas cosas :psyduck:

#24 Que purista, le pareces a un profesor que tenía, que nos daba con el remo por decir encriptar en vez de cifrar.

Por otro lado, no veas desarrollar el módulo en una semana!

pineda

la más gorda que recuerdo es apuntar el motor de cálculo a la base de datos de producción en entorno de preproducción, lo que hizo decenas o cientos de ventas de test en prod. Los números de la empresa se dispararon, habíamos multiplicado por 50 la facturación diaria... pero no

Estabamos en pleno desarrollo de este nuevo motor y había creado un script para probar si funcionaba. Almenos lo hice bien y todas esas ventas se pudieron cancelar con el mismo script, así que solo fue un susto

Saphyel

para los de symfony... poner en el /app_dev.php solo admitir lo que vengan de 192.168 / 10.0 cuando tienes un balanceador local...

cagadas mias no recuerdo, aunque seguramente se puedan contar con miles...

RaCe

mandar accidentalmente newsletter a todo los clientes ignorando si la habían aceptado o no + que un cliente al ver el newsletter no autorizado le ponga una denuncia a la empresa xD

TOP 10/10

2 3 respuestas
babri

#28 eres un grande!! que pasó al final? xD

1 respuesta
Amazon

#28 me interesa saber lo de la denuncia, porque a lo mejor debo denunciar yo a una empresa que me mandó un newsletter sin mi consentimiento xD