Author: danielsh
Date: Tue Sep 21 12:42:25 2010
New Revision: 999375

URL: http://svn.apache.org/viewvc?rev=999375&view=rev
Log:
In svnsync, don't leave a stray lock when cancelled.

* subversion/svnsync/main.c
  (maybe_unlock):  New helper.
  (get_lock):  When cancelled, don't leave a stray lock behind.

Modified:
    subversion/trunk/subversion/svnsync/main.c

Modified: subversion/trunk/subversion/svnsync/main.c
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/svnsync/main.c?rev=999375&r1=999374&r2=999375&view=diff
==============================================================================
--- subversion/trunk/subversion/svnsync/main.c (original)
+++ subversion/trunk/subversion/svnsync/main.c Tue Sep 21 12:42:25 2010
@@ -284,6 +284,23 @@ check_lib_versions(void)
 }
 
 
+/* Remove the lock on SESSION iff the lock is owned by MYLOCKTOKEN. */
+static svn_error_t *
+maybe_unlock(svn_ra_session_t *session,
+             const svn_string_t *mylocktoken,
+             apr_pool_t *scratch_pool)
+{
+  const svn_string_t *reposlocktoken;
+
+  SVN_ERR(svn_ra_rev_prop(session, 0, SVNSYNC_PROP_LOCK, &reposlocktoken,
+                          scratch_pool));
+  if (reposlocktoken && strcmp(reposlocktoken->data, mylocktoken->data) == 0)
+    SVN_ERR(svn_ra_change_rev_prop(session, 0, SVNSYNC_PROP_LOCK, NULL,
+                                   scratch_pool));
+
+  return SVN_NO_ERROR;
+}
+
 /* Acquire a lock (of sorts) on the repository associated with the
  * given RA SESSION. This lock is just a revprop change attempt in a
  * time-delay loop. This function is duplicated by svnrdump in
@@ -314,12 +331,21 @@ get_lock(svn_ra_session_t *session, apr_
 #define SVNSYNC_LOCK_RETRIES 10
   for (i = 0; i < SVNSYNC_LOCK_RETRIES; ++i)
     {
+      svn_error_t *err;
+
       svn_pool_clear(subpool);
-      SVN_ERR(check_cancel(NULL));
+
+      /* If we're cancelled, don't leave a stray lock behind. */
+      err = check_cancel(NULL);
+      if (err && err->apr_err == SVN_ERR_CANCELLED)
+       return svn_error_compose_create(
+                    maybe_unlock(session, mylocktoken, subpool),
+                    err);
+      else
+       SVN_ERR(err);
 
       SVN_ERR(svn_ra_rev_prop(session, 0, SVNSYNC_PROP_LOCK, &reposlocktoken,
                               subpool));
-
       if (reposlocktoken)
         {
           /* Did we get it?   If so, we're done, otherwise we sleep. */


Reply via email to