Philip Martin wrote on Wed, Jul 20, 2011 at 15:12:51 +0100:
> Daniel Shahaf <d...@daniel.shahaf.name> writes:
> 
> > Mathias Weinert wrote on Wed, Jul 20, 2011 at 14:59:23 +0200:
> >> 
> >> each time when I am loading a certain dump file on Windows which
> >> contains one revision with over 100K changed paths I get the error
> >> "Can't open file
> >> 'c:\Repositories\test\db\transactions\5445-479.txn\next-ids': The
> >> requested operation cannot be performed on a file with a user-mapped
> >> section open.". After looking at the mailing list archives and other
> >> mailing lists I found out that I am not the only one to encounter
> >> this problem and that in most cases a virus scanner was the cause of
> >> the problem. And indeed, adding next-ids to the exclusion list
> >> solved the problem.
> >> 
> >> But now I wonder if svnadmin couldn't handle this case a bit more
> >> elegantly. IMHO it would make sense not to quit the load immediately
> >> but to try it again maybe after waiting half a second or so if this
> >> specific error occurs (some other users reported that they got the
> >> error "The process cannot access the file because it is being used
> >> by another process."). If we can't access next-ids after trying it
> >> let's say 5 times with a little pause after each try we still can
> >> quit the load process.
> >
> > It would be good to solve this now as that is one of the concerns with
> > the (partially implemented) design for revprop packing, due for release
> > in 1.8.
> 
> The current implementation writes the file inplace:
> 
> static svn_error_t *
> write_next_ids(svn_fs_t *fs,
>                const char *txn_id,
>                const char *node_id,
>                const char *copy_id,
>                apr_pool_t *pool)
> {
>   apr_file_t *file;
>   svn_stream_t *out_stream;
> 
>   SVN_ERR(svn_io_file_open(&file, path_txn_next_ids(fs, txn_id, pool),
>                            APR_WRITE | APR_TRUNCATE,
>                            APR_OS_DEFAULT, pool));
> 
>   out_stream = svn_stream_from_aprfile2(file, TRUE, pool);
> 
>   SVN_ERR(svn_stream_printf(out_stream, pool, "%s %s\n", node_id, copy_id));
> 
>   SVN_ERR(svn_stream_close(out_stream));
>   return svn_io_file_close(file, pool);
> }
> 
> Is there any reason we don't switch to our standard pattern: write to a
> temp file and rename?  That would give us Subversion's standard retry
> loop -- would that fix "requested operation cannot be performed"?

fs_fs.c:move_into_file() already does the rename loop, so no objection.
(assuming we document that the use of move_into_file() is for
performance and virus scanners rather than for concurrent reader
correctness)

> 
> -- 
> uberSVN: Apache Subversion Made Easy
> http://www.uberSVN.com

Reply via email to