Hello everybody,
I think there's a memory leak in svn_ra_get_file() or the svn+ssh RA layer.
FSVS (http://fsvs.tigris.org) uses svn_ra_get_file() eg. for reverts - 
to fetch a clean copy of a file from the repository.
While it behaves for file://-URLs (memory usage constant), it grows 
for svn+ssh://-accesses; when fetching a 100MB random-bytes file, 
it takes 294MB more memory to finish that operation.
I've got a (partly useful) callstack:
#0  0x00002afb38d69cd0 in malloc () from /lib/libc.so.6
#1  0x00002afb391834dc in apr_palloc () from /usr/lib/libapr-1.so.0
#2  0x00002afb38387ea6 in svn_stringbuf_ensure () from /usr/lib/libsvn_subr-1.so.1
#3  0x00002afb38387f32 in svn_stringbuf_appendbytes () from /usr/lib/libsvn_subr-1.so.1
#4  0x00002afb3a21258f in ?? () from /usr/lib/libsvn_ra_svn-1.so.1
#5  0x00002afb3a21264d in svn_ra_svn_read_item () from /usr/lib/libsvn_ra_svn-1.so.1
#6  0x00002afb3a20bacc in ?? () from /usr/lib/libsvn_ra_svn-1.so.1
#7  0x0000000000413ac7 in rev__get_file (sts=0x63baf0, revision=10, fetched=0x7fff7295ec08, only_tmp=0x0, pool=<value optimized out>) at revert.c:275
... and so on up to main.
The last line (revert.c:275) is where svn_ra_get_file() gets called.
I have to admit that the stream is not a simple svn_stream_from_aprfile(), 
but has a layer for blockwise MD5-hashing plugged in the middle; but 
that should be the same for file:/// and svn+ssh:///.
From the above dump it seems that the data gets collected into 
a svn_stringbuf_t; does somebody know why?
It is reproduceable with subversion as well; see here:
        flip@heim:/tmp$ svnadmin create repo
        flip_at_heim:/tmp$ svn co file:///tmp/repo wc
        Ausgecheckt, Revision 0.
        flip@heim:/tmp$ cd wc
        flip@heim:/tmp/wc$ openssl rand 100000000 > file
        flip@heim:/tmp/wc$ svn add file
        A  (bin)  file
        flip@heim:/tmp/wc$ svn ci file -m1
        Hinzuf. (bin)  file
        Übertrage Daten .
        Revision 1 übertragen.
        flip_at_heim:/tmp/wc$ svn cat svn+ssh://localhost/tmp/repo/file > /dev/null
Parallel looking at the top output starts with
        27871 flip      18   0 86976 3848 2632 D  7.9  0.4   0:00.08 svnserve
        27866 flip      18   0  114m  17m 2948 D  4.9  1.9   0:00.05 svn
and near the end I get
        27871 flip      16   0 87128 4024 2632 S  7.9  0.4   0:01.11 svnserve
        27866 flip      15   0  387m 290m 2952 S  4.9 30.8   0:01.37 svn
This is debian subversion=1.4.4dfsg1-1, libsvn1=1.4.4dfsg1-1, on a 
x86-64 installation.
Furthermore my logging functions tell me that the blocks that are being
passed through are only 4kB; is there an easy way to increase that size?
For file:// there are 16kB blocks; that is better, but I'd like to use 
128kB or something in that size.
Any help or ideas?
Thank you very much in advance.
Regards,
Phil
-- 
Versioning your /etc, /home or even your whole installation?
             Try fsvs (fsvs.tigris.org)!
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@subversion.tigris.org
For additional commands, e-mail: dev-help@subversion.tigris.org
Received on Tue Oct  2 14:29:25 2007