Преглед изворни кода

Qdevice: Allow master_wins

Signed-off-by: Jan Friesse <jfriesse@redhat.com>
Jan Friesse пре 9 година
родитељ
комит
facfb4a772

+ 6 - 0
qdevices/corosync-qdevice.c

@@ -207,6 +207,12 @@ main(int argc, char * const argv[])
 		return (1);
 	}
 
+	qdevice_log(LOG_DEBUG, "Configuring master_wins");
+	if (qdevice_votequorum_master_wins(&instance, (advanced_settings.master_wins ==
+	    QDEVICE_ADVANCED_SETTINGS_MASTER_WINS_FORCE_ON ? 1 : 0)) != 0) {
+		return (1);
+	}
+
 	qdevice_log(LOG_DEBUG, "Getting configuration node list");
 	if (qdevice_cmap_store_config_node_list(&instance) != 0) {
 		return (1);

+ 14 - 0
qdevices/qdevice-advanced-settings.c

@@ -85,6 +85,8 @@ qdevice_advanced_settings_init(struct qdevice_advanced_settings *settings)
 	settings->net_delay_before_reconnect = QDEVICE_NET_DEFAULT_DELAY_BEFORE_RECONNECT;
 	settings->net_test_algorithm_enabled = QDEVICE_NET_DEFAULT_TEST_ALGORITHM_ENABLED;
 
+	settings->master_wins = QDEVICE_ADVANCED_SETTINGS_MASTER_WINS_MODEL;
+
 	return (0);
 }
 
@@ -259,6 +261,18 @@ qdevice_advanced_settings_set(struct qdevice_advanced_settings *settings,
 		}
 
 		settings->net_test_algorithm_enabled = (uint8_t)tmpll;
+	} else if (strcasecmp(option, "master_wins") == 0) {
+		tmpll = utils_parse_bool_str(value);
+
+		if (tmpll == 0) {
+			settings->master_wins = QDEVICE_ADVANCED_SETTINGS_MASTER_WINS_FORCE_OFF;
+		} else if (tmpll == 1) {
+			settings->master_wins = QDEVICE_ADVANCED_SETTINGS_MASTER_WINS_FORCE_ON;
+		} else if (strcasecmp(value, "model") == 0) {
+			settings->master_wins = QDEVICE_ADVANCED_SETTINGS_MASTER_WINS_MODEL;
+		} else {
+			return (-2);
+		}
 	} else {
 		return (-1);
 	}

+ 7 - 0
qdevices/qdevice-advanced-settings.h

@@ -39,6 +39,12 @@
 extern "C" {
 #endif
 
+enum qdevice_advanced_settings_master_wins {
+	QDEVICE_ADVANCED_SETTINGS_MASTER_WINS_MODEL,
+	QDEVICE_ADVANCED_SETTINGS_MASTER_WINS_FORCE_ON,
+	QDEVICE_ADVANCED_SETTINGS_MASTER_WINS_FORCE_OFF,
+};
+
 struct qdevice_advanced_settings {
 	char *lock_file;
 	char *local_socket_file;
@@ -48,6 +54,7 @@ struct qdevice_advanced_settings {
 	size_t ipc_max_clients;
 	size_t ipc_max_send_size;
 	size_t ipc_max_receive_size;
+	enum qdevice_advanced_settings_master_wins master_wins;
 
 	/*
 	 * Related to model NET

+ 36 - 0
qdevices/qdevice-votequorum.c

@@ -299,3 +299,39 @@ qdevice_votequorum_poll(struct qdevice_instance *instance, int cast_vote)
 
 	return (0);
 }
+
+int
+qdevice_votequorum_master_wins(struct qdevice_instance *instance, int allow)
+{
+	cs_error_t res;
+	int final_allow;
+
+	final_allow = allow;
+
+	if (instance->advanced_settings->master_wins ==
+	    QDEVICE_ADVANCED_SETTINGS_MASTER_WINS_FORCE_OFF && allow) {
+		qdevice_log(LOG_WARNING, "Allow of master wins is requested, but user forcibly "
+		    "disallowed it. Keeping master wins disallowed.");
+
+		final_allow = 0;
+	}
+
+	if (instance->advanced_settings->master_wins ==
+	    QDEVICE_ADVANCED_SETTINGS_MASTER_WINS_FORCE_ON && !allow) {
+		qdevice_log(LOG_WARNING, "Disallow of master wins is requested, but user forcibly "
+		    "allowed it. Keeping master wins allowed.");
+
+		final_allow = 1;
+	}
+
+	res = votequorum_qdevice_master_wins(instance->votequorum_handle,
+	    instance->advanced_settings->votequorum_device_name, final_allow);
+
+	if (res != CS_OK) {
+		qdevice_log(LOG_CRIT, "Can't set master wins. Error %s", cs_strerror(res));
+
+		return (-1);
+	}
+
+	return (0);
+}

+ 3 - 0
qdevices/qdevice-votequorum.h

@@ -55,6 +55,9 @@ extern int			qdevice_votequorum_poll(struct qdevice_instance *instance,
 extern int			qdevice_votequorum_wait_for_ring_id(
     struct qdevice_instance *instance);
 
+extern int			qdevice_votequorum_master_wins(struct qdevice_instance *instance,
+    int allow);
+
 #ifdef __cplusplus
 }
 #endif