Cancelación, apagado y terminación: tres conceptos que se suelen confundir

Fuentes: Cancelation Terminology

En programación concurrente conviven tres ideas distintas que conviene no mezclar: la cancelación síncrona, la cancelación asíncrona y el apagado graceful (graceful shutdown).

La cancelación síncrona es una estructura de control, a menudo implícita. Desenrolla la pila al disparar una excepción o devolver un error, y libera recursos mediante RAII, finally, with/try-with-resources o defer. Es la mecánica habitual del manejo de errores.

La cancelación asíncrona es un protocolo de comunicación entre dos partes: una solicita la cancelación y la otra debe confirmarla y detenerse. Aparece, por ejemplo, en un pool de hilos cuando se abandona una tarea de cifrado: hay que esperar a que termine el fragmento en curso sin desperdiciar ciclos ni liberar búferes que aún está usando la tarea. Otro caso es io_uring, donde el búfer enviado al kernel debe permanecer reservado hasta que termine la escritura. Esta forma de cancelación es frecuente en software concurrente y debe identificarse pronto porque condiciona la forma del código; en particular, en Rust es muy sencillo implementar la síncrona, pero la asíncrona está peor soportada.

El graceful shutdown es un patrón de aplicación de mayor nivel: al detener un servicio web se rechaza el ciclo de aceptación, pero se siguen atendiendo las conexiones existentes hasta que el cliente se desconecte, lo que permite actualizaciones progresivas sin caídas. Relacionado con esto está el software crash-only, que asume que el proceso puede recibir SIGKILL en cualquier momento; si se sobrevive a un corte de energía, el botón de Quit puede implementarse directamente como un suicidio, lo que simplifica el código y aumenta la cobertura de pruebas de escenarios de pérdida de energía.

TigerBeetle aporta ejemplos concretos: Grid.cancel ejecuta una cancelación asíncrona con callback, StateMachine.reset es síncrona, y Client.shutdown espera a las llamadas pendientes de io_uring antes de liberar recursos. El artículo también discute el problema de los fallos grises en sistemas distribuidos y la tolerancia a latencia de cola como alternativa más general.