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

Qdevice-net: Make duplicate node id err non-fatal

It can happen because qnetd not yet handled disconnect of client.

Signed-off-by: Jan Friesse <jfriesse@redhat.com>
Jan Friesse 9 лет назад
Родитель
Сommit
3cb84acd2c
2 измененных файлов с 18 добавлено и 8 удалено
  1. 10 7
      qdevices/qdevice-net-disconnect-reason.h
  2. 8 1
      qdevices/qdevice-net-msg-received.c

+ 10 - 7
qdevices/qdevice-net-disconnect-reason.h

@@ -70,6 +70,8 @@ enum qdevice_net_disconnect_reason {
 
 	/* Received message with error field set to non TLV_REPLY_ERROR_CODE_NO_ERROR value */
 	QDEVICE_NET_DISCONNECT_REASON_SERVER_SENT_ERROR,
+	/* Received message with error field set to TLV_REPLY_ERROR_CODE_DUPLICATE_NODE_ID value */
+	QDEVICE_NET_DISCONNECT_REASON_SERVER_SENT_DUPLICATE_NODE_ID_ERROR,
 	/* Server doesn't support client selected decision algorithm */
 	QDEVICE_NET_DISCONNECT_REASON_SERVER_DOESNT_SUPPORT_REQUIRED_ALGORITHM,
 
@@ -103,13 +105,14 @@ enum qdevice_net_disconnect_reason {
 	QDEVICE_NET_DISCONNECT_REASON_ALGO_ECHO_REPLY_NOT_RECEIVED_ERR,
 };
 
-#define qdevice_net_disconnect_reason_try_reconnect(reason)	(		\
-    reason == QDEVICE_NET_DISCONNECT_REASON_MSG_DECODE_ERROR ||			\
-    reason == QDEVICE_NET_DISCONNECT_REASON_SERVER_CLOSED_CONNECTION ||		\
-    reason == QDEVICE_NET_DISCONNECT_REASON_CANT_READ_MESSAGE ||		\
-    reason == QDEVICE_NET_DISCONNECT_REASON_CANT_SEND_MESSAGE ||		\
-    reason == QDEVICE_NET_DISCONNECT_REASON_CANT_CONNECT_TO_THE_SERVER ||	\
-    reason == QDEVICE_NET_DISCONNECT_REASON_ALGO_ECHO_REPLY_NOT_RECEIVED_ERR)
+#define qdevice_net_disconnect_reason_try_reconnect(reason) (				\
+    reason == QDEVICE_NET_DISCONNECT_REASON_MSG_DECODE_ERROR ||				\
+    reason == QDEVICE_NET_DISCONNECT_REASON_SERVER_CLOSED_CONNECTION ||			\
+    reason == QDEVICE_NET_DISCONNECT_REASON_CANT_READ_MESSAGE ||			\
+    reason == QDEVICE_NET_DISCONNECT_REASON_CANT_SEND_MESSAGE ||			\
+    reason == QDEVICE_NET_DISCONNECT_REASON_CANT_CONNECT_TO_THE_SERVER ||		\
+    reason == QDEVICE_NET_DISCONNECT_REASON_ALGO_ECHO_REPLY_NOT_RECEIVED_ERR ||		\
+    reason == QDEVICE_NET_DISCONNECT_REASON_SERVER_SENT_DUPLICATE_NODE_ID_ERROR)
 
 #define qdevice_net_disconnect_reason_force_disconnect(reason)	(			\
     reason == QDEVICE_NET_DISCONNECT_REASON_COROSYNC_CONNECTION_CLOSED ||		\

+ 8 - 1
qdevices/qdevice-net-msg-received.c

@@ -278,7 +278,14 @@ qdevice_net_msg_received_init_reply(struct qdevice_net_instance *instance,
 		qdevice_log(LOG_ERR, "Received init reply message with error code %"PRIu16". "
 		    "Disconnecting from server", msg->reply_error_code);
 
-		instance->disconnect_reason = QDEVICE_NET_DISCONNECT_REASON_SERVER_SENT_ERROR;
+		if (msg->reply_error_code == TLV_REPLY_ERROR_CODE_DUPLICATE_NODE_ID) {
+			qdevice_log(LOG_ERR, "Duplicate node id may be result of server not yet "
+			    "accepted this node disconnect. Retry again.");
+			instance->disconnect_reason = QDEVICE_NET_DISCONNECT_REASON_SERVER_SENT_DUPLICATE_NODE_ID_ERROR;
+		} else {
+			instance->disconnect_reason = QDEVICE_NET_DISCONNECT_REASON_SERVER_SENT_ERROR;
+		}
+
 		return (-1);
 	}