On 12 February 2015 at 15:42, Branko Čibej <br...@wandisco.com> wrote:
> On 12.02.2015 13:26, Evgeny Kotkov wrote:
>> Philip Martin <phi...@apache.org> writes:
>>
>>> Wrap svn_dso_initialize2 call with svn_atomic__init_once, this
>>> fixes a crash in the DSO hash code when running the C tests in
>>> parallel.
>>>
>>> * subversion/libsvn_subr/dso.c
>>>   (atomic_init_func): New.
>>>   (svn_dso_load): Use svn_atomic__init_once.
>> I think we should also address this problem in our test suite.  As I see, 
>> this
>> change avoids segfaults with --enable-runtime-module-search, but there is 
>> more
>> to it.  Documentation for svn_dso_initialize2() states the following (by the
>> way, the "will not be entirely thread safe" part is now outdated, right?):
>>
>>  * @note This should be called prior to the creation of any pool that
>>  *       is passed to a function that comes from a DSO, otherwise you
>>  *       risk having the DSO unloaded before all pool cleanup callbacks
>>  *       that live in the DSO have been executed.  If it is not called
>>  *       prior to @c svn_dso_load being used for the first time there
>>  *       will be a best effort attempt made to initialize the subsystem,
>>  *       but it will not be entirely thread safe and it risks running
>>  *       into the previously mentioned problems with DSO unloading and
>>  *       pool cleanup callbacks.
>>
>> I am not sure that taking some risks within the test suite is a good idea,
>> and I think that we should call functions like svn_dso_initialize2() and
>> svn_fs_initialize().  If we don't, everything might still work fine, but it
>> also might not, and we could spend a lot of time debugging random failures
>> if a test runs into one of these pitfalls happening due to the absense of
>> explicit initialization.  We do call these initializers in mod_dav_svn, svn,
>> svnserve — so why not also do the same in the test programs?
>>
>> I don't see a reason to use a custom way of bootstrapping things within
>> svn_test_main(), as opposed to main() functions in svn, svnadmin and other
>> command-line tools, and I attached a patch that brings this common approach
>> to svn_test_main().  Quick inspection shows a couple of other programs that
>> should probably do the same, e.g., atomic-ra-revprop-change.  However, I
>> think this is less important, and that we could do it separately.
>>
>> What do you think?
>
>
> We should make our implementation work without having to run the
> initializer functions. This is a lot easier for API users. There's
> almost nothing we can't do within an svn_atomic__init_once block. The
> only problematic feature is creating pools in an unknown thread context,
> because we won't know the pool destruction order. Even this problem has
> been mostly solved in the BDB DB_REGISTER support code.
>
We should, but sometimes we cannot. As far I understand documentation
for svn_dso_initialize2() is exactly that case:
[[[
 * @note This should be called prior to the creation of any pool that
 *       is passed to a function that comes from a DSO, otherwise you
 *       risk having the DSO unloaded before all pool cleanup callbacks
 *       that live in the DSO have been executed.  If it is not called
 *       prior to @c svn_dso_load being used for the first time there
 *       will be a best effort attempt made to initialize the subsystem,
 *       but it will not be entirely thread safe and it risks running
 *       into the previously mentioned problems with DSO unloading and
 *       pool cleanup callbacks.
 ]]]

Multi-threaded application that didn't call svn_dso_initialize2()
before creating any other pools will fail anyway under some
circumstances. The problem with cleanup handles, not with concurrent
initialization.

-- 
Ivan Zhakov

Reply via email to