Author: philip
Date: Tue Dec 10 18:34:16 2013
New Revision: 1549924

URL: http://svn.apache.org/r1549924
Log:
When creating L2P and P2L index files allow for a previous failed
commit that created obstructing, read-only, files.

* subversion/libsvn_fs_fs/index.c:
  (index_create): New.
  (svn_fs_fs__l2p_index_create,
   svn_fs_fs__p2l_index_create): Call index_create.

Modified:
    subversion/trunk/subversion/libsvn_fs_fs/index.c

Modified: subversion/trunk/subversion/libsvn_fs_fs/index.c
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_fs/index.c?rev=1549924&r1=1549923&r2=1549924&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs_fs/index.c (original)
+++ subversion/trunk/subversion/libsvn_fs_fs/index.c Tue Dec 10 18:34:16 2013
@@ -533,6 +533,33 @@ svn_fs_fs__l2p_proto_index_add_entry(apr
                                                     pool));
 }
 
+static svn_error_t *
+index_create(apr_file_t **index_file, const char *file_name, apr_pool_t *pool)
+{
+  int i;
+  svn_boolean_t first = TRUE;
+  svn_error_t *err;
+
+  while (TRUE)
+    {
+      err = svn_io_file_open(index_file, file_name,
+                             APR_WRITE | APR_CREATE | APR_TRUNCATE
+                             | APR_BUFFERED,
+                             APR_OS_DEFAULT, pool);
+
+      /* ### Do we need another check, EEXIST say, on Windows FAT32? */
+      if (!err || !first || !APR_STATUS_IS_EACCES(err->apr_err))
+        break;
+
+      /* File may exist and be read-only from a previous, failed, commit. */
+      svn_error_clear(err);
+      svn_error_clear(svn_io_remove_file2(file_name, TRUE, pool));
+      first = FALSE;
+    }
+
+  return err;
+}
+
 svn_error_t *
 svn_fs_fs__l2p_index_create(svn_fs_t *fs,
                             const char *file_name,
@@ -632,9 +659,7 @@ svn_fs_fs__l2p_index_create(svn_fs_t *fs
   SVN_ERR(svn_io_file_close(proto_index, local_pool));
 
   /* create the target file */
-  SVN_ERR(svn_io_file_open(&index_file, file_name, APR_WRITE
-                           | APR_CREATE | APR_TRUNCATE | APR_BUFFERED,
-                           APR_OS_DEFAULT, local_pool));
+  SVN_ERR(index_create(&index_file, file_name, local_pool));
 
   /* write header info */
   SVN_ERR(svn_io_file_write_full(index_file, encoded,
@@ -1672,9 +1697,7 @@ svn_fs_fs__p2l_index_create(svn_fs_t *fs
       = svn_spillbuf__get_size(buffer) - last_buffer_size;
 
   /* create the target file */
-  SVN_ERR(svn_io_file_open(&index_file, file_name, APR_WRITE
-                           | APR_CREATE | APR_TRUNCATE | APR_BUFFERED,
-                           APR_OS_DEFAULT, local_pool));
+  SVN_ERR(index_create(&index_file, file_name, local_pool));
 
   /* write the start revision, file size and page size */
   SVN_ERR(svn_io_file_write_full(index_file, encoded,


Reply via email to