On 2021-04-23 15:31, Daniel Shahaf wrote: > Rick van der Zwet wrote on Fri, Apr 23, 2021 at 02:57:02 +0200: >> FYI: I did some futher investigation on the specific problem within Trac >> I was trying to fix and I am getting more hints by experimenting with >> flags and combinations. If I compile APR (1.7.0) without debugging it >> produces a coredump with some endless(?) recursion, see attached >> gdb-output.txt for details. If I compile apr with >> '--enable-pool-debug=yes', the program executes without errors, >> to-be-continued.
I find this very confusing, when compiling with '--enable-pool-debug' the code seems behaves differently with regards to thread locking, which might explain the differences in behaviour: [[[ apr-1.7.x/memory/unix/apr_pools.c: 1656 /* No matter what the creation flags say, always create 1657 * a lock. Without it integrity_check and apr_pool_num_bytes 1658 * blow up (because they traverse pools child lists that 1659 * possibly belong to another thread, in combination with 1660 * the pool having no lock). However, this might actually 1661 * hide problems like creating a child pool of a pool 1662 * belonging to another thread. 1663 */ ]]] >> Since this is most likely not subversion related I >> think is best discussed on different mailinglist. > > Ack, but the backtrace does go through Subversion's swig-py bindings and > libsvn_fs_fs, so we might be involved nevertheless. Does the problem > reproduce in «svnlook help»? In «svnlook youngest /path/to/repo»? In > «./fs-test» (in subversion/tests/*/)? > > I'm guessing frame 87035 is subversion/libsvn_fs_fs/fs.c:fs_open(). > That function uses a subpool, but I don't see why. A subpool would have > made sense if «subpool» had been passed to a function that was > documented to install pool cleanup handlers on its provided pool, for > example, but none of the uses of «subpool» are as anything other than > a called function's ordinary scratch_pool. So, could you try the > following patch? > > [[[ > Index: subversion/libsvn_fs_fs/fs.c > =================================================================== > --- subversion/libsvn_fs_fs/fs.c (revision 1889073) > +++ subversion/libsvn_fs_fs/fs.c (working copy) > @@ -427,19 +427,15 @@ fs_open(svn_fs_t *fs, > apr_pool_t *scratch_pool, > apr_pool_t *common_pool) > { > - apr_pool_t *subpool = svn_pool_create(scratch_pool); > - > SVN_ERR(svn_fs__check_fs(fs, FALSE)); > > SVN_ERR(initialize_fs_struct(fs)); > > - SVN_ERR(svn_fs_fs__open(fs, path, subpool)); > + SVN_ERR(svn_fs_fs__open(fs, path, scratch_pool)); > > - SVN_ERR(svn_fs_fs__initialize_caches(fs, subpool)); > + SVN_ERR(svn_fs_fs__initialize_caches(fs, scratch_pool)); > SVN_MUTEX__WITH_LOCK(common_pool_lock, > - fs_serialized_init(fs, common_pool, subpool)); > - > - svn_pool_destroy(subpool); > + fs_serialized_init(fs, common_pool, scratch_pool)); > > return SVN_NO_ERROR; > } > ]]] > > This passes fs-test and basic_tests.py (I didn't do a full «make > check» run). > > To be clear, the scratch_pool usage in that function in HEAD is > non-idiomatic without an obvious reason, but I don't see why it would > result in an infinite loop. I have tried the patch, it did not fix it. > About which, the pool address, 0x0804542028 (note I added a leading zero > to keep the number of nibbles even), looks suspiciously like ASCII: it's > "\t\004T (". That _could_ be a coincidence, especially since there's no > obvious mechanism by which the value of «subpool» could be corrupted > between the svn_pool_create() and the svn_pool_destroy(), but still, > a valgrind run on a pool-debug-enabled build might be a good idea. I did try an valgrind run, how-ever this showed no issues. I found compiling with '--enable-pool-concurrency-check' triggered a concurrency error which seems to be related to the Trac code, I filled it over there: https://trac.edgewall.org/ticket/13401 Kind regards, Rick