La función svc_probe() establece una conexión de zócalo simple al puerto especificado, mediante una llamada a scds_fm_tcp_connect(). Si falla la conexión, svc_probe() retorna un valor de 100 que indica que el fallo es total. Si la conexión es satisfactoria, pero falla la desconexión, svc_probe() devuelve un valor de 50, lo que indica un fallo parcial. Si la conexión y la desconexión son satisfactorias, svc_probe() devuelve un valor de 0, que indica que la operación ha sido satisfactoria.
El código de svc_probe() es el siguiente.
int svc_probe(scds_handle_t scds_handle, char *hostname, int port, int timeout) { int rc; hrtime_t t1, t2; int sock; char testcmd[2048]; int time_used, time_remaining; time_t connect_timeout; /* * analizar el servicio de datos mediante una conexión de zócalo al * puerto especificado en la propiedad port_list property del sistema * que sirve al servicio de datos de XFS. Si el servicio XFS que se ha * configurado para recibir en el puerto especificado responde a la * conexión, el análisis es satisfactorio. En caso contrario, esperar * durante un tiempo definido en la propiedad probe_timeout antes de * determinar que el análisis ha fallado. */ /* * Utilizar el porcentaje SVC_CONNECT_TIMEOUT_PCT de tiempo de * espera para conectarse al puerto */ connect_timeout = (SVC_CONNECT_TIMEOUT_PCT * timeout)/100; t1 = (hrtime_t)(gethrtime()/1E9); /* * el análisis realiza una conexión al nombre de sistema y puerto * especificados. La conexión tiene un 95% del valor real de probe_timeout. */ rc = scds_fm_tcp_connect(scds_handle, &sock, hostname, port, connect_timeout); if (rc) { scds_syslog(LOG_ERR, "No se ha podido conectar con el puerto <%d> " "del recurso <%s>.", port, scds_get_resource_name(scds_handle)); /* es un fallo total */ return (SCDS_PROBE_COMPLETE_FAILURE); } t2 = (hrtime_t)(gethrtime()/1E9); /* * Calcular el tiempo real que tardó en conectarse. Debe ser * menor o igual que connect_timeout, el tiempo asignado * para la conexión. Si la conexión utiliza todo el tiempo que se * le asigna, el valor restante de probe_timeout que se pasa a * esta función se utilizará como tiempo de desconexión. En * caso contrario, el tiempo restante de la llamada de conexión * se agregará también al tiempo de espera de desconexión. * */ time_used = (int)(t2 - t1); /* * Usar el tiempo restante (timeout - time_took_to_connect) * para la desconexión */ time_remaining = timeout - (int)time_used; /* * Si se ha usado todo el tiempo, utilice un tiempo de espera * reducido y no modificable para seguir intentando la desconexión. * Así se evitará la fuga de fd. */ if (time_remaining <= 0) { scds_syslog_debug(DBG_LEVEL_LOW, "svc_probe ha usado el tiempo total de espera de " "%d segundos durante la operación de conexión y ha" "sobrepasado el tiempo de espera en %d segundos." "Intentado desconectar con el tiempo de espera" " %d ", connect_timeout, abs(time_used), SVC_DISCONNECT_TIMEOUT_SECONDS); time_remaining = SVC_DISCONNECT_TIMEOUT_SECONDS; } /* * Devolver fallo parcial en caso de fallo de desconexión. * Motivo: la llamada de conexión es satisfactoria, lo que * significa que la aplicación está activa. Un fallo de * desconexión se puede producir debido a una aplicación * bloqueada o a una carga excesiva. * Si fuera este último caso, no declarar la aplicación * terminada devolviendo un fallo completo. En su lugar, * declararlo fallo parcial. Si la situación persiste, la llamada * de desconexión volverá a fallar y se reiniciará la aplicación. */ rc = scds_fm_tcp_disconnect(scds_handle, sock, time_remaining); if (rc != SCHA_ERR_NOERR) { scds_syslog(LOG_ERR, "No se ha podido desconectar el puerto %d del recurso %s.", port, scds_get_resource_name(scds_handle)); /* es un fallo parcial */ return (SCDS_PROBE_COMPLETE_FAILURE/2); } t2 = (hrtime_t)(gethrtime()/1E9); time_used = (int)(t2 - t1); time_remaining = timeout - time_used; /* * Si no queda tiempo, no realizar la prueba completa con * fsinfo. Devolver SCDS_PROBE_COMPLETE_FAILURE/2 * en su lugar. Así se asegurará que si el tiempo de espera * agotado persiste, se reiniciará el servidor. */ if (time_remaining <= 0) { scds_syslog(LOG_ERR, "Tiempo de espera de análisis agotado."); return (SCDS_PROBE_COMPLETE_FAILURE/2); } /* * La conexión y desconexión del puerto han sido satisfactorias. * Ejecutar la orden fsinfo para realizar una comprobación * completa del estado del servidor. * Redirigir stdout o la salida de fsinfo terminará en la consola. */ (void) sprintf(testcmd, "/usr/openwin/bin/fsinfo -server %s:%d > /dev/null", hostname, port); scds_syslog_debug(DBG_LEVEL_HIGH, "Comprobar el estado del servidor con %s.", testcmd); if (scds_timerun(scds_handle, testcmd, time_remaining, SIGKILL, &rc) != SCHA_ERR_NOERR || rc != 0) { scds_syslog(LOG_ERR, "No se ha podido comprobar el estado del servidor " "con la orden <%s>", testcmd); return (SCDS_PROBE_COMPLETE_FAILURE/2); } return (0); }
Al terminar, svc_probe() devuelve un valor de éxito (0), fallo parcial (50) o fallo total (100). El método xfnts_probe pasa este valor a scds_fm_action().