Author: svn-role
Date: Thu Nov 20 04:01:23 2014
New Revision: 1640665

URL: http://svn.apache.org/r1640665
Log:
Merge the 1.8.x-r1611379 branch:

 * r1619380, r1619393
   Fix diff of a locally copied directory with props: it showed all props
   as added instead of a diff against the copy-from props.
   Justification:
     Behaviour regression introduced in 1.8.0.
   Notes:
     r1619380 is the fix; r1619393 a test for it.
     The test on trunk@1619393 is tweaked to account for a trunk bug in the
     display of diff headers; the backport branch provides the correct
     version for 1.8.x.
   Branch:
     ^/subversion/branches/1.8.x-r1611379
   Votes:
     +1: julianfoad, rhuijben, stefan2

Modified:
    subversion/branches/1.8.x/   (props changed)
    subversion/branches/1.8.x/STATUS
    subversion/branches/1.8.x/subversion/include/private/svn_io_private.h
    subversion/branches/1.8.x/subversion/libsvn_subr/io.c
    subversion/branches/1.8.x/subversion/libsvn_subr/named_atomic.c

Propchange: subversion/branches/1.8.x/
------------------------------------------------------------------------------
  Merged /subversion/trunk:r1611379,1612405,1615354,1617687
  Merged /subversion/branches/1.8.x-r1611379:r1612525-1640664

Modified: subversion/branches/1.8.x/STATUS
URL: 
http://svn.apache.org/viewvc/subversion/branches/1.8.x/STATUS?rev=1640665&r1=1640664&r2=1640665&view=diff
==============================================================================
--- subversion/branches/1.8.x/STATUS (original)
+++ subversion/branches/1.8.x/STATUS Thu Nov 20 04:01:23 2014
@@ -146,18 +146,3 @@ Veto-blocked changes:
 
 Approved changes:
 =================
-
- * r1619380, r1619393
-   Fix diff of a locally copied directory with props: it showed all props
-   as added instead of a diff against the copy-from props.
-   Justification:
-     Behaviour regression introduced in 1.8.0.
-   Notes:
-     r1619380 is the fix; r1619393 a test for it.
-     The test on trunk@1619393 is tweaked to account for a trunk bug in the
-     display of diff headers; the backport branch provides the correct
-     version for 1.8.x.
-   Branch:
-     ^/subversion/branches/1.8.x-r1611379
-   Votes:
-     +1: julianfoad, rhuijben, stefan2

Modified: subversion/branches/1.8.x/subversion/include/private/svn_io_private.h
URL: 
http://svn.apache.org/viewvc/subversion/branches/1.8.x/subversion/include/private/svn_io_private.h?rev=1640665&r1=1640664&r2=1640665&view=diff
==============================================================================
--- subversion/branches/1.8.x/subversion/include/private/svn_io_private.h 
(original)
+++ subversion/branches/1.8.x/subversion/include/private/svn_io_private.h Thu 
Nov 20 04:01:23 2014
@@ -64,6 +64,18 @@ svn_io__is_finfo_read_only(svn_boolean_t
                            apr_pool_t *pool);
 
 
