CC += dev@

Stefan Sperling wrote on Thu, Dec 16, 2010 at 18:49:22 +0100:
> On Thu, Dec 16, 2010 at 05:03:00PM +0100, Rainer Dorsch wrote:
> > I try to commit the change
> > 
> > $ svn commit -m "minor change"
> > Sending        README
> > Transmitting file data .svn: Commit failed (details follow):
> > svn: database disk image is malformed
> > svn: database disk image is malformed
> > $ 
> > 
> > And get an error back.
...
> > I found several posts discussing the 
> > 
> >     svn: database disk image is malformed
> > 
> > issue. The best solution is saw is to dump the repository and create a new 
> > one 
> > from the dump.
> >
> > Is there an easier way to fix the problem in a robust manner? Does maybe 
> > even 
> > svn provide some fix scripts?
> 
> This error message is coming from sqlite, not from Subversion.
> You probably have a broken sqlite database in the repository.
> 
> The only place I can think of where sqlite is used in FSFS is
> the rep-cache.db file.
[ For future archeologists, format-5 fsfs repositories (which will
created by Subversion 1.7) will also use sqlite for the revprops.db
file. ]

> Have you got rep-sharing enabled on the repository?
> See the file repos/db/fsfs.conf.
> 
> You can safely disable rep-sharing. Maybe this will get rid of the error.
> If it does, try to recover the rep-sharing.db using sqlite (though I
> don't know how you could do that). If you cannot recover rep-cache.db,
> move it out of the way and Subversion will create a new rep-cache.db
> sqlite database. But it will be empty.
> 
> Representation sharing is not required for a commit to succeed.
> This would explain why you see a successful commit in spite of the error.
> 

How about the second hunk of this patch then?

I haven't compiled it, and it abuses error codes (to use the
specific error code that clients recognize), but is the idea sound?

[[[
Index: subversion/libsvn_fs_fs/fs_fs.c
===================================================================
--- subversion/libsvn_fs_fs/fs_fs.c     (revision 1044834)
+++ subversion/libsvn_fs_fs/fs_fs.c     (working copy)
@@ -5426,9 +5426,20 @@ rep_write_contents_close(void *baton)
   /* Check and see if we already have a representation somewhere that's
      identical to the one we just wrote out. */
   if (ffd->rep_sharing_allowed)
-    /* ### TODO: ignore errors opening the DB (issue #3506) * */
-    SVN_ERR(svn_fs_fs__get_rep_reference(&old_rep, b->fs, rep->sha1_checksum,
-                                         b->parent_pool));
+    {
+      svn_error_t *err;
+      err = svn_fs_fs__get_rep_reference(&old_rep, b->fs, rep->sha1_checksum,
+                                         b->parent_pool);
+      if (err)
+        {
+          /* Something's wrong with the rep-sharing index.  We can continue 
+             without rep-sharing, but warn.
+           */
+          (fs->warning)(fs->warning_baton, err);
+          svn_error_clear(err);
+          old_rep = NULL;
+        }
+    }
   else
     old_rep = NULL;
 
@@ -6377,12 +6388,22 @@ svn_fs_fs__commit(svn_revnum_t *new_rev_p,
  SVN_ERR(svn_fs_fs__with_write_lock(fs, commit_body, &cb, pool));
 
   if (ffd->rep_sharing_allowed)
     {
-      /* ### TODO: ignore errors opening the DB (issue #3506) * */
-      SVN_ERR(svn_fs_fs__open_rep_cache(fs, pool));
-      SVN_ERR(svn_sqlite__with_transaction(ffd->rep_cache_db,
+      svn_error_t *err = SVN_NO_ERROR;
+
+      if (! err)
+        err = svn_fs_fs__open_rep_cache(fs, pool);
+
+      if (! err)
+        err = svn_sqlite__with_transaction(ffd->rep_cache_db,
                                            commit_sqlite_txn_callback,
-                                           &cb, pool));
+                                           &cb, pool);
+
+      if (err)
+        /* The opposite of svn_error_quick_wrap(): same error message,
+           different error code. */
+        return svn_error_create(SVN_ERR_REPOS_POST_COMMIT_HOOK_FAILED, err,
+                                /* TODO: svn_error_best_message() */ 
(err)->message);
     }
 
   return SVN_NO_ERROR;
]]]

> Stefan

Reply via email to