You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by st...@apache.org on 2015/01/06 14:12:24 UTC

svn commit: r1649797 - /subversion/trunk/subversion/libsvn_fs_x/fs_x.c

Author: stefan2
Date: Tue Jan  6 13:12:23 2015
New Revision: 1649797

URL: http://svn.apache.org/r1649797
Log:
Simplify the r0 template in FSX.  Because we treat directories with NULL
text reps as empty (and do so efficiently), we can simply ommit the text
rep for the root directory in r0.  The remainder are simple strings that
we can take length info from and that can be composed into r0.

* subversion/libsvn_fs_x/fs_x.c
  (write_revision_zero):  Omit /@0 text rep and compose r0 from strings.
                          Derive offset info from string lengths.

Modified:
    subversion/trunk/subversion/libsvn_fs_x/fs_x.c

Modified: subversion/trunk/subversion/libsvn_fs_x/fs_x.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_x/fs_x.c?rev=1649797&r1=1649796&r2=1649797&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs_x/fs_x.c (original)
+++ subversion/trunk/subversion/libsvn_fs_x/fs_x.c Tue Jan  6 13:12:23 2015
@@ -845,43 +845,31 @@ write_revision_zero(svn_fs_t *fs,
   svn_fs_x__revision_file_t *rev_file;
   const char *l2p_proto_index, *p2l_proto_index;
 
-  /* Write a skeleton r0 with no indexes. */
-  SVN_ERR(svn_io_file_create_binary
-              (path_revision_zero,
-               "DELTA\nSVN\1" /* txdelta v1 */
-                 "\0\0\4\2\5" /* sview offset, sview len,
-                                 tview len, instr len, newlen */
-                 "\1\x84"     /* 1 instr byte, new 4 bytes */
-                 "\4END\n"    /* 4 new bytes, E, N, D, \n */
-                 "ENDREP\n"
-               "id: 2+0\n"
-               "node: 0+0\n"
-               "copy: 0+0\n"
-               "type: dir\n"
-               "count: 0\n"
-               "text: 0 3 16 4 "
-               "2d2977d1c96f487abe4a1e202dd03b4e\n"
-               "cpath: /\n"
-               "\n\n",
-               0x87, subpool));
+  /* Construct a skeleton r0 with no indexes. */
+  svn_string_t *noderev_str = svn_string_create("id: 2+0\n"
+                                                "node: 0+0\n"
+                                                "copy: 0+0\n"
+                                                "type: dir\n"
+                                                "count: 0\n"
+                                                "cpath: /\n"
+                                                "\n",
+                                                subpool);
+  svn_string_t *changes_str = svn_string_create("\n",
+                                                subpool);
+  svn_string_t *r0 = svn_string_createf(subpool, "%s%s",
+                                        noderev_str->data,
+                                        changes_str->data);
+
+  /* Write skeleton r0 to disk. */
+  SVN_ERR(svn_io_file_create(path_revision_zero, r0->data, subpool));
 
   /* Construct the index P2L contents: describe the 3 items we have.
      Be sure to create them in on-disk order. */
-  index_entries = apr_array_make(subpool, 3, sizeof(entry));
+  index_entries = apr_array_make(subpool, 2, sizeof(entry));
 
   entry = apr_pcalloc(subpool, sizeof(*entry));
   entry->offset = 0;
-  entry->size = 0x1d;
-  entry->type = SVN_FS_X__ITEM_TYPE_DIR_REP;
-  entry->item_count = 1;
-  entry->items = apr_pcalloc(subpool, sizeof(*entry->items));
-  entry->items[0].change_set = 0;
-  entry->items[0].number = SVN_FS_X__ITEM_INDEX_FIRST_USER;
-  APR_ARRAY_PUSH(index_entries, svn_fs_x__p2l_entry_t *) = entry;
-
-  entry = apr_pcalloc(subpool, sizeof(*entry));
-  entry->offset = 0x1d;
-  entry->size = 0x69;
+  entry->size = (apr_off_t)noderev_str->len;
   entry->type = SVN_FS_X__ITEM_TYPE_NODEREV;
   entry->item_count = 1;
   entry->items = apr_pcalloc(subpool, sizeof(*entry->items));
@@ -890,8 +878,8 @@ write_revision_zero(svn_fs_t *fs,
   APR_ARRAY_PUSH(index_entries, svn_fs_x__p2l_entry_t *) = entry;
 
   entry = apr_pcalloc(subpool, sizeof(*entry));
-  entry->offset = 0x1d + 0x69;
-  entry->size = 1;
+  entry->offset = (apr_off_t)noderev_str->len;
+  entry->size = (apr_off_t)changes_str->len;
   entry->type = SVN_FS_X__ITEM_TYPE_CHANGES;
   entry->item_count = 1;
   entry->items = apr_pcalloc(subpool, sizeof(*entry->items));



Re: svn commit: r1649797 - /subversion/trunk/subversion/libsvn_fs_x/fs_x.c

Posted by Stefan Fuhrmann <st...@wandisco.com>.
On Tue, Jan 6, 2015 at 3:25 PM, Stefan Sperling <st...@elego.de> wrote:

> On Tue, Jan 06, 2015 at 01:12:24PM -0000, stefan2@apache.org wrote:
> > Author: stefan2
> > Date: Tue Jan  6 13:12:23 2015
> > New Revision: 1649797
> >
> > URL: http://svn.apache.org/r1649797
> > Log:
> > Simplify the r0 template in FSX.  Because we treat directories with NULL
> > text reps as empty (and do so efficiently), we can simply ommit the text
> > rep for the root directory in r0.  The remainder are simple strings that
> > we can take length info from and that can be composed into r0.
> >
> > * subversion/libsvn_fs_x/fs_x.c
> >   (write_revision_zero):  Omit /@0 text rep and compose r0 from strings.
> >                           Derive offset info from string lengths.
> >
> > Modified:
> >     subversion/trunk/subversion/libsvn_fs_x/fs_x.c
> >
>
> THANK YOU! This is so much more readable :)
>

You are welcome. The key here was that I could
simply omit the complicated part.

Is there a regression test which compares the result of this function
> with a known template or copy of r0?
>

Not for FSX - which makes sense because there
will be changes to noderev and changed path list
representation at some point this year.

For FSFS, there are a two tests that will fail due
to hard-coded expectations once you omit the
directory representation. If I succeed writing a
"complete" constructor for FSFS r0, I'll add a
regression test to make sure that old servers
will be presented with the same r0 contents as
always.

-- Stefan^2.

Re: svn commit: r1649797 - /subversion/trunk/subversion/libsvn_fs_x/fs_x.c

Posted by Stefan Sperling <st...@elego.de>.
On Tue, Jan 06, 2015 at 01:12:24PM -0000, stefan2@apache.org wrote:
> Author: stefan2
> Date: Tue Jan  6 13:12:23 2015
> New Revision: 1649797
> 
> URL: http://svn.apache.org/r1649797
> Log:
> Simplify the r0 template in FSX.  Because we treat directories with NULL
> text reps as empty (and do so efficiently), we can simply ommit the text
> rep for the root directory in r0.  The remainder are simple strings that
> we can take length info from and that can be composed into r0.
> 
> * subversion/libsvn_fs_x/fs_x.c
>   (write_revision_zero):  Omit /@0 text rep and compose r0 from strings.
>                           Derive offset info from string lengths.
> 
> Modified:
>     subversion/trunk/subversion/libsvn_fs_x/fs_x.c
> 

THANK YOU! This is so much more readable :)