+/**
+ * Lock file at @a lock_file. If that file does not exist, create an empty
+ * file.
+ *
+ * Lock will be automatically released when @a pool is cleared or destroyed.
+ * Use @a pool for memory allocations.
+ */
+svn_error_t *
+svn_io__file_lock_autocreate(const char *lock_file,
+                             apr_pool_t *pool);
+
+
 /** Buffer test handler function for a generic stream. @see svn_stream_t
  * and svn_stream__is_buffered().
  *

Modified: subversion/branches/1.8.x/subversion/libsvn_subr/io.c
URL: 
http://svn.apache.org/viewvc/subversion/branches/1.8.x/subversion/libsvn_subr/io.c?rev=1640665&r1=1640664&r2=1640665&view=diff
==============================================================================
--- subversion/branches/1.8.x/subversion/libsvn_subr/io.c (original)
+++ subversion/branches/1.8.x/subversion/libsvn_subr/io.c Thu Nov 20 04:01:23 
2014
@@ -2089,6 +2089,35 @@ svn_io_file_lock2(const char *lock_file,
   return svn_io_lock_open_file(lockfile_handle, exclusive, nonblocking, pool);
 }
 
+svn_error_t *
+svn_io__file_lock_autocreate(const char *lock_file,
+                             apr_pool_t *pool)
+{
+  svn_error_t *err
+    = svn_io_file_lock2(lock_file, TRUE, FALSE, pool);
+  if (err && APR_STATUS_IS_ENOENT(err->apr_err))
+    {
+      /* No lock file?  No big deal; these are just empty files anyway.
+         Create it and try again. */
+      svn_error_clear(err);
+
+      /* This file creation is racy.
+         We don't care as long as file gets created at all. */
+      err = svn_io_file_create(lock_file, "", pool);
+      if (err && APR_STATUS_IS_EEXIST(err->apr_err))
+        {
+          svn_error_clear(err);
+          err = NULL;
+        }
+
+      /* Finally, lock the file - if it exists */
+      if (!err)
+        err = svn_io_file_lock2(lock_file, TRUE, FALSE, pool);
+    }
+
+  return svn_error_trace(err);
+}
+
 
 
 /* Data consistency/coherency operations. */

Modified: subversion/branches/1.8.x/subversion/libsvn_subr/named_atomic.c
URL: 
http://svn.apache.org/viewvc/subversion/branches/1.8.x/subversion/libsvn_subr/named_atomic.c?rev=1640665&r1=1640664&r2=1640665&view=diff
==============================================================================
--- subversion/branches/1.8.x/subversion/libsvn_subr/named_atomic.c (original)
+++ subversion/branches/1.8.x/subversion/libsvn_subr/named_atomic.c Thu Nov 20 
04:01:23 2014
@@ -32,6 +32,7 @@
 #include "svn_pools.h"
 #include "svn_dirent_uri.h"
 #include "svn_io.h"
