--- a/contrib/drbd-outdate-peer/dopd.c 2007-12-21 16:32:27.000000000 +0100 +++ b/contrib/drbd-outdate-peer/dopd.c 2008-02-27 15:47:49.000000000 +0100 @@ -203,12 +203,13 @@ /* check_drbd_peer() * walk the nodes and return TRUE if peer is not this node and it exists. + * returns 0 -> notfound, 1 -> found , 5 -> found but dead */ -gboolean +int check_drbd_peer(const char *drbd_peer) { const char *node; - gboolean found = FALSE; + int found = FALSE; if (!strcmp(drbd_peer, node_name)) { cl_log(LOG_WARNING, "drbd peer node %s is me!\n", drbd_peer); return FALSE; @@ -219,21 +220,27 @@ cl_log(LOG_WARNING, "Cannot start node walk"); cl_log(LOG_WARNING, "REASON: %s", dopd_cluster_conn->llc_ops->errmsg(dopd_cluster_conn)); - return FALSE; + return 0; } while((node = dopd_cluster_conn->llc_ops->nextnode(dopd_cluster_conn)) != NULL) { const char *status = dopd_cluster_conn->llc_ops->node_status(dopd_cluster_conn, node); - if (!strcmp(status, "dead")) { + if (!strcmp(status, "dead") && strcmp(node, drbd_peer)) { cl_log(LOG_WARNING, "Cluster node: %s: status: %s", node, status); - return FALSE; + } + + if (!strcmp(status, "dead") && !strcmp(node, drbd_peer)) { + cl_log(LOG_WARNING, "Cluster node: %s: status: %s", + node, status); + found = 5; + break; } /* Look for the peer */ if (!strcmp("normal", dopd_cluster_conn->llc_ops->node_type(dopd_cluster_conn, node)) && !strcmp(node, drbd_peer)) { cl_log(LOG_DEBUG, "node %s found\n", node); - found = TRUE; + found = 1; break; } } @@ -242,8 +249,10 @@ cl_log(LOG_INFO, "REASON: %s", dopd_cluster_conn->llc_ops->errmsg(dopd_cluster_conn)); } - if (found == FALSE) + if (found == 0) cl_log(LOG_WARNING, "drbd peer %s was not found\n", drbd_peer); + if (found == 5) + cl_log(LOG_WARNING, "drbd peer %s is dead\n", drbd_peer); return found; } @@ -254,7 +263,7 @@ static gboolean outdater_callback(IPC_Channel *client, gpointer user_data) { - int lpc = 0; + int lpc = 0, rc = 0; HA_Message *msg = NULL; const char *drbd_peer = NULL; const char *drbd_resource = NULL; @@ -285,7 +294,8 @@ drbd_resource = ha_msg_value(msg, F_OUTDATER_RES); drbd_peer = ha_msg_value(msg, F_OUTDATER_PEER); - if (check_drbd_peer(drbd_peer)) { + rc = check_drbd_peer(drbd_peer); + if (rc == 1) { dopd_client_t *entry; pthread_mutex_lock(&conn_mutex); entry = g_hash_table_lookup(connections, @@ -307,8 +317,9 @@ pthread_mutex_unlock(&conn_mutex); } else { /* wrong peer was specified, - send return code 20 to the client */ - send_to_client(curr_client, "20"); + send return code 20 to the client, + or dead peer was specified, then returns 5 */ + send_to_client(curr_client, rc == 0 ? "20" : "5" ); } ha_msg_del(msg);