[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