On Fri, Nov 27, 2009 at 04:14:08PM -0000, Jon Foster wrote: > Hi, > > As discussed on this list, we don't always need svnsync's networked > lock. If svnsync only runs on a single server, the administrator > can use the "flock" tool to prevent running multiple copies of > svnsync at the same time. > > And if svnsync's lock is not needed, then it is actually an > inconvenience. E.g. if the network connection fails, then a stale > lock can be left behind. This requires manual administrator > intervention to fix. > > One workaround is for your scripts to run this command immediately > before they start svnsync: > svn propdel svn:sync-lock --revprop -r0 $target_url > > However, it would be better to provide a command-line option to > disable svnsync's locking. So, here's a patch to do that. > > The option name has been chosen to try to make it obvious that no > locking is a bad idea, and administrators should either use > svnsync's internal locking or have their own external locking. > > [[[ > Add --using-external-locking option to svnsync. > > * subversion/svnsync/main.c > (svnsync__opt): Add svnsync_opt_using_external_locking. > (SVNSYNC_OPTS_DEFAULT): Add svnsync_opt_using_external_locking. > (svnsync_options): Add entry for --using-external-locking. > (opt_baton_t): Add using_external_locking member. > (initialize_cmd, synchronize_cmd, copy_revprops_cmd): Don't take the > lock if using external locking. > (main): Handle svnsync_opt_using_external_locking option. > > Patch by: Jon Foster <jon.fos...@cabot.co.uk> > ]]]
Hi Jon, I've finally found time to take a look at this. Sorry for taking so long. I have committed your patch in r910212, with some tweaks. Just so you know what the tweaks were: > Index: subversion/svnsync/main.c > =================================================================== > --- subversion/svnsync/main.c (revision 884900) > +++ subversion/svnsync/main.c (working copy) > @@ -61,6 +61,7 @@ > svnsync_opt_sync_password, > svnsync_opt_config_dir, > svnsync_opt_config_options, > + svnsync_opt_using_external_locking, I've renamed this option to --disable-locking. Matter of taste, really. > svnsync_opt_version, > svnsync_opt_trust_server_cert, > svnsync_opt_allow_non_empty, > @@ -76,7 +77,8 @@ > svnsync_opt_sync_username, \ > svnsync_opt_sync_password, \ > svnsync_opt_config_dir, \ > - svnsync_opt_config_options > + svnsync_opt_config_options, \ > + svnsync_opt_using_external_locking You've added the option as a global option for all subcommands. I've made the option specific to the 'init', 'sync', and 'copy-revprops' subcommands instead. It's not useful with other subcommands. > > static const svn_opt_subcommand_desc2_t svnsync_cmd_table[] = > { > @@ -180,6 +182,10 @@ > "For example:\n" > " " > " servers:global:http-library=serf")}, > + {"using-external-locking", svnsync_opt_using_external_locking, 0, > + N_("Disable built in locking. You must ensure that\n" > + " " > + "no other instance of svnsync is running.")}, I've tweaked the help text a bit, to make clear that the mirror can get corrupted if this option is used and nothing is done to avoid running multiple instances of svnsync in parallel. > {"version", svnsync_opt_version, 0, > N_("show program version information")}, > {"help", 'h', 0, > @@ -201,6 +207,7 @@ > const char *sync_password; > const char *config_dir; > apr_hash_t *config; > + svn_boolean_t using_external_locking; > svn_boolean_t quiet; > svn_boolean_t allow_non_empty; > svn_boolean_t version; > @@ -798,7 +805,14 @@ > SVN_ERR(svn_ra_open3(&to_session, baton->to_url, NULL, > &(baton->sync_callbacks), baton, baton->config, > pool)); > SVN_ERR(check_if_session_is_at_repos_root(to_session, baton->to_url, > pool)); > - SVN_ERR(with_locked(to_session, do_initialize, baton, pool)); > + if (opt_baton->using_external_locking) > + { We don't require braces around single-line if-blocks, so I've removed them. > + SVN_ERR(do_initialize(to_session, baton, pool)); > + } > + else > + { > + SVN_ERR(with_locked(to_session, do_initialize, baton, pool)); > + } > > return SVN_NO_ERROR; > } > @@ -1276,7 +1290,14 @@ > SVN_ERR(svn_ra_open3(&to_session, baton->to_url, NULL, > &(baton->sync_callbacks), baton, baton->config, > pool)); > SVN_ERR(check_if_session_is_at_repos_root(to_session, baton->to_url, > pool)); > - SVN_ERR(with_locked(to_session, do_synchronize, baton, pool)); > + if (opt_baton->using_external_locking) > + { > + SVN_ERR(do_synchronize(to_session, baton, pool)); > + } > + else > + { > + SVN_ERR(with_locked(to_session, do_synchronize, baton, pool)); > + } > > return SVN_NO_ERROR; > } > @@ -1433,7 +1454,14 @@ > SVN_ERR(svn_ra_open3(&to_session, baton->to_url, NULL, > &(baton->sync_callbacks), baton, baton->config, > pool)); > SVN_ERR(check_if_session_is_at_repos_root(to_session, baton->to_url, > pool)); > - SVN_ERR(with_locked(to_session, do_copy_revprops, baton, pool)); > + if (opt_baton->using_external_locking) > + { > + SVN_ERR(do_synchronize(to_session, baton, pool)); > + } > + else > + { > + SVN_ERR(with_locked(to_session, do_synchronize, baton, pool)); > + } This bit you added here is calling the wrong function. It should call do_copy_revprops(), not do_synchronize(). > > return SVN_NO_ERROR; > } > @@ -1664,6 +1692,10 @@ > if (err) > return svn_cmdline_handle_exit_error(err, pool, "svnsync: "); > break; > + > + case svnsync_opt_using_external_locking: > + opt_baton.using_external_locking = TRUE; > + You've missed adding a 'break;' here. I've fixed this. > case svnsync_opt_version: > opt_baton.version = TRUE; > break; Thanks for the patch! Stefan