Acabamos de analizar el impacto de las caídas del servidor; observe ahora qué sucede cuando un cliente se cae después de causar una llamada a un procedimiento remoto. Una vez que el procedimiento servidor ha sido desencadenado, su proceso continúa en ejecución, aún cuando se ha caído su padre. Un servidor que está corriendo sin ningún proceso padre en espera se conoce con el nombre de huérfano.

Los huérfanos pueden causar problemas de varias maneras. Como mínimo, gastan ciclos de CPU y otros recursos. Además, pueden bloquear archivos y otros objetos, negando así el legítimo acceso por parte de otros procesos. Finalmente, si un cliente es rearrancado y comienza nuevamente todas las RPCs, los resultados devueltos por los huérfanos pueden causar confusión.

Se han descripto cuatro maneras de enfrentarse con los huérfanos. En la primera, llamada exterminio, cuando una máquina se recupera después de una caída, verifica si tenía alguna RPC en ejecución al tiempo de producirse la caída. Si así fuera, pide al servidor que mate cualquier proceso que se encuentre corriendo en su nombre. Para usar el algoritmo de exterminación, además del algoritmo propiamente dicho, es necesario que el stub cliente registre las RPCs antes de generarlas. Cuando las RPCs se completan, sus entradas se borran de los registros de RPCs pendientes. Por supuesto, los registros deben mantenerse de tal manera que sobrevivan a las caídas del procesador (por ejemplo, en un disco). Además, debe tenerse en cuenta que los huérfanos pueden a su vez hacer llamadas a procedimientos remotos creando así nuevos huérfanos. Por ello, el algoritmo de exterminio debe ejecutarse recursivamente para eliminar por completo toda la cadena.

La segunda manera de eliminar huérfanos es la expiración, una técnica en la que no se requiere ninguna registración. Cuando comienza una RPC, el servidor tiene una cierta cantidad de tiempo o quantum para completar la llamada. Si la llamada no se completa en el intervalo original, el stub servidor debe pedir al stub cliente una nueva cantidad de tiempo. Si la máquina cliente se ha caído o ha sido rearrancada, este evento será detectado debido a la falta de renovación del temporizador y, en consecuencia, el servidor podrá acabar el proceso. Cuando se utiliza la expiración, todo lo que un cliente tiene que hacer para una operación confiable es estar seguro que ha transcurrido un quantum desde la última caída antes de emitir la primera RPC.

La tercera técnica para librarse de los huérfanos se conoce como reencarnación. Puede suceder que la exterminación falle en la eliminación de todos los huérfanos. Por ejemplo, si la red está partida cuando se ejecuta el algoritmo de exterminio, algunos huérfanos pueden ser inalcanzables. En este caso, puede tomarse alguna iniciativa drástica que mate toda la actividad remota dentro de la red. En este método, el tiempo se divide en épocas numeradas secuencialmente. Cuando después de su recuperación, un cliente falla en el exterminio de sus huérfanos, difunde a todas las máquinas el comienzo de una nueva época y éstas reaccionan eliminando todos sus procesos servidores. Dado que todas las solicitudes y réplicas siempre contienen el número de la época en que fueron comenzados, cualquier respuesta que eventualmente regrese de los huérfanos tendrá un número de época obsoleto y de este modo será detectada. El método es efectivo pero no goza de buena popularidad dentro de los usuarios de la red.

La cuarta propuesta para eliminar los huérfanos es similar a la tercera pero con una política menos agresiva. La misma también usa épocas, pero en lugar de que cada máquina elimine toda actividad remota cuando se declara una nueva época, intenta ubicar al cliente que desencadenó el proceso servidor. Únicamente si ese cliente no pudo ser ubicado, se elimina el proceso servidor. Este algoritmo se llama reencarnación gentil.

A lo largo de esta discusión hemos asumido que tan pronto como se encuentre un huérfano, se lo puede eliminar. De hecho, el asunto es realmente más complejo. Un huérfano puede estar corriendo en una región crítica o haber acabado de bloquear algunos archivos. Bajo esas circunstancias, la eliminación de los huérfanos puede crear inconsistencias en las bases de datos y abrazos mortales en el sistema. Además, un huérfano puede haber planificado un trabajo futuro. Por ejemplo, un huérfano puede haber hecho una entrada en una cola de impresión o alguna otra acción ha ser tomada en el futuro. Aún cuando el huérfano en sí mismo sea eliminado, el trabajo encolado puede ser eventualmente ejecutado y deben preverse las implicancias del caso.

Jue, 19/10/2006 - 22:55