Re: Como eliminar bloqueos

From: Alvaro Herrera <alvherre(at)commandprompt(dot)com>
To: Sebastián Villalba <sebastian(at)fcm(dot)unc(dot)edu(dot)ar>
Cc: Jaime Casanova <systemguards(at)gmail(dot)com>, jlcambero <jlcambero(at)emergya(dot)es>, pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Como eliminar bloqueos
Date: 2007-05-23 14:04:32
Message-ID: 20070523140432.GG4642@alvh.no-ip.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Sebastián Villalba escribió:
> Hola Jaime...
>
> On Tue, 22 May 2007 22:47:05 -0500, Jaime Casanova wrote
> > > SELECT procpid FROM pg_stat_activity WHERE datname = 'tuBaseDatos';
> > >
> > ok, hasta aqui... pero no hagas kill mejor usa pg_cancel_backend(pid
> > int)
>
> Seguramente es mejor utilizar éste comando provisto por PostgreSQL. No
> obstante me surgió una duda. Viendo la documentación(1) ví que
> "pg_cancel_backend" envía una señal SIGINT, mientras que yo sugerí un "simple
> kill" con lo que cual se le enviaría un SIGTERM al proceso. Deduzco según la
> diferencia que encontré en internet(2) entre el SIGINT y SIGTERM que sería
> mejor para el proceso recibir un SIGTERM, ya que éste último le dá la
> posibilidad de que finalice al proceso en lugar de interrumpirlo.

Eso podria ser cierto con el manejo de señales en general(*), pero en
Postgres las señales son manejadas de formas lo más inteligentes
posible. SIGINT se usa para cancelar una consulta que está en
ejecución, y es totalmente "seguro". En cambio SIGTERM se diseñó
inicialmente como una señal que se le manda a todos los procesos cuando
se está bajando el servicio, de manera que la intención era que ningún
proceso iba a seguir corriendo, todos iban a salir.

Por lo tanto hay un cierto recelo de parte de Tom Lane de que puede
ocurrir que si un backend recibe SIGTERM en un momento inapropiado,
puede salir sin liberar todos los recursos (se liberarían sin problemas
si terminaran todos los backends, pero como el resto continúa
funcionando no hay modo de asegurar que esto suceda). De hecho hace
poco se corrigió un bug de este tipo.

(*) Sin embargo yo creo que estás equivocado, puesto que SIGINT
generalmente es capturado por la aplicacion de forma robusta igual que
SIGTERM (o debería serlo; y cuando no lo es, es un bug). La señal que
deja al proceso sin la posibilidad de salir limpiamente y cerrar los
recursos es SIGKILL. Ésta es la señal que no debe ser usada, a menos
que se trate de un caso muy muy extremo.

--
Alvaro Herrera http://www.CommandPrompt.com/
The PostgreSQL Company - Command Prompt, Inc.

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Robert J. Briones C. 2007-05-23 14:05:41 Re: cantidad de tablas VS. tamaño de tablas
Previous Message Miguel Bernilla Sánchez 2007-05-23 13:52:47 Re: [pgsql-es-ayuda] cantidad de tablas VS. tamaño de tablas