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 2013/03/09 08:40:24 UTC

svn commit: r1454671 - in /subversion/branches/fsfs-format7/subversion: include/svn_error_codes.h libsvn_fs_fs/fs.h libsvn_fs_fs/fs_fs.c libsvn_fs_fs/id.c libsvn_fs_fs/id.h libsvn_fs_fs/low_level.c libsvn_fs_fs/temp_serializer.c libsvn_fs_fs/transaction.c

Author: stefan2
Date: Sat Mar  9 07:40:24 2013
New Revision: 1454671

URL: http://svn.apache.org/r1454671
Log:
On the fsfs-format7 branch:  Switch the representation uniquifier from
string to integers.  This is the first place where a transaction ID is
no longer used in its string format.

This is part of the "numerical IDs" patch series.

* subversion/include/svn_error_codes.h
  (SVN_ERR_FS_MALFORMED_TXN_ID): declare new error code

* subversion/libsvn_fs_fs/id.h
  (svn_fs_fs__id_part_t): document txn-id-specific behavior
  (svn_fs_fs__id_txn_parse,
   svn_fs_fs__id_txn_unparse): declare new API functions

* subversion/libsvn_fs_fs/id.c
  (txn_id_parse): new parser utility
  (svn_fs_fs__id_txn_parse,
   svn_fs_fs__id_txn_unparse): implement new API functions

* subversion/libsvn_fs_fs/fs.h
  (representation_t): the uniquifier is now a struct of ints

* subversion/libsvn_fs_fs/fs_fs.c
  (svn_fs_fs__noderev_same_rep_key,
   svn_fs_fs__rep_copy): update and simplify

* subversion/libsvn_fs_fs/low_level.c
  (svn_fs_fs__parse_representation,
   svn_fs_fs__unparse_representation): convert uniquifier <-> string

* subversion/libsvn_fs_fs/temp_serializer.c
  (serialize_representation,
   deserialize_representation): update and simplify

* subversion/libsvn_fs_fs/transaction.c
  (set_uniquifier): convert txn id string -> id part

* subversion/tests/cmdline/svntest/main.py

Modified:
    subversion/branches/fsfs-format7/subversion/include/svn_error_codes.h
    subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/fs.h
    subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/fs_fs.c
    subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/id.c
    subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/id.h
    subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/low_level.c
    subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/temp_serializer.c
    subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/transaction.c

Modified: subversion/branches/fsfs-format7/subversion/include/svn_error_codes.h
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/include/svn_error_codes.h?rev=1454671&r1=1454670&r2=1454671&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/include/svn_error_codes.h (original)
+++ subversion/branches/fsfs-format7/subversion/include/svn_error_codes.h Sat Mar  9 07:40:24 2013
@@ -807,6 +807,11 @@ SVN_ERROR_START
              SVN_ERR_FS_CATEGORY_START + 55,
              "Item index too large for this revision.")
 
+  /** @since New in 1.9. */
+  SVN_ERRDEF(SVN_ERR_FS_MALFORMED_TXN_ID,
+             SVN_ERR_FS_CATEGORY_START + 56,
+             "Malformed transaction ID string.")
+
   /* repos errors */
 
   SVN_ERRDEF(SVN_ERR_REPOS_LOCKED,

Modified: subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/fs.h
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/fs.h?rev=1454671&r1=1454670&r2=1454671&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/fs.h (original)
+++ subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/fs.h Sat Mar  9 07:40:24 2013
@@ -487,11 +487,12 @@ typedef struct representation_t
   /* For rep-sharing, we need a way of uniquifying node-revs which share the
      same representation (see svn_fs_fs__noderev_same_rep_key() ).  So, we
      store the original txn of the node rev (not the rep!), along with some
-     intra-node uniqification content.
-
-     May be NULL, in which case, it is considered to match other NULL
-     values.*/
-  const char *uniquifier;
+     intra-node uniqification content. */
+  struct
+  {
+    svn_fs_fs__id_part_t txn_id;
+    apr_uint64_t number;
+  } uniquifier;
 } representation_t;
 
 

Modified: subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/fs_fs.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/fs_fs.c?rev=1454671&r1=1454670&r2=1454671&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/fs_fs.c (original)
+++ subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/fs_fs.c Sat Mar  9 07:40:24 2013
@@ -836,13 +836,7 @@ svn_fs_fs__noderev_same_rep_key(represen
   if (a->revision != b->revision)
     return FALSE;
 
-  if (a->uniquifier == b->uniquifier)
-    return TRUE;
-
-  if (a->uniquifier == NULL || b->uniquifier == NULL)
-    return FALSE;
-
-  return strcmp(a->uniquifier, b->uniquifier) == 0;
+  return memcmp(&a->uniquifier, &b->uniquifier, sizeof(a->uniquifier)) == 0;
 }
 
 svn_error_t *
