Просмотр исходного кода

Qdevice: Do not call cmap_dispatch in sync

When corosync is during sync operation cmap_dispatch blocks.

Signed-off-by: Jan Friesse <jfriesse@redhat.com>
Jan Friesse 9 лет назад
Родитель
Сommit
5afcf3116a

+ 7 - 0
qdevices/qdevice-cmap.c

@@ -446,6 +446,13 @@ qdevice_cmap_dispatch(struct qdevice_instance *instance)
 {
 	cs_error_t res;
 
+	/*
+	 * dispatch can block if corosync is during sync phase
+	 */
+	if (instance->sync_in_progress) {
+		return (0);
+	}
+
 	res = cmap_dispatch(instance->cmap_handle, CS_DISPATCH_ALL);
 
 	if (res != CS_OK && res != CS_ERR_TRY_AGAIN) {

+ 2 - 0
qdevices/qdevice-instance.h

@@ -103,6 +103,8 @@ struct qdevice_instance {
 	void *model_data;
 
 	const struct qdevice_advanced_settings *advanced_settings;
+
+	int sync_in_progress;
 };
 
 extern int	qdevice_instance_init(struct qdevice_instance *instance,

+ 15 - 13
qdevices/qdevice-net-poll.c

@@ -181,28 +181,30 @@ qdevice_net_pr_poll_array_create(struct qdevice_net_instance *instance)
 	poll_array = &instance->poll_array;
 	ipc_client_list = &instance->qdevice_instance_ptr->local_ipc.clients;
 
-	pr_poll_array_clean(poll_array);
+	if (qdevice_ipc_is_closed(instance->qdevice_instance_ptr)) {
+		qdevice_log(LOG_DEBUG, "Local socket is closed");
+		instance->schedule_disconnect = 1;
+		instance->disconnect_reason = QDEVICE_NET_DISCONNECT_REASON_LOCAL_SOCKET_CLOSED;
 
-	if (pr_poll_array_add(poll_array, &poll_desc, (void **)&user_data) < 0) {
 		return (NULL);
 	}
-	poll_desc->fd = instance->votequorum_poll_fd;
-	poll_desc->in_flags = PR_POLL_READ;
-	user_data->type = QDEVICE_NET_POLL_ARRAY_USER_DATA_TYPE_VOTEQUORUM;
+
+	pr_poll_array_clean(poll_array);
 
 	if (pr_poll_array_add(poll_array, &poll_desc, (void **)&user_data) < 0) {
 		return (NULL);
 	}
-	poll_desc->fd = instance->cmap_poll_fd;
+	poll_desc->fd = instance->votequorum_poll_fd;
 	poll_desc->in_flags = PR_POLL_READ;
-	user_data->type = QDEVICE_NET_POLL_ARRAY_USER_DATA_TYPE_CMAP;
-
-	if (qdevice_ipc_is_closed(instance->qdevice_instance_ptr)) {
-		qdevice_log(LOG_DEBUG, "Local socket is closed");
-		instance->schedule_disconnect = 1;
-		instance->disconnect_reason = QDEVICE_NET_DISCONNECT_REASON_LOCAL_SOCKET_CLOSED;
+	user_data->type = QDEVICE_NET_POLL_ARRAY_USER_DATA_TYPE_VOTEQUORUM;
 
-		return (NULL);
+	if (!instance->qdevice_instance_ptr->sync_in_progress) {
+		if (pr_poll_array_add(poll_array, &poll_desc, (void **)&user_data) < 0) {
+			return (NULL);
+		}
+		poll_desc->fd = instance->cmap_poll_fd;
+		poll_desc->in_flags = PR_POLL_READ;
+		user_data->type = QDEVICE_NET_POLL_ARRAY_USER_DATA_TYPE_CMAP;
 	}
 
 	if (pr_poll_array_add(poll_array, &poll_desc, (void **)&user_data) < 0) {

+ 0 - 1
qdevices/qdevice-net-send.c

@@ -35,7 +35,6 @@
 #include "qdevice-log.h"
 #include "qdevice-log-debug.h"
 #include "qdevice-net-send.h"
-#include "qdevice-cmap.h"
 #include "qdevice-net-votequorum.h"
 #include "msg.h"
 #include "utils.h"

+ 4 - 0
qdevices/qdevice-votequorum.c

@@ -53,6 +53,8 @@ qdevice_votequorum_quorum_notify_callback(votequorum_handle_t votequorum_handle,
 		exit(1);
 	}
 
+	instance->sync_in_progress = 0;
+
 	qdevice_log(LOG_DEBUG, "Votequorum quorum notify callback:");
 	qdevice_log(LOG_DEBUG, "  Quorate = %u", quorate);
 
@@ -93,6 +95,8 @@ qdevice_votequorum_node_list_notify_callback(votequorum_handle_t votequorum_hand
 		exit(1);
 	}
 
+	instance->sync_in_progress = 1;
+
 	qdevice_log(LOG_DEBUG, "Votequorum nodelist notify callback:");
 	qdevice_log(LOG_DEBUG, "  Ring_id = ("UTILS_PRI_RING_ID")",
 	    votequorum_ring_id.nodeid, votequorum_ring_id.seq);