Author: julianfoad
Date: Tue Dec 22 18:44:27 2009
New Revision: 893267

URL: http://svn.apache.org/viewvc?rev=893267&view=rev
Log:
For obliterate in BDB, implement updating the "node-origins" table.

* subversion/libsvn_fs_base/bdb/node-origins-table.c,
  subversion/libsvn_fs_base/bdb/node-origins-table.h
  (svn_fs_bdb__change_node_origin): New function to overwrite an existing
    node-origins row.

* subversion/libsvn_fs_base/dag.c
  (node_origins_update): New function.
  (svn_fs_base__dag_commit_obliteration_txn): Update the "node-origins" table.

* subversion/libsvn_fs_base/revs-txns.c
  (txn_body_begin_obliteration_txn): Remove a "TODO" comment about this.

Modified:
    subversion/trunk/subversion/libsvn_fs_base/bdb/node-origins-table.c
    subversion/trunk/subversion/libsvn_fs_base/bdb/node-origins-table.h
    subversion/trunk/subversion/libsvn_fs_base/dag.c
    subversion/trunk/subversion/libsvn_fs_base/revs-txns.c

Modified: subversion/trunk/subversion/libsvn_fs_base/bdb/node-origins-table.c
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_base/bdb/node-origins-table.c?rev=893267&r1=893266&r2=893267&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs_base/bdb/node-origins-table.c 
(original)
+++ subversion/trunk/subversion/libsvn_fs_base/bdb/node-origins-table.c Tue Dec 
22 18:44:27 2009
@@ -129,6 +129,39 @@
                                          &key, &value, 0));
 }
 
+svn_error_t *svn_fs_bdb__change_node_origin(svn_fs_t *fs,
+                                            const char *node_id,
+                                            const svn_fs_id_t *origin_id,
+                                            trail_t *trail,
+                                            apr_pool_t *pool)
+{
+  base_fs_data_t *bfd = fs->fsap_data;
+  DBT key, value;
+  int db_err;
+
+  /* Create a key from our NODE_ID. */
+  svn_fs_base__str_to_dbt(&key, node_id);
+
+  /* Check that we already have a mapping for NODE_ID. */
+  svn_fs_base__trail_debug(trail, "node-origins", "get");
+  db_err = bfd->node_origins->get(bfd->node_origins, trail->db_txn,
+                                  &key, svn_fs_base__result_dbt(&value), 0);
+  svn_fs_base__track_dbt(&value, pool);
+  if (db_err == DB_NOTFOUND)
+    {
+      return svn_error_createf
+        (SVN_ERR_FS_CORRUPT, NULL,
+         _("Node origin for '%s' not found"), node_id);
+    }
+
+  /* Create a value from our ORIGIN_ID, and add this record to the table. */
+  svn_fs_base__id_to_dbt(&value, origin_id, pool);
+  svn_fs_base__trail_debug(trail, "node-origins", "put");
+  return BDB_WRAP(fs, _("storing node-origins record"),
+                  bfd->node_origins->put(bfd->node_origins, trail->db_txn,
+                                         &key, &value, 0));
+}
+
 svn_error_t *svn_fs_bdb__delete_node_origin(svn_fs_t *fs,
                                             const char *node_id,
                                             trail_t *trail,

Modified: subversion/trunk/subversion/libsvn_fs_base/bdb/node-origins-table.h
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_base/bdb/node-origins-table.h?rev=893267&r1=893266&r2=893267&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs_base/bdb/node-origins-table.h 
(original)
+++ subversion/trunk/subversion/libsvn_fs_base/bdb/node-origins-table.h Tue Dec 
22 18:44:27 2009
@@ -62,6 +62,13 @@
                                          trail_t *trail,
                                          apr_pool_t *pool);
 
+/* Like svn_fs_bdb__set_node_origin() but replaces an existing entry. */
+svn_error_t *svn_fs_bdb__change_node_origin(svn_fs_t *fs,
+                                            const char *node_id,
+                                            const svn_fs_id_t *origin_id,
+                                            trail_t *trail,
+                                            apr_pool_t *pool);
+
 /* Delete from the `node-origins' table the record for NODE_ID in FS.
    Do this as part of TRAIL.  Use POOL for temporary allocations.  */
 svn_error_t *svn_fs_bdb__delete_node_origin(svn_fs_t *fs,

Modified: subversion/trunk/subversion/libsvn_fs_base/dag.c
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_base/dag.c?rev=893267&r1=893266&r2=893267&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs_base/dag.c (original)
+++ subversion/trunk/subversion/libsvn_fs_base/dag.c Tue Dec 22 18:44:27 2009
@@ -49,6 +49,8 @@
 #include "bdb/reps-table.h"
 #include "bdb/strings-table.h"
 #include "bdb/checksum-reps-table.h"
+#include "bdb/changes-table.h"
+#include "bdb/node-origins-table.h"
 
 #include "private/svn_skel.h"
 #include "private/svn_fs_util.h"
@@ -1625,6 +1627,59 @@
                                    &date, trail, pool);
 }
 
