[Botan-devel] Re: [Monotone-devel] oprofile data for mtn 0.37.
Jack Lloyd
lloyd at randombit.net
Thu Mar 13 12:52:31 EDT 2008
On Thu, Mar 13, 2008 at 12:07:57PM -0400, Zack Weinberg wrote:
> On Thu, Mar 13, 2008 at 11:08 AM, Jack Lloyd <lloyd at randombit.net> wrote:
> > Pipe actually keeps each message around forever (all storage is
> > reclaimed once a) all output has been read out b) the message in
> > question is not currently being processed). You can read out a out of
> > order / interleaved with reading others / whatever.
>
> Oh, I see now.
>
> Is *all* storage reclaimed, or is there some array indexed by message
> number that's going to keep growing forever if I recycle pipes?
It should be everything (ie, zero increased memory usage over time, as
long as you read the entire contents of each message out) - the code
handling this is in out_buf.cpp if you would like to review.
Message numbers are currently stored as 32-bit integers, and there
will probably be failures on overflow (in particular at 2^32-2 ==
Pipe::LAST_MESSAGE) -- how likely would a process-persistent Pipe
eventually hit this limit in (say) long-running a monontone server?
You have: 2^32 / (300 / s)
You want: day
* 165.7009
The message number can (and probably should) be changed to a long
long, though also the underlying issue that Pipe should detect/signal
this condition needs fixing.
WRT leaks, attached is a simple testcase, which I have only run up to
about a million messages (slow machine), but there was no perceptible
increase in memory usage as the # of messages run through the Pipe
increases. I will attempt running this out to 2^32 messages to make
sure though (and confirm/deny if there are failures at overflow).
-Jack
-------------- next part --------------
#include <botan/filters.h>
#include <botan/pipe.h>
#include <botan/loadstor.h>
#include <unistd.h>
using namespace Botan;
int main()
{
Pipe p;
for(u32bit j = 0; j != 10000000; j++)
{
if(j % (1024*1024) == 0)
printf("%d\n", j);
p.start_msg();
for(u32bit k = 0; k != 4; k++)
p.write(get_byte(k, j));
p.end_msg();
SecureVector<byte> m = p.read_all(Pipe::LAST_MESSAGE);
if(m.size() != 4)
printf("Bad size %d at %d\n", m.size(), j);
for(u32bit k = 0; k != 4; k++)
if(m[k] != get_byte(k, j))
printf("Bad output for %d, byte %d: %02X != %02X",
j, k, m[k], get_byte(k, j));
}
printf("done\n");
pause();
}
More information about the botan-devel
mailing list