@@ -882,12 +876,11 @@ svn_fs_fs__rep_copy(representation_t *re
   if (rep == NULL)
     return NULL;
 
-  rep_new = apr_pcalloc(pool, sizeof(*rep_new));
+  rep_new = apr_palloc(pool, sizeof(*rep_new));
 
   memcpy(rep_new, rep, sizeof(*rep_new));
   rep_new->md5_checksum = svn_checksum_dup(rep->md5_checksum, pool);
   rep_new->sha1_checksum = svn_checksum_dup(rep->sha1_checksum, pool);
-  rep_new->uniquifier = apr_pstrdup(pool, rep->uniquifier);
 
   return rep_new;
 }

Modified: subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/id.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/id.c?rev=1454671&r1=1454670&r2=1454671&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/id.c (original)
+++ subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/id.c Sat Mar  9 07:40:24 2013
@@ -78,6 +78,22 @@ part_parse(svn_fs_fs__id_part_t *part,
   return TRUE;
 }
 
+/* Parse the transaction id in DATA and store the result in *TXN_ID.
+ * Return FALSE if there was some problem.
+ */
+static svn_boolean_t
+txn_id_parse(svn_fs_fs__id_part_t *txn_id,
+             const char *data)
+{
+  txn_id->revision = SVN_STR_TO_REV(data);
+  data = strchr(data, '-');
+  if (data == NULL)
+    return FALSE;
+  
+  txn_id->number = svn__base36toui64(&data, ++data);
+  return *data == '\0';
+}
+
 /* Write the textual representation of *PART into P and return a pointer
  * to the first position behind that string.
  */
@@ -124,6 +140,31 @@ svn_fs_fs__id_part_eq(const svn_fs_fs__i
   return lhs->revision == rhs->revision && lhs->number == rhs->number;
 }
 
+svn_error_t *
+svn_fs_fs__id_txn_parse(svn_fs_fs__id_part_t *txn_id,
+                        const char *data)
+{
+  if (! txn_id_parse(txn_id, data))
+    return svn_error_createf(SVN_ERR_FS_MALFORMED_TXN_ID, NULL,
+                             "malformed txn id '%s'", data);
+
+  return SVN_NO_ERROR;
+}
+
+const char *
+svn_fs_fs__id_txn_unparse(const svn_fs_fs__id_part_t *txn_id,
+                          apr_pool_t *pool)
+{
+  char string[2 * SVN_INT64_BUFFER_SIZE + 1];
+  char *p = string;
+  
+  p += svn__i64toa(p, txn_id->revision);
+  *(p++) = '-';
+  p += svn__ui64tobase36(p, txn_id->number);
+
+  return apr_pstrmemdup(pool, string, p - string);
+}
+
 
 
 /* Accessing ID Pieces.  */

Modified: subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/id.h
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/id.h?rev=1454671&r1=1454670&r2=1454671&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/id.h (original)
+++ subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/id.h Sat Mar  9 07:40:24 2013
@@ -35,8 +35,9 @@ extern "C" {
  */
 typedef struct svn_fs_fs__id_part_t
 {
-  /* SVN_INVALID_REVNUM -> not assigned to a revision, yet
-     0                  -> old-style ID or the root in rev 0. */
+  /* SVN_INVALID_REVNUM for txns -> not a txn, COUNTER must be 0.
+     SVN_INVALID_REVNUM for others -> not assigned to a revision, yet.
+     0                  for others -> old-style ID or the root in rev 0. */
   svn_revnum_t revision;
 
   /* some numerical value. */
@@ -54,6 +55,15 @@ svn_boolean_t svn_fs_fs__id_part_is_root
 svn_boolean_t svn_fs_fs__id_part_eq(const svn_fs_fs__id_part_t *lhs,
                                     const svn_fs_fs__id_part_t *rhs);
 
+/* Parse the transaction id in DATA and store the result in *TXN_ID */
+svn_error_t *svn_fs_fs__id_txn_parse(svn_fs_fs__id_part_t *txn_id,
+                                     const char *data);
+
+/* Convert the transaction id in *TXN_ID into a textual representation
+ * allocated in POOL. */
+const char *svn_fs_fs__id_txn_unparse(const svn_fs_fs__id_part_t *txn_id,
+                                      apr_pool_t *pool);
+
 
 /*** ID accessor functions. ***/
 

Modified: subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/low_level.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/low_level.c?rev=1454671&r1=1454670&r2=1454671&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/low_level.c (original)
+++ subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/low_level.c Sat Mar  9 07:40:24 2013
@@ -26,6 +26,7 @@
 #include "svn_private_config.h"
 #include "svn_pools.h"
 #include "svn_sorts.h"
+#include "private/svn_string_private.h"
 
 #include "../libsvn_fs/fs-loader.h"
 
@@ -313,12 +314,19 @@ svn_fs_fs__parse_representation(represen
                                  pool));
 
   /* Read the uniquifier. */
+  str = svn_cstring_tokenize("/", &string);
+  if (str == NULL)
+    return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
+                            _("Malformed text representation offset line in node-rev"));
+
+  SVN_ERR(svn_fs_fs__id_txn_parse(&rep->uniquifier.txn_id, str));
+
   str = svn_cstring_tokenize(" ", &string);
   if (str == NULL)
     return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
                             _("Malformed text representation offset line in node-rev"));
 
