Fixed but not understood

bill davidsen davidsen at tmr.com
Fri Apr 6 01:26:20 UTC 2001


Well, I have made a change which fixes my problem, but I sure don't
think I understand the problem. In the calculation of the article size
there appears to be a premature breakout from a loop, resulting in the
article size being reported as smaller than it is (as in negative at
times). The patch at the end of this post fixes that, but it obviously
isn't the real problem, because I can't believe that anyone ever ran
without seeing the same problem.

By undersizing the article the ${NEWS}/news log file gets all incorrect
data. More to the point, this is the size used to satisfy < and >
operators in the newsfeeds file, resulting in most articles dropping in
the small articles queue. Maybe everyone else feeds sites who are so
fast they can take a full feed on a single stream, but my feeds are
usually broken at 32k and 250k into three feeds, running into two copies
of innfeed. Putting all the articles in the small queue results in a
huge backlog.

Okay, what am I missing, why do I see this only on Linux with largefile
support, etc?

In article <200103292058.PAA23908 at gatekeeper.tmr.com>,
I <davidsen at tmr.com> wrote:
| Here's an odd one. I just built 20010222-CURRENT for Linux with
| largefile support. All of a sudden, after a reboot, some of the article
| sizes come back negative in ${NEWS}/log/news with 'logartsize' set in
| inn.conf. I suppose this is a 64 vs. 32 bit issue, and I'm chasing it
| now, but I thought I'd mention it. I'd really rather fix it than upgrade
| right now, and I bet the offset in the cycbuff just got >2GB.
| Unfortunately the perl was not compiled with large file support (built
| for 2.2.xx kernel, I'm sure), so I have to rebuild that before I can
| check that supposition.

"The patch"

*** art.c       2001/04/05 09:01:01     1.1
--- art.c       2001/04/06 00:51:11
***************
*** 519,527 ****
      if (NeedHeaders && (i + 1 == iovcnt)) {
        /* body begins at last iov */
        headersize = data->BytesValue +
        Article->Data + data->Body - (char *) iov[i].iov_base;
-       break;
      }
      data->BytesValue += iov[i].iov_len;
    }
    /* "\r\n" is counted as 1 byte.  trailing ".\r\n" and body delimitor
are also
--- 519,526 ----

-- 
bill davidsen <davidsen at tmr.com>
  CTO, TMR Associates, Inc
Doing interesting things with little computers since 1979.


More information about the inn-workers mailing list