On Mon, Jan 20, 2014 at 3:12 PM, Evgeny Kotkov
<evgeny.kot...@visualsvn.com>wrote:

> Hi,
>
> I've noticed that the new fs-fs-pack-tests (#13 and #14) fail on my machine
> around trunk@r1559108.  This happens with different Windows versions (I've
> tried Windows XP SP3 32-bit / Vista SP2 32-bit / Server 2008 R2 64-bit /
> Windows 7 64-bit / Windows 8 64-bit) and does not happen with Ubuntu
> 64-bit:
> [[[
>   svn_tests: E720145: Can't remove directory
>   'upgrade_new_txns_to_log_addressing\revs\2': The directory is not empty.
>   FAIL:  fs-fs-pack-test.exe 13: upgrade txns to log addressing in shared
> FSFS
>
>   svn_tests: E720145: Can't remove directory
>   'upgrade_old_txns_to_log_addressing\revs\2': The directory is not empty.
>   FAIL:  fs-fs-pack-test.exe 14: upgrade txns started before svnadmin
> upgrade
> ]]]
>
> This Windows-specific error is usually caused by an attempt to remove a
> folder
> while still having open file handles to some of its children.  So, I
> grabbed
> the Process Monitor [1] and dumped the CreateFile and CloseFile events that
> happen within the 'upgrade_new_txns_to_log_addressing' test.  It is easy to
> spot that the 'revs/2/8' file handle is only closed during the test cleanup
> (when the per-function TEST_POOL is being cleared).  As a consequence, an
> attempt to pack the repository fails to delete the 'revs/2' folder with an
> ENOTEMPTY error.  I've tracked down the origin of this file handle and here
> is the corresponding stacktrace:
> [[[
>   file_open + 0x20,  libsvn_subr\io.c(350)
>   svn_io_file_open + 0x4a,  libsvn_subr\io.c(3427)
>   open_pack_or_rev_file + 0x48,  libsvn_fs_fs\rev_file.c(67)
>   svn_fs_fs__open_pack_or_rev_file + 0x45,  libsvn_fs_fs\rev_file.c(124)
>   open_and_seek_revision + 0x52,  libsvn_fs_fs\cached_data.c(217)
>   get_node_revision_body + 0x1a7,  libsvn_fs_fs\cached_data.c(338)
>   svn_fs_fs__get_node_revision + 0x2a,  libsvn_fs_fs\cached_data.c(387)
>   shards_spanned + 0x7a,  libsvn_fs_fs\transaction.c(1858)
>   choose_delta_base + 0x8e,  libsvn_fs_fs\transaction.c(1925)
>   write_container_delta_rep + 0xd5,  libsvn_fs_fs\transaction.c(2655)
>   write_final_rev + 0x22b,  libsvn_fs_fs\transaction.c(2923)
>   commit_body + 0x344,  libsvn_fs_fs\transaction.c(3843)
>   ...
> ]]]
>
> Now, if you examine the core FSFS routines like 'get_node_revision_body',
> you
> can notice that some of them close the temporary
> 'svn_fs_fs__revision_file_t'
> objects, but some of them do not, e.g., svn_fs_fs__get_changes does, but
> get_node_revision_body does not (for the physical addressing mode).  In the
> latter case, this can lead to various sorts of problems, one of which was
> caught by the fs-fs-pack-tests.
>
> This behavior looks like a regression from 1.8.x, where these routines did
> close the temporary file handles via explicit 'svn_io_file_close' calls or
> via
> less explicit 'svn_stream_close' calls for the streams with DISOWN=FALSE.
> I've attached a patch that restores this behavior for FSFS7.  The invariant
> is quite simple: on any non-erroneous flow, a routine should not leak the
> file
> handle(s) in the POOL that come from the temporary
> 'svn_fs_fs__revision_file_t'
> object(s).
>
> NOTE: It looks like FSX suffers from the same kind of problem.  There are
> 77
> failing tests from the standalone suite (client-test.exe, fs-test.exe,
> ...) and
> any attempt to run the Python tests (basic_tests.py, ...) immediately fails
> during the greek tree initialization phase.  I guess I might be able to
> come up
> with a patch for this problem in the nearby future (in case someone does
> not
> fix it earlier):
>
> [[[
>   (client-test.exe --fs-type=fsx)
>
>   svn_tests: E720145: Can't remove directory
>   'BUILDPATH\subversion\tests\cmdline\svn-test-work\libsvn_client\
>   test-wc-add-repos\db\transactions\0-0.txn': The directory is not empty.
>   FAIL:  client-test.exe 3: test svn_wc_add3 scenarios
>
>   (win-tests.py --fs-type=fsx --test=basic_tests.py --log-to-stdout)
>
>   Testing Release configuration on local repository.
>   START: basic_tests.py
>   E: import did not succeed, while creating greek repos.
>   E: The final line from 'svn import' was:
>   E: Can't remove directory
>   'BUILDPATH\subversion\tests\cmdline\svn-test-work\local-tmp\
>   repos\db\transactions\0-0.txn': The directory is not empty.
> ]]]
>
> [1] http://technet.microsoft.com/sysinternals/bb896645
>
>
> Thanks and regards,
> Evgeny Kotkov
>

Hi Evgeny,

Thanks for the patch! Reviewed and committed as r1559777.

-- Stefan^2.


P.S.: Ugh, Windows! ;)

Reply via email to