Is there a regression test which compares the result of this function
with a known template or copy of r0?

> Modified: subversion/trunk/subversion/libsvn_fs_x/fs_x.c
> URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_x/fs_x.c?rev=1649797&r1=1649796&r2=1649797&view=diff
> ==============================================================================
> --- subversion/trunk/subversion/libsvn_fs_x/fs_x.c (original)
> +++ subversion/trunk/subversion/libsvn_fs_x/fs_x.c Tue Jan  6 13:12:23 2015
> @@ -845,43 +845,31 @@ write_revision_zero(svn_fs_t *fs,
>    svn_fs_x__revision_file_t *rev_file;
>    const char *l2p_proto_index, *p2l_proto_index;
>  
> -  /* Write a skeleton r0 with no indexes. */
> -  SVN_ERR(svn_io_file_create_binary
> -              (path_revision_zero,
> -               "DELTA\nSVN\1" /* txdelta v1 */
> -                 "\0\0\4\2\5" /* sview offset, sview len,
> -                                 tview len, instr len, newlen */
> -                 "\1\x84"     /* 1 instr byte, new 4 bytes */
> -                 "\4END\n"    /* 4 new bytes, E, N, D, \n */
> -                 "ENDREP\n"
> -               "id: 2+0\n"
> -               "node: 0+0\n"
> -               "copy: 0+0\n"
o> -               "type: dir\n"
> -               "count: 0\n"
> -               "text: 0 3 16 4 "
> -               "2d2977d1c96f487abe4a1e202dd03b4e\n"
> -               "cpath: /\n"
> -               "\n\n",
> -               0x87, subpool));
> +  /* Construct a skeleton r0 with no indexes. */
> +  svn_string_t *noderev_str = svn_string_create("id: 2+0\n"
> +                                                "node: 0+0\n"
> +                                                "copy: 0+0\n"
> +                                                "type: dir\n"
> +                                                "count: 0\n"
> +                                                "cpath: /\n"
> +                                                "\n",
> +                                                subpool);
> +  svn_string_t *changes_str = svn_string_create("\n",
> +                                                subpool);
> +  svn_string_t *r0 = svn_string_createf(subpool, "%s%s",
> +                                        noderev_str->data,
> +                                        changes_str->data);
> +
> +  /* Write skeleton r0 to disk. */
> +  SVN_ERR(svn_io_file_create(path_revision_zero, r0->data, subpool));