+#include "private/svn_io_private.h"
 
 /* Implementation aspects.
  *
@@ -197,8 +198,8 @@ struct shared_data_t
  */
 struct mutex_t
 {
-  /* Inter-process sync. is handled by through lock file. */
-  apr_file_t *lock_file;
+  /* Inter-process sync. is handled by through a lock file. */
+  const char *lock_name;
 
   /* Pool to be used with lock / unlock functions */
   apr_pool_t *pool;
@@ -275,14 +276,13 @@ static svn_error_t *
 lock(struct mutex_t *mutex)
 {
   svn_error_t *err;
-
-  /* Get lock on the filehandle. */
   SVN_ERR(svn_mutex__lock(thread_mutex));
-  err = svn_io_lock_open_file(mutex->lock_file, TRUE, FALSE, mutex->pool);
 
-  return err
-    ? svn_mutex__unlock(thread_mutex, err)
-    : err;
+  err = svn_io__file_lock_autocreate(mutex->lock_name, mutex->pool);
+  if (err)
+    err = svn_mutex__unlock(thread_mutex, err);
+
+  return svn_error_trace(err);
 }
 
 /* Utility that releases the lock previously acquired via lock().  If the
@@ -292,37 +292,10 @@ lock(struct mutex_t *mutex)
 static svn_error_t *
 unlock(struct mutex_t *mutex, svn_error_t * outer_err)
 {
-  svn_error_t *unlock_err
-      = svn_io_unlock_open_file(mutex->lock_file, mutex->pool);
-  return svn_mutex__unlock(thread_mutex,
-                           svn_error_compose_create(outer_err,
-                                                    unlock_err));
+  svn_pool_clear(mutex->pool);
+  return svn_mutex__unlock(thread_mutex, outer_err);
 }
 
-#if APR_HAS_MMAP
-/* The last user to close a particular namespace should also remove the
- * lock file.  Failure to do so, however, does not affect further uses
- * of the same namespace.
- */
-static apr_status_t
-delete_lock_file(void *arg)
-{
-  struct mutex_t *mutex = arg;
-  const char *lock_name = NULL;
-
-  /* locks have already been cleaned up. Simply close the file */
-  apr_status_t status = apr_file_close(mutex->lock_file);
-
-  /* Remove the file from disk. This will fail if there ares still other
-   * users of this lock file, i.e. namespace. */
-  apr_file_name_get(&lock_name, mutex->lock_file);
-  if (lock_name)
-    apr_file_remove(lock_name, mutex->pool);
-
-  return status;
-}
-#endif /* APR_HAS_MMAP */
-
 /* Validate the ATOMIC parameter, i.e it's address.  Correct code will
  * never need this but if someone should accidentally to use a NULL or
  * incomplete structure, let's catch that here instead of segfaulting.
@@ -411,29 +384,18 @@ svn_atomic_namespace__create(svn_atomic_
    */
   svn_atomic_namespace__t *new_ns = apr_pcalloc(result_pool, sizeof(**ns));
 
-  /* construct the names of the system objects that we need
+  /* construct the name of the system objects that we need
    */
   shm_name = apr_pstrcat(subpool, name, SHM_NAME_SUFFIX, NULL);
-  lock_name = apr_pstrcat(subpool, name, MUTEX_NAME_SUFFIX, NULL);
+  lock_name = apr_pstrcat(result_pool, name, MUTEX_NAME_SUFFIX, NULL);
 
   /* initialize the lock objects
    */
   SVN_ERR(svn_atomic__init_once(&mutex_initialized, init_thread_mutex, NULL,
                                 result_pool));
 
-  new_ns->mutex.pool = result_pool;
-  SVN_ERR(svn_io_file_open(&new_ns->mutex.lock_file, lock_name,
-                           APR_READ | APR_WRITE | APR_CREATE,
-                           APR_OS_DEFAULT,
-                           result_pool));
-
-  /* Make sure the last user of our lock file will actually remove it.
-   * Please note that only the last file handle begin closed will actually
-   * remove the underlying file (see docstring for apr_file_remove).
-   */
-  apr_pool_cleanup_register(result_pool, &new_ns->mutex,
-                            delete_lock_file,
-                            apr_pool_cleanup_null);
+  new_ns->mutex.pool = svn_pool_create(result_pool);
+  new_ns->mutex.lock_name = lock_name;
 
   /* Prevent concurrent initialization.
    */
@@ -482,17 +444,21 @@ svn_atomic_namespace__create(svn_atomic_
        * with our data file)
        */
       if (new_ns->data->count > MAX_ATOMIC_COUNT)
-        return svn_error_create(SVN_ERR_CORRUPTED_ATOMIC_STORAGE, 0,
-                       _("Number of atomics in namespace is too large."));
-
-      /* Cache the number of existing, complete entries.  There can't be
-       * incomplete ones from other processes because we hold the mutex.
-       * Our process will also not access this information since we are
-       * either being called from within svn_atomic__init_once or by
-       * svn_atomic_namespace__create for a new object.
-       */
-      new_ns->min_used = new_ns->data->count;
-      *ns = new_ns;
+        {
+          err = svn_error_create(SVN_ERR_CORRUPTED_ATOMIC_STORAGE, 0,
+                        _("Number of atomics in namespace is too large."));
+        }
+      else
+        {
+          /* Cache the number of existing, complete entries.  There can't be
+           * incomplete ones from other processes because we hold the mutex.
+           * Our process will also not access this information since we are
+           * either being called from within svn_atomic__init_once or by
+           * svn_atomic_namespace__create for a new object.
+           */
+          new_ns->min_used = new_ns->data->count;
+          *ns = new_ns;
+        }
     }
 
   /* Unlock to allow other processes may access the shared memory as well.


Reply via email to