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

Qdevice: Wait for ring id before executing model

Signed-off-by: Jan Friesse <jfriesse@redhat.com>
Jan Friesse 9 лет назад
Родитель
Сommit
20839095ae
4 измененных файлов с 31 добавлено и 0 удалено
  1. 5 0
      qdevices/corosync-qdevice.c
  2. 1 0
      qdevices/qdevice-instance.h
  3. 22 0
      qdevices/qdevice-votequorum.c
  4. 3 0
      qdevices/qdevice-votequorum.h

+ 5 - 0
qdevices/corosync-qdevice.c

@@ -222,6 +222,11 @@ main(int argc, char * const argv[])
 		return (1);
 		return (1);
 	}
 	}
 
 
+	qdevice_log(LOG_DEBUG, "Waiting for ring id");
+	if (qdevice_votequorum_wait_for_ring_id(&instance) != 0) {
+		return (1);
+	}
+
 	global_instance = &instance;
 	global_instance = &instance;
 	signal_handlers_register();
 	signal_handlers_register();
 
 

+ 1 - 0
qdevices/qdevice-instance.h

@@ -87,6 +87,7 @@ struct qdevice_instance {
 	 * Copy of votequorum_nodelist_notify_fn callback paramters.
 	 * Copy of votequorum_nodelist_notify_fn callback paramters.
 	 * Set after model callback is called.
 	 * Set after model callback is called.
 	 */
 	 */
+	uint8_t vq_node_list_ring_id_set;
 	votequorum_ring_id_t vq_node_list_ring_id;
 	votequorum_ring_id_t vq_node_list_ring_id;
 	uint32_t vq_node_list_entries;
 	uint32_t vq_node_list_entries;
 	uint32_t *vq_node_list;
 	uint32_t *vq_node_list;

+ 22 - 0
qdevices/qdevice-votequorum.c

@@ -113,6 +113,7 @@ qdevice_votequorum_node_list_notify_callback(votequorum_handle_t votequorum_hand
 		exit(2);
 		exit(2);
 	}
 	}
 
 
+	instance->vq_node_list_ring_id_set = 1;
 	memcpy(&instance->vq_node_list_ring_id, &votequorum_ring_id, sizeof(votequorum_ring_id));
 	memcpy(&instance->vq_node_list_ring_id, &votequorum_ring_id, sizeof(votequorum_ring_id));
 	instance->vq_node_list_entries = node_list_entries;
 	instance->vq_node_list_entries = node_list_entries;
 	free(instance->vq_node_list);
 	free(instance->vq_node_list);
@@ -236,6 +237,27 @@ qdevice_votequorum_destroy(struct qdevice_instance *instance)
 	}
 	}
 }
 }
 
 
+int
+qdevice_votequorum_wait_for_ring_id(struct qdevice_instance *instance)
+{
+	int no_retries;
+
+	no_retries = 0;
+
+	while (!instance->vq_node_list_ring_id_set &&
+	    qdevice_votequorum_dispatch(instance) != -1 &&
+	    no_retries++ < instance->advanced_settings->max_cs_try_again) {
+		(void)poll(NULL, 0, 1000);
+	}
+
+	if (!instance->vq_node_list_ring_id_set) {
+		qdevice_log(LOG_CRIT, "Can't get initial votequorum membership information.");
+		return (-1);
+	}
+
+	return (0);
+}
+
 int
 int
 qdevice_votequorum_dispatch(struct qdevice_instance *instance)
 qdevice_votequorum_dispatch(struct qdevice_instance *instance)
 {
 {

+ 3 - 0
qdevices/qdevice-votequorum.h

@@ -52,6 +52,9 @@ extern int			qdevice_votequorum_dispatch(struct qdevice_instance *instance);
 extern int			qdevice_votequorum_poll(struct qdevice_instance *instance,
 extern int			qdevice_votequorum_poll(struct qdevice_instance *instance,
     int cast_vote);
     int cast_vote);
 
 
+extern int			qdevice_votequorum_wait_for_ring_id(
+    struct qdevice_instance *instance);
+
 #ifdef __cplusplus
 #ifdef __cplusplus
 }
 }
 #endif
 #endif