-  rep->uniquifier = apr_pstrdup(pool, str);
+  rep->uniquifier.number = svn__base36toui64(NULL, str);
 
   return SVN_NO_ERROR;
 }
@@ -521,6 +529,7 @@ svn_fs_fs__unparse_representation(repres
                                   svn_boolean_t may_be_corrupt,
                                   apr_pool_t *pool)
 {
+  char buffer[SVN_INT64_BUFFER_SIZE];
   if (rep->txn_id && mutable_rep_truncated)
     return svn_stringbuf_ncreate("-1", 2, pool);
 
@@ -537,14 +546,16 @@ svn_fs_fs__unparse_representation(repres
              rep->expanded_size,
              DISPLAY_MAYBE_NULL_CHECKSUM(rep->md5_checksum));
 
+  svn__ui64tobase36(buffer, rep->uniquifier.number);
   return svn_stringbuf_createf
           (pool, "%ld %" APR_OFF_T_FMT " %" SVN_FILESIZE_T_FMT
-           " %" SVN_FILESIZE_T_FMT " %s %s %s",
+           " %" SVN_FILESIZE_T_FMT " %s %s %s/%s",
            rep->revision, rep->item_index, rep->size,
            rep->expanded_size,
            DISPLAY_MAYBE_NULL_CHECKSUM(rep->md5_checksum),
            DISPLAY_MAYBE_NULL_CHECKSUM(rep->sha1_checksum),
-           rep->uniquifier);
+           svn_fs_fs__id_txn_unparse(&rep->uniquifier.txn_id, pool),
+           buffer);
 
 #undef DISPLAY_MAYBE_NULL_CHECKSUM
 

Modified: subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/temp_serializer.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/temp_serializer.c?rev=1454671&r1=1454670&r2=1454671&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/temp_serializer.c (original)
+++ subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/temp_serializer.c Sat Mar  9 07:40:24 2013
@@ -185,7 +185,6 @@ serialize_representation(svn_temp_serial
   serialize_checksum(context, &rep->sha1_checksum);
 
   svn_temp_serializer__add_string(context, &rep->txn_id);
-  svn_temp_serializer__add_string(context, &rep->uniquifier);
 
   /* return to the caller's nesting level */
   svn_temp_serializer__pop(context);
@@ -210,7 +209,6 @@ deserialize_representation(void *buffer,
   deserialize_checksum(rep, &rep->sha1_checksum);
 
   svn_temp_deserializer__resolve(rep, (void **)&rep->txn_id);
-  svn_temp_deserializer__resolve(rep, (void **)&rep->uniquifier);
 }
 
 /* auxilliary structure representing the content of a directory hash */

Modified: subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/transaction.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/transaction.c?rev=1454671&r1=1454670&r2=1454671&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/transaction.c (original)
+++ subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/transaction.c Sat Mar  9 07:40:24 2013
@@ -1440,12 +1440,11 @@ set_uniquifier(svn_fs_t *fs,
                const char *txn_id,
                apr_pool_t *pool)
 {
-  char unique_suffix[SVN_INT64_BUFFER_SIZE];
   svn_fs_fs__id_part_t temp;
 
   SVN_ERR(get_new_txn_node_id(&temp, fs, txn_id, pool));
-  svn__ui64tobase36(unique_suffix, temp.number);
-  rep->uniquifier = apr_psprintf(pool, "%s/_%s", txn_id, unique_suffix);
+  SVN_ERR(svn_fs_fs__id_txn_parse(&rep->uniquifier.txn_id, txn_id));
+  rep->uniquifier.number = temp.number;
 
   return SVN_NO_ERROR;
 }