Rick van der Zwet wrote on Wed, Apr 21, 2021 at 16:10:57 +0200:
> Hi,
> 
> I debugging crashes within the Trac (https://trac.edgewall.org/) when using
> the svn backend. The issue seems to be related to Apache Portable Runtime
> (APR) pool memory management at Trac together with subversion SWIG python
> bindings and libsvn.
> 
> I am trying to run subverion with APR (lifetime) debugging enabled
> (./configure --enable-pool-debug=all --enable-debug) to give more insights,
> how-ever I got stuck with the basics.

I assume the use of «all» as the argument to --enable-pool-debug is
deliberate?  I.e., that enabling fewer bitflags wouldn't suffice for
your use-case?

> First I tried 'svn' which completes fine:
> 
> Next I tried 'svn help' which gives me apr_pool_integrity check [lifetime]
> exception:
> =======================================================================================================================================================
> POOL DEBUG: [29126/34384113664] CREATEU (         0/         0/      5029)
> 0x80174d640 "subversion/libsvn_subr/pool.c:160"
> <subversion/libsvn_subr/pool.c:160> (0/0/0)
> POOL DEBUG: [29126/34384113664]    LIFE
> 0x80174d640 <memory/unix/apr_pools.c:apr_pool_integrity check [lifetime]>
> 

Looking at that file (in apr-1.6.5, since you didn't mention
a particular version):

  1597  static void apr_pool_check_integrity(apr_pool_t *pool)
  1598  {
  1599      /* Rule of thumb: use of the global pool is always
  1600       * ok, since the only user is apr_pools.c.  Unless
  1601       * people have searched for the top level parent and
  1602       * started to use that...
  1603       */
  1604      if (pool == global_pool || global_pool == NULL)
  1605          return;
  1606  
  1607      /* Lifetime
  1608       * This basically checks to see if the pool being used is still
  1609       * a relative to the global pool.  If not it was previously
  1610       * destroyed, in which case we abort().
  1611       */
  1612  #if (APR_POOL_DEBUG & APR_POOL_DEBUG_LIFETIME)
  1613      if (!apr_pool_is_child_of(pool, global_pool)) {
  1614  #if (APR_POOL_DEBUG & APR_POOL_DEBUG_VERBOSE_ALL)
  1615          apr_pool_log_event(pool, "LIFE",
  1616                             __FILE__ ":apr_pool_integrity check 
[lifetime]", 0);
  1617  #endif /* (APR_POOL_DEBUG & APR_POOL_DEBUG_VERBOSE_ALL) */
  1618          abort();
  1619      }
  1620  #endif /* (APR_POOL_DEBUG & APR_POOL_DEBUG_LIFETIME) */

The Subversion caller is error.c (frame #6), and it has a comment saying
it deliberately uses a pool unrelated to the global pool:

    69    /* Strictly speaking, this is a memory leak, since we're creating an
    70       unmanaged, top-level pool and never destroying it.  We do this
    71       because this pool controls the lifetime of the thread-local
    72       storage for error locations, and that storage must always be
    73       available. */

> Program received signal SIGABRT, Aborted.
> 0x0000000801088c2a in thr_kill () from /lib/libc.so.7
> (gdb) bt
> #0  0x0000000801088c2a in thr_kill () from /lib/libc.so.7
> #1  0x0000000801087084 in raise () from /lib/libc.so.7
> #2  0x0000000800ffd279 in abort () from /lib/libc.so.7
> #3  0x0000000800ea8a57 in apr_pool_check_integrity (pool=0x80174d640) at 
> memory/unix/apr_pools.c:1618
> #4  0x0000000800ea8c3d in apr_pcalloc_debug (pool=0x80174d640, size=16,
>     file_line=0x800e7c683 "threadproc/unix/threadpriv.c:28") at 
> memory/unix/apr_pools.c:1795
> #5  0x0000000800ebbe49 in apr_threadkey_private_create (key=0x800873998 
> <error_file_key>,
>     dest=0x80081d770 <null_threadkey_dtor>, pool=0x80174d640) at 
> threadproc/unix/threadpriv.c:28
> #6  0x000000080081bd61 in locate_init_once (ignored_baton=0x0) at 
> subversion/libsvn_subr/error.c:77
> #7  0x00000008007f6d4e in str_init_func_wrapper (init_baton=0x7fffffffcfb0) 
> at subversion/libsvn_subr/atomic.c:156
> #8  0x00000008007f6bcd in init_once (global_status=0x800873990 
> <svn_error.locate.init_status>,
>     init_func=0x8007f6d30 <str_init_func_wrapper>, init_baton=0x7fffffffcfb0) 
> at subversion/libsvn_subr/atomic.c:71
> #9  0x00000008007f6ce0 in svn_atomic__init_once_no_error 
> (global_status=0x800873990 <svn_error.locate.init_status>,
>     str_init_func=0x80081bd30 <locate_init_once>, baton=0x0) at 
> subversion/libsvn_subr/atomic.c:170
> #10 0x000000080081bca7 in svn_error__locate (file=0x8007d85cd 
> "subversion/libsvn_subr/io.c", line=3988)
>     at subversion/libsvn_subr/error.c:128
> #11 0x000000080082235d in svn_io_file_open (new_file=0x7fffffffd0e8, 
> fname=0x8017523c0 "/etc/subversion/servers",
>     flag=1, perm=4095, pool=0x80174d500) at subversion/libsvn_subr/io.c:3988
⋮
> #18 0x000000000025cc7f in main (argc=2, argv=0x7fffffffdaa0) at 
> subversion/svn/svn.c:3325
> (gdb)
> =======================================================================================================================================================
> 
> 
> I tried subversion 1.14.1 and subversion-trunk@1889032. Traces above are
> generated using the subversion-trunk codebase.
> 
> I have also the unittests of the Apache Portable Runtime (APR) on which the
> relevant(?) ones completes successfully.
> 
> How can I find out if a) I am looking at an potential issue within
> subversion source code, b) whether the APR debugging is flagging this as a
> false positive or c) something else?

I don't have a recommended workaround off the top of my head, sorry.

>

For future reference, your MUA hard-wrapped the various traces, which
made them difficult to read.  Please disable hard wrapping for such
cases, or use attachments named *.txt.

Cheers,

Daniel

Reply via email to