+/* Modify all entries in the "node-origins" table that have a txn-id of
+ * OLD_TXN_ID to refer to NEW_TXN_ID instead.
+ *
+ * Work within TRAIL. */
+static svn_error_t *
+node_origins_update(const char *new_txn_id,
+                    const char *old_txn_id,
+                    trail_t *trail,
+                    apr_pool_t *scratch_pool)
+{
+  apr_array_header_t *changes;
+  int i;
+
+  /* To find the nodes that originate in the old txn, we'll look in the
+   * "changes" table. Any change that added a node could have created a new
+   * node id. */
+  SVN_ERR(svn_fs_bdb__changes_fetch_raw(&changes, trail->fs, old_txn_id, trail,
+                                        scratch_pool));
+  for (i = 0; i < changes->nelts; i++)
+    {
+      change_t *change = APR_ARRAY_IDX(changes, i, change_t *);
+
+      if (change->kind == svn_fs_path_change_add
+          || change->kind == svn_fs_path_change_replace)
+        {
+          const svn_fs_id_t *origin_id;
+          const char *node_id, *id_copy_id, *id_txn_id;
+
+          /* Find the destination node id of this change */
+          node_id = svn_fs_base__id_node_id(change->noderev_id);
+
+          /* Fetch the old node-origin */
+          SVN_ERR(svn_fs_bdb__get_node_origin(&origin_id, trail->fs, node_id,
+                                              trail, scratch_pool));
+          id_copy_id = svn_fs_base__id_copy_id(origin_id);
+          id_txn_id = svn_fs_base__id_txn_id(origin_id);
+
+          if (svn_fs_base__key_compare(id_txn_id, old_txn_id) == 0)
+            {
+              /* Change its txn_id to NEW_TXN_ID */
+              origin_id = svn_fs_base__id_create(node_id, id_copy_id,
+                                                 new_txn_id, scratch_pool);
+              /* Save the new node-origin */
+              SVN_ERR(svn_fs_bdb__change_node_origin(trail->fs, node_id,
+                                                     origin_id, trail,
+                                                     scratch_pool));
+            }
+        }
+    }
+
+  return SVN_NO_ERROR;
+}
+
 svn_error_t *
 svn_fs_base__dag_commit_obliteration_txn(svn_revnum_t replacing_rev,
                                          svn_fs_txn_t *txn,
@@ -1633,8 +1688,13 @@
 {
   transaction_t *txn_obj;
   revision_t revision;
+  const char *old_txn_id;
+
+  /* Find the old txn. */
+  SVN_ERR(svn_fs_base__rev_get_txn_id(&old_txn_id, trail->fs, replacing_rev,
+                                      trail, trail->pool));
 
-  /* Read the txn so we can access its "copies" list */
+  /* Read the new txn so we can access its "copies" list */
   SVN_ERR(svn_fs_bdb__get_txn(&txn_obj, trail->fs, txn->id, trail,
                               trail->pool));
 
@@ -1693,6 +1753,10 @@
   /* Promote the unfinished transaction to a committed one. */
   SVN_ERR(svn_fs_base__txn_make_committed(txn->fs, txn->id, replacing_rev,
                                           trail, pool));
+
+  /* Update the "node-origins" table. */
+  SVN_ERR(node_origins_update(txn->id, old_txn_id, trail, trail->pool));
+
   return SVN_NO_ERROR;
 }
 

Modified: subversion/trunk/subversion/libsvn_fs_base/revs-txns.c
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_base/revs-txns.c?rev=893267&r1=893266&r2=893267&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs_base/revs-txns.c (original)
+++ subversion/trunk/subversion/libsvn_fs_base/revs-txns.c Tue Dec 22 18:44:27 
2009
@@ -848,10 +848,6 @@
   /* Dup the "changes" that are keyed by the txn_id. */
   SVN_ERR(changes_dup(new_txn_id, old_txn_id, trail, trail->pool));
 
-  /* ### TODO: Update the "node-origins" table.
-   * Or can this be deferred till commit time? Probably not. */
-
-
   /* Save the modified transaction */
   SVN_ERR(svn_fs_bdb__put_txn(trail->fs, new_txn, new_txn_id, trail,
                               trail->pool));


Reply via email to