[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [hobbit] msgcache hobbitfetch problems



I am not sure how this patch was working for me.
It fixes if the fetched data is 8192 bytes or greater but breaks when
the read is <8192.
It does the initial read fine but on the second round through the
do/while loop n is -1 since there is nothing left to read and the remote
has closed.

So it thinks there is a failure.

On Wed, 2010-02-10 at 09:33 +0000, Steinar M. SkÃlason wrote:

> 
> 
> 
> On Mon, Feb 8, 2010 at 6:53 PM, Cade Robinson
> <cade.robinson (at) gmail.com> wrote:
> 
>         The issue is in the hobbitfetch "grabdata" function.
>         
>         int n;
>         char buf[8192];
>         ...
>         n = read(conn->sockfd, buf, sizeof(buf));
>         ...
>         else if (n > 0) {
>         ...
>         buf[n] = '\0';
>         ...
>         
>         If the "read" reads 8192 bytes then n is 8192 and then buf[n]
>         tries to
>         get set to NULL.  There is no element 8192.
>         Also only one read happens so if there is more than 8192 bytes
>         to be
>         fetched not everything is fetched.
>         
>         I put the "read" and "if"s in a do...while loop and fixed the
>         null
>         termination on buf and haven't had any issues.
>         
>         ~/hobbitmon/trunk/hobbitd:-> diff -u
>         hobbitfetch.c ./hobbitfetch.c.new
>         --- hobbitfetch.c       2010-02-08 12:43:22.781543905 -0600
>         +++ ./hobbitfetch.c.new 2010-02-08 12:52:25.249509306 -0600
>         @@ -342,8 +342,9 @@
>             int n;
>             char buf[8192];
>         
>         +    do {
>             /* Read data from a peer connection (client or server) */
>         -        n = read(conn->sockfd, buf, sizeof(buf));
>         +        n = read(conn->sockfd, buf, sizeof(buf)-2);
>             if (n == -1) {
>                 if ((errno != EINTR) && (errno != EAGAIN)) {
>                     /* Read failure */
>         @@ -360,7 +361,7 @@
>                 /* Save the data */
>                 dbgprintf("Got %d bytes of data from %s (req %lu)\n",
>                     n, addrstring(&conn->caddr), conn->seq);
>         -        buf[n] = '\0';
>         +        buf[n+1] = '\0';
>                 addtobuffer(conn->msgbuf, buf);
>             }
>             else if (n == 0) {
>         @@ -380,6 +381,7 @@
>                     break;
>                 }
>             }
>         +    } while (n>0);
>          }
>         
>          void set_polltime(clients_t *client)
>         
>         
>         
>         
>         
>         
>         
>         
>         
>         On Mon, 2010-02-08 at 18:12 +0000, Steinar M. SkÃlason wrote:
>         >
>         >
>         > On Mon, Feb 8, 2010 at 5:36 PM, Daniel McDonald
>         > <dan.mcdonald (at) austinenergy.com> wrote:
>         >         On 2/8/10 10:37 AM, "Steinar M. SkÃlason"
>         >         <steinarms (at) gmail.com> wrote:
>         >
>         >         > Hi,
>         >         >
>         >         > I'm having problems with "msgcache" on the client
>         machines
>         >         and "hobbitfetch"
>         >         > on the server machine.
>         >         > It works for a short period and then get's stuck
>         and all my
>         >         client side checks
>         >         > end up with status purple.
>         >
>         >
>         >         Yup.  Been doing that for a long time here.  I sent
>         a bunch of
>         >         corefiles to
>         >         Henrik about it, and he tried a bunch of patches.
>          Eventually,
>         >         we just wrote
>         >         a routine that restarts hobbitfetch whenever a host
>         turns
>         >         purple.
>         >
>         >         --
>         >         Daniel J McDonald, CCIE # 2495, CISSP # 78281
>         >
>         >
>         >         To unsubscribe from the hobbit list, send an e-mail
>         to
>         >         hobbit-unsubscribe (at) hswn.dk
>         >
>         >
>         >
>         > Ok, good to hear that I am not the only one.
>         > I wrote a ugly routine that restarts hobbitfetch if there is
>         no new
>         > entry in the logfile
>         >
>         >
>         > #!/bin/bash
>         >
>         > #This is to see if any progress has been made within the
>         hobbitfetch
>         > utility.
>         > TMP_FILE=/tmp/tmp.hobbitfetch.last
>         > LAST_LINE=`tail
>         -1 /usr/lib/xymon/server/log/hobbitfetch.log|awk
>         > '{print $1 $2}'`
>         > PREV_LINE=`cat /tmp/tmp.hobbitfetch.last`
>         > echo $LAST_LINE > $TMP_FILE
>         >
>         > if [ "$LAST_LINE" == "$PREV_LINE" ]; then
>         >   echo "Nothing has happend .... killing hobbitfetch!"
>         >   PID=`ps -ef|grep hobbitfetch|awk '{print $2}'`
>         >   kill -9 $PID
>         > fi
>         >
>         > Best Regards,
>         > Steinar M.
>         
>         
>         To unsubscribe from the hobbit list, send an e-mail to
>         hobbit-unsubscribe (at) hswn.dk
>         
>         
>         
> 
> Thank you for your reply Cade, I tried your patch but it was not
> working for me
> are you using the 4.3.0-beta2 for both client and server?
> I get no checks populated with your changes.
> Or did you also make changes to the msgcache.c ?
> 
> Regards,
> Steinar M.