> -----Original Message-----
> From: s...@apache.org [mailto:s...@apache.org]
> Sent: vrijdag 30 juli 2010 16:54
> To: comm...@subversion.apache.org
> Subject: svn commit: r980811 - in
> /subversion/trunk/subversion/libsvn_fs_fs: fs.h fs_fs.c
> 
> Author: stsp
> Date: Fri Jul 30 14:54:26 2010
> New Revision: 980811
> 
> URL: http://svn.apache.org/viewvc?rev=980811&view=rev
> Log:
> Fix the "missing fsfs.conf" file situation in FSFS.
> This is a follow-up to the partial fix made in r905303.
> 
> Make svnadmin upgrade create the fsfs.conf file, and make svnadmin
> hotcopy ask the user to run svnadmin upgrade if the file is missing.
> 
> * subversion/libsvn_fs_fs/fs.h
>   (SVN_FS_FS__MIN_CONFIG_FILE): New constant.
> 
> * subversion/libsvn_fs_fs/fs_fs.c
>   (upgrade_body): Try to create the fsfs.conf config file if it is not
>    a file, and error out if it is a directory.
>   (svn_fs_fs__hotcopy): Only try to copy fsfs.conf if the format is
>    new enough to support fsfs.conf. If copying fsfs.conf fails because
>    it does not exist, raise an error asking the user to run svnadmin
> upgrade.
> 
> Review by: danielsh
> (but he saw a slightly older version of this diff)
> 
> Modified:
>     subversion/trunk/subversion/libsvn_fs_fs/fs.h
>     subversion/trunk/subversion/libsvn_fs_fs/fs_fs.c
> 
> Modified: subversion/trunk/subversion/libsvn_fs_fs/fs.h
> URL:
> http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_fs/f
> s.h?rev=980811&r1=980810&r2=980811&view=diff
> =======================================================================
> =======
> --- subversion/trunk/subversion/libsvn_fs_fs/fs.h (original)
> +++ subversion/trunk/subversion/libsvn_fs_fs/fs.h Fri Jul 30 14:54:26
> 2010
> @@ -125,6 +125,9 @@ extern "C" {
>  /* The minimum format number that supports packed revprop shards. */
>  #define SVN_FS_FS__MIN_PACKED_REVPROP_FORMAT 5
> 
> +/* The minimum format number that supports a configuration file
> (fsfs.conf) */
> +#define SVN_FS_FS__MIN_CONFIG_FILE 4
> +
>  /* Private FSFS-specific data shared between all svn_txn_t objects
> that
>     relate to a particular transaction in a filesystem (as identified
>     by transaction id and filesystem UUID).  Objects of this type are
> 
> Modified: subversion/trunk/subversion/libsvn_fs_fs/fs_fs.c
> URL:
> http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_fs/f
> s_fs.c?rev=980811&r1=980810&r2=980811&view=diff
> =======================================================================
> =======
> --- subversion/trunk/subversion/libsvn_fs_fs/fs_fs.c (original)
> +++ subversion/trunk/subversion/libsvn_fs_fs/fs_fs.c Fri Jul 30
> 14:54:26 2010
> @@ -1275,11 +1275,32 @@ upgrade_body(void *baton, apr_pool_t *po
>    fs_fs_data_t *ffd = fs->fsap_data;
>    int format, max_files_per_dir;
>    const char *format_path = path_format(fs, pool);
> +  svn_node_kind_t kind;
> 
>    /* Read the FS format number and max-files-per-dir setting. */
>    SVN_ERR(read_format(&format, &max_files_per_dir, format_path,
> pool));
> 
> -  /* If we're already up-to-date, there's nothing to be done here. */
> +  /* If the config file does not exist, create one. */
> +  SVN_ERR(svn_io_check_path(svn_dirent_join(fs->path, PATH_CONFIG,
> pool),
> +                            &kind, pool));
> +  switch (kind)
> +    {
> +    case svn_node_none:
> +      SVN_ERR(write_config(fs, pool));
> +      break;
> +    case svn_node_dir:
> +      return svn_error_return(svn_error_createf(SVN_ERR_FS_GENERAL,
> NULL,
> +                                                _("'%s' is a
> directory. "
> +                                                  "Please move it out
> of "
> +                                                  "the way and try
> again"),
> +                                                svn_dirent_join(fs-
> >path,
> +
> PATH_CONFIG,
> +
> pool)));
> +    default:
> +      break;
> +    }
> +
> +  /* If we're already up-to-date, there's nothing else to be done
> here. */
>    if (format == SVN_FS_FS__FORMAT_NUMBER)
>      return SVN_NO_ERROR;
> 
> @@ -1496,15 +1517,64 @@ svn_fs_fs__hotcopy(const char *src_path,
>                        pool));
>    SVN_ERR(check_format(format));
> 
> +  /* Try to copy the config.
> +   *
> +   * ### We try copying the config file before doing anything else,
> +   * ### because higher layers will abort the hotcopy if we throw
> +   * ### an error from this function, and that renders the hotcopy
> +   * ### unusable anyway. */
> +  if (format >= SVN_FS_FS__MIN_CONFIG_FILE)
> +    {
> +      svn_error_t *err;
> +
> +      err = svn_io_dir_file_copy(src_path, dst_path, PATH_CONFIG,
> pool);
> +      if (err)
> +        {
> +          if (APR_STATUS_IS_ENOENT(err->apr_err))
> +            {
> +              /* 1.6.0 to 1.6.11 did not copy the configuration file
> during
> +               * hotcopy. So if we're hotcopying a repository which
> has been
> +               * created as a hotcopy itself, it's possible that
> fsfs.conf
> +               * does not exist. Ask the user to re-create it.
> +               *
> +               * ### It would be nice to make this a non-fatal error,
> +               * ### but this function does not get an svn_fs_t object
> +               * ### so we have no way of just printing a warning via
> +               * ### the fs->warning() callback. */
> +
> +              const char *msg;
> +              const char *src_abspath;
> +              const char *dst_abspath;
> +              const char *config_relpath;
> +

You leak the error in err here.
 
> +              config_relpath = svn_dirent_join(src_path, PATH_CONFIG,
> pool);
> +              SVN_ERR(svn_dirent_get_absolute(&src_abspath, src_path,
> pool));
> +              SVN_ERR(svn_dirent_get_absolute(&dst_abspath, dst_path,
> pool));
> +
> +              /* ### hack: strip off the 'db/' directory from paths so
> +               * ### they make sense to the user */
> +              src_abspath = svn_dirent_dirname(src_abspath, pool);
> +              dst_abspath = svn_dirent_dirname(dst_abspath, pool);
> +
> +              msg = apr_psprintf(pool,
> +                                 _("Failed to create hotcopy at '%s'.
> "
> +                                   "The file '%s' is missing from the
> source "
> +                                   "repository. Please create this
> file, for "
> +                                   "instance by running 'svnadmin
> upgrade %s'"),
> +                                 dst_abspath, config_relpath,
> src_abspath);
> +              return svn_error_return(svn_error_quick_wrap(err, msg));
> +            }
> +          else
> +            return svn_error_return(err);
> +        }
> +    }
> +

Reply via email to