File pacemaker-improve-remote-connection-messages.patch of Package pacemaker.14737

commit a506efdaecd6643b54d6c1ae26a98ec525d450ed
Author: Ken Gaillot <kgaillot@redhat.com>
Date:   Wed Oct 25 16:38:36 2017 -0500

    Log: libcrmcommon,liblrmd: improve remote connection messages

diff --git a/lib/common/remote.c b/lib/common/remote.c
index ddeaddc93..05a780606 100644
--- a/lib/common/remote.c
+++ b/lib/common/remote.c
@@ -772,16 +772,15 @@ internal_tcp_connect_async(int sock,
     int timer;
     struct tcp_async_cb_data *cb_data = NULL;
 
-    if ((flag = fcntl(sock, F_GETFL)) >= 0) {
-        if (fcntl(sock, F_SETFL, flag | O_NONBLOCK) < 0) {
-            crm_err("fcntl() write failed");
-            return -1;
-        }
+    flag = fcntl(sock, F_GETFL);
+    if ((flag >= 0) && (fcntl(sock, F_SETFL, flag | O_NONBLOCK) < 0)) {
+        crm_perror(LOG_WARNING, "setting socket non-blocking");
+        return -1;
     }
 
     rc = connect(sock, addr, addrlen);
-
     if (rc < 0 && (errno != EINPROGRESS) && (errno != EAGAIN)) {
+        crm_perror(LOG_WARNING, "connect");
         return -1;
     }
 
@@ -809,7 +808,8 @@ internal_tcp_connect_async(int sock,
      * At some point we should figure out a way to use a mainloop fd callback for this.
      * Something about the way mainloop is currently polling prevents this from working at the
      * moment though. */
-    crm_trace("fd %d: scheduling to check if connect finished in %dms second", sock, interval);
+    crm_trace("Scheduling check in %dms for whether connect to fd %d finished",
+              interval, sock);
     timer = g_timeout_add(interval, check_connect_finished, cb_data);
     if (timer_id) {
         *timer_id = timer;
@@ -821,18 +821,16 @@ internal_tcp_connect_async(int sock,
 static int
 internal_tcp_connect(int sock, const struct sockaddr *addr, socklen_t addrlen)
 {
-    int flag = 0;
     int rc = connect(sock, addr, addrlen);
 
     if (rc == 0) {
-        if ((flag = fcntl(sock, F_GETFL)) >= 0) {
-            if (fcntl(sock, F_SETFL, flag | O_NONBLOCK) < 0) {
-                crm_err("fcntl() write failed");
-                return -1;
-            }
+        int flag = fcntl(sock, F_GETFL);
+
+        if ((flag >= 0) && (fcntl(sock, F_SETFL, flag | O_NONBLOCK) < 0)) {
+            crm_perror(LOG_WARNING, "setting socket non-blocking");
+            rc = -1;
         }
     }
-
     return rc;
 }
 
@@ -854,24 +852,23 @@ crm_remote_tcp_connect_async(const char *host, int port, int timeout, /*ms */
     int ret_ga;
     int sock = -1;
 
-    /* getaddrinfo */
+    // Get host's IP address(es)
     memset(&hints, 0, sizeof(struct addrinfo));
     hints.ai_family = AF_UNSPEC;        /* Allow IPv4 or IPv6 */
     hints.ai_socktype = SOCK_STREAM;
     hints.ai_flags = AI_CANONNAME;
-
-    crm_debug("Looking up %s", server);
     ret_ga = getaddrinfo(server, NULL, &hints, &res);
     if (ret_ga) {
-        crm_err("getaddrinfo: %s", gai_strerror(ret_ga));
-        return -1;
+        crm_err("Unable to get IP address info for %s: %s",
+                server, gai_strerror(ret_ga));
+        goto async_cleanup;
     }
-
     if (!res || !res->ai_addr) {
-        crm_err("getaddrinfo failed");
+        crm_err("Unable to get IP address info for %s: no result", server);
         goto async_cleanup;
     }
 
+    // getaddrinfo() returns a list of host's addresses, try them in order
     for (rp = res; rp != NULL; rp = rp->ai_next) {
         struct sockaddr *addr = rp->ai_addr;
 
@@ -882,12 +879,12 @@ crm_remote_tcp_connect_async(const char *host, int port, int timeout, /*ms */
         if (rp->ai_canonname) {
             server = res->ai_canonname;
         }
-        crm_debug("Got address %s for %s", server, host);
+        crm_debug("Got canonical name %s for %s", server, host);
 
-        /* create socket */
         sock = socket(rp->ai_family, SOCK_STREAM, IPPROTO_TCP);
         if (sock == -1) {
-            crm_err("Socket creation failed for remote client connection.");
+            crm_perror(LOG_WARNING, "creating socket for connection to %s",
+                       server);
             continue;
         }
 
@@ -901,7 +898,7 @@ crm_remote_tcp_connect_async(const char *host, int port, int timeout, /*ms */
 
         memset(buffer, 0, DIMOF(buffer));
         crm_sockaddr2str(addr, buffer);
-        crm_info("Attempting to connect to remote server at %s:%d", buffer, port);
+        crm_info("Attempting TCP connection to %s:%d", buffer, port);
 
         if (callback) {
             if (internal_tcp_connect_async
@@ -909,10 +906,8 @@ crm_remote_tcp_connect_async(const char *host, int port, int timeout, /*ms */
                 goto async_cleanup; /* Success for now, we'll hear back later in the callback */
             }
 
-        } else {
-            if (internal_tcp_connect(sock, rp->ai_addr, rp->ai_addrlen) == 0) {
-                break;          /* Success */
-            }
+        } else if (internal_tcp_connect(sock, rp->ai_addr, rp->ai_addrlen) == 0) {
+            break;          /* Success */
         }
 
         close(sock);
diff --git a/lib/lrmd/lrmd_client.c b/lib/lrmd/lrmd_client.c
index 886047208..828133bc3 100644
--- a/lib/lrmd/lrmd_client.c
+++ b/lib/lrmd/lrmd_client.c
@@ -1133,7 +1133,7 @@ lrmd_tcp_connect_cb(void *userdata, int sock)
 {
     lrmd_t *lrmd = userdata;
     lrmd_private_t *native = lrmd->private;
-    char name[256] = { 0, };
+    char *name;
     static struct mainloop_fd_callbacks lrmd_tls_callbacks = {
         .dispatch = lrmd_tls_dispatch,
         .destroy = lrmd_tls_connection_destroy,
@@ -1145,19 +1145,22 @@ lrmd_tcp_connect_cb(void *userdata, int sock)
 
     if (rc < 0) {
         lrmd_tls_connection_destroy(lrmd);
-        crm_info("remote lrmd connect to %s at port %d failed", native->server, native->port);
+        crm_info("Could not connect to remote LRMD at %s:%d",
+                 native->server, native->port);
         report_async_connection_result(lrmd, rc);
         return;
     }
 
-    /* TODO continue with tls stuff now that tcp connect passed. make this async as well soon
-     * to avoid all blocking code in the client. */
+    /* The TCP connection was successful, so establish the TLS connection.
+     * @TODO make this async to avoid blocking code in client
+     */
+
     native->sock = sock;
 
     rc = lrmd_tls_set_key(&psk_key);
     if (rc != 0) {
-        crm_warn("Setup of the key failed (rc=%d) for remote node %s:%d",
-                 rc, native->server, native->port);
+        crm_warn("Could not set key for remote LRMD at %s:%d " CRM_XS " rc=%d",
+                 native->server, native->port, rc);
         lrmd_tls_connection_destroy(lrmd);
         report_async_connection_result(lrmd, rc);
         return;
@@ -1170,8 +1173,8 @@ lrmd_tcp_connect_cb(void *userdata, int sock)
     native->remote->tls_session = create_psk_tls_session(sock, GNUTLS_CLIENT, native->psk_cred_c);
 
     if (crm_initiate_client_tls_handshake(native->remote, LRMD_CLIENT_HANDSHAKE_TIMEOUT) != 0) {
-        crm_warn("Client tls handshake failed for server %s:%d. Disconnecting", native->server,
-                 native->port);
+        crm_warn("Disconnecting after TLS handshake with remote LRMD %s:%d failed",
+                 native->server, native->port);
         gnutls_deinit(*native->remote->tls_session);
         gnutls_free(native->remote->tls_session);
         native->remote->tls_session = NULL;
@@ -1180,42 +1183,38 @@ lrmd_tcp_connect_cb(void *userdata, int sock)
         return;
     }
 
-    crm_info("Remote lrmd client TLS connection established with server %s:%d", native->server,
-             native->port);
+    crm_info("TLS connection to remote LRMD %s:%d succeeded",
+             native->server, native->port);
 
-    snprintf(name, 128, "remote-lrmd-%s:%d", native->server, native->port);
+    name = crm_strdup_printf("remote-lrmd-%s:%d", native->server, native->port);
 
     native->process_notify = mainloop_add_trigger(G_PRIORITY_HIGH, lrmd_tls_dispatch, lrmd);
     native->source =
         mainloop_add_fd(name, G_PRIORITY_HIGH, native->sock, lrmd, &lrmd_tls_callbacks);
 
     rc = lrmd_handshake(lrmd, name);
-    report_async_connection_result(lrmd, rc);
+    free(name);
 
+    report_async_connection_result(lrmd, rc);
     return;
 }
 
 static int
 lrmd_tls_connect_async(lrmd_t * lrmd, int timeout /*ms */ )
 {
-    int rc = -1;
     int sock = 0;
     int timer_id = 0;
-
     lrmd_private_t *native = lrmd->private;
 
     lrmd_gnutls_global_init();
-
-    sock = crm_remote_tcp_connect_async(native->server, native->port, timeout, &timer_id, lrmd,
-                                      lrmd_tcp_connect_cb);
-
-    if (sock != -1) {
-        native->sock = sock;
-        rc = 0;
-        native->async_timer = timer_id;
+    sock = crm_remote_tcp_connect_async(native->server, native->port, timeout,
+                                        &timer_id, lrmd, lrmd_tcp_connect_cb);
+    if (sock < 0) {
+        return sock;
     }
-
-    return rc;
+    native->sock = sock;
+    native->async_timer = timer_id;
+    return pcmk_ok;
 }
 
 static int
@@ -1267,12 +1266,13 @@ lrmd_tls_connect(lrmd_t * lrmd, int *fd)
     if (fd) {
         *fd = sock;
     } else {
-        char name[256] = { 0, };
-        snprintf(name, 128, "remote-lrmd-%s:%d", native->server, native->port);
+        char *name = crm_strdup_printf("remote-lrmd-%s:%d",
+                                       native->server, native->port);
 
         native->process_notify = mainloop_add_trigger(G_PRIORITY_HIGH, lrmd_tls_dispatch, lrmd);
         native->source =
             mainloop_add_fd(name, G_PRIORITY_HIGH, native->sock, lrmd, &lrmd_tls_callbacks);
+        free(name);
     }
     return pcmk_ok;
 }
openSUSE Build Service is sponsored by