[Pacemaker] Remote Access not Working

Colin colin.hch at gmail.com
Fri Nov 20 10:17:29 UTC 2009


Hi,

this is looking better again: A remote "cibadmin -Q" is now doing the
right thing, however a remote "crm_mon" is still _not_ working
correctly.

Let's see, now that I should know where to look ... the function
cib_recv_plaintext() in lib/common/remote.c looks a bit suspicious to
me:

- The "if (len == 0)" check will never be true because len is
initialised to 512 and then only grows.
- The assumption that a partial read (wrt. the buffer) signals no more
data is IMO not valid.

With the following patch I can at least get a "crm_mon -1rf" to do the
right thing:

diff -ur Pacemaker-1-0-f7a8250d23fc/lib/common/remote.c
Pacemaker-my/lib/common/remote.c
--- Pacemaker-1-0-f7a8250d23fc/lib/common/remote.c      2009-11-19
21:12:53.000000000 +0100
+++ Pacemaker-my/lib/common/remote.c    2009-11-20 10:52:36.000000000 +0100
@@ -220,33 +220,29 @@
 char*
 cib_recv_plaintext(int sock)
 {
-       int last = 0;
        char* buf = NULL;
-       int chunk_size = 512;
-       int len = chunk_size;
+       ssize_t buf_size = 512;
+       ssize_t len = 0;

-       crm_malloc0(buf, chunk_size);
+       crm_malloc0(buf, buf_size);

        while(1) {
-               int rc = recv(sock, buf+last, chunk_size, 0);
+               ssize_t rc = recv(sock, buf+len, buf_size-len, 0);
                if (rc == 0) {
                        if(len == 0) {
                                goto bail;
                        }
                        return buf;

-               } else if(rc > 0 && rc < chunk_size) {
-                       return buf;
-
-               } else if(rc == chunk_size) {
-                       last = len;
-                       len += chunk_size;
-                       crm_realloc(buf, len);
-                       CRM_ASSERT(buf != NULL);
+               } else if(rc > 0) {
+                 len += rc;
+                 if (len == buf_size) {
+                   crm_realloc(buf, buf_size += 512);  /* Should do
exponential growth for amortized constant time? */
+                   CRM_ASSERT(buf != NULL);
+                 }
                }
-
                if(rc < 0 && errno != EINTR) {
-                       crm_perror(LOG_ERR,"Error receiving message: %d", rc);
+                 crm_perror(LOG_ERR,"Error receiving message: %d", (int)rc);
                        goto bail;
                }
        }

And that is as far as I can get with crm_mon, as it doesn't supports
continuous update via remote access?

static int cib_remote_set_connection_dnotify(
    cib_t *cib, void (*dnotify)(gpointer user_data))
{
    return cib_NOTSUPPORTED;
}


Regards, Colin




More information about the Pacemaker mailing list