On Thu, Oct 14, 2010 at 09:00:44PM -0000, hwri...@apache.org wrote:
> Author: hwright
> Date: Thu Oct 14 21:00:43 2010
> New Revision: 1022707
> 
> URL: http://svn.apache.org/viewvc?rev=1022707&view=rev
> Log:
> Merge r985472 from the performance branch, which see for more information.
> 
> This revision randomizes the numerical suffix of temporary files, in an effort
> to make finding one easier.
> 
> Modified:
>     subversion/trunk/   (props changed)
>     subversion/trunk/subversion/libsvn_subr/io.c
> 
> Propchange: subversion/trunk/
> ------------------------------------------------------------------------------
> --- svn:mergeinfo (original)
> +++ svn:mergeinfo Thu Oct 14 21:00:43 2010
> @@ -23,7 +23,7 @@
>  /subversion/branches/log-g-performance:870941-871032
>  /subversion/branches/merge-skips-obstructions:874525-874615
>  /subversion/branches/nfc-nfd-aware-client:870276,870376
> -/subversion/branches/performance:982355,983764,983766,984927,985014,985037,985046,985477,985669,987888,987893,995507,995603,1001413
> +/subversion/branches/performance:982355,983764,983766,984927,985014,985037,985046,985472,985477,985669,987888,987893,995507,995603,1001413
>  /subversion/branches/ra_serf-digest-authn:875693-876404
>  /subversion/branches/reintegrate-improvements:873853-874164
>  /subversion/branches/subtree-mergeinfo:876734-878766
> 
> Modified: subversion/trunk/subversion/libsvn_subr/io.c
> URL: 
> http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_subr/io.c?rev=1022707&r1=1022706&r2=1022707&view=diff
> ==============================================================================
> --- subversion/trunk/subversion/libsvn_subr/io.c (original)
> +++ subversion/trunk/subversion/libsvn_subr/io.c Thu Oct 14 21:00:43 2010
> @@ -334,6 +334,10 @@ svn_io_open_uniquely_named(apr_file_t **
>    unsigned int i;
>    struct temp_file_cleanup_s *baton = NULL;
>  
> +  /* At the beginning, we don't know whether unique_path will need 
> +     UTF8 conversion */
> +  svn_boolean_t needs_utf8_conversion = TRUE;
> +
>    SVN_ERR_ASSERT(file || unique_path);
>  
>    if (dirpath == NULL)
> @@ -374,6 +378,11 @@ svn_io_open_uniquely_named(apr_file_t **
>        if (delete_when == svn_io_file_del_on_close)
>          flag |= APR_DELONCLOSE;
>  
> +      /* Increase the chance that rand() will return something truely
> +         independent from what others get or do. */
> +      if (i == 2)
> +        srand(apr_time_now());
> +
>        /* Special case the first attempt -- if we can avoid having a
>           generated numeric portion at all, that's best.  So first we
>           try with just the suffix; then future tries add a number
> @@ -384,17 +393,35 @@ svn_io_open_uniquely_named(apr_file_t **
>           This is good, since "1" would misleadingly imply that
>           the second attempt was actually the first... and if someone's
>           got conflicts on their conflicts, we probably don't want to
> -         add to their confusion :-). */
> +         add to their confusion :-). 
> +
> +         Also, the randomization used to minimize the number of re-try 
> +         cycles will interfere with certain tests that compare working
> +         copies etc.
> +       */
>        if (i == 1)
>          unique_name = apr_psprintf(scratch_pool, "%s%s", path, suffix);
>        else
> -        unique_name = apr_psprintf(scratch_pool, "%s.%u%s", path, i, suffix);
> +        unique_name = apr_psprintf(scratch_pool, "%s.%u_%x%s", path, i, 
> rand(), suffix);

-1 on using rand() here, for several reasons:

The intent of svn_io_open_uniquely_named() is to provide user-facing
temporary files. The order of numbers actually carry meaning in some cases.
With files named svn-commit.tmp, svn-commit.2.tmp, svn-commit.3.tmp, users
can easily tell which one is the newest by looking at the number.
Names with random numbers don't provide this information.

We already have a different function to create truely randomly-named
temporary files, svn_io_open_unique_file3(). It should be used instead
of svn_io_open_uniquely_named() wherever doing so doesn't hurt user
convenience (i.e. for any tempfile a user will never directly work with).

Also, rand() isn't thread-safe, and this is library code.

>  
>        /* Hmmm.  Ideally, we would append to a native-encoding buf
>           before starting iteration, then convert back to UTF-8 for
>           return. But I suppose that would make the appending code
>           sensitive to i18n in a way it shouldn't be... Oh well. */
> -      SVN_ERR(cstring_from_utf8(&unique_name_apr, unique_name, 
> scratch_pool));
> +      if (needs_utf8_conversion)
> +        {
> +          SVN_ERR(cstring_from_utf8(&unique_name_apr, unique_name, 
> scratch_pool));
> +          if (i == 1)
> +            {
> +              /* The variable parts of unique_name will not require UTF8
> +                 conversion. Therefore, if UTF8 conversion had no effect
> +                 on it in the first iteration, it won't require conversion
> +                 in any future interation. */

This part is nice though, good catch.

Stefan

> +              needs_utf8_conversion = strcmp(unique_name_apr, unique_name);
> +            }
> +        }
> +      else
> +        unique_name_apr = unique_name;
>  
>        apr_err = file_open(&try_file, unique_name_apr, flag,
>                            APR_OS_DEFAULT, FALSE, result_pool);
> 

Reply via email to