You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by ju...@apache.org on 2015/10/21 18:27:20 UTC

svn commit: r1709877 - in /subversion/branches/move-tracking-2/subversion: include/private/svn_editor3e.h libsvn_delta/compat3e.c libsvn_delta/editor3e.c libsvn_ra/ra_loader.c svnmover/svnmover.c

Author: julianfoad
Date: Wed Oct 21 16:27:20 2015
New Revision: 1709877

URL: http://svn.apache.org/viewvc?rev=1709877&view=rev
Log:
On the 'move-tracking-2' branch: Remove a premature optimization, the
ability to fetch element payloads from the repository on demand.

Instead, read all payloads in full at start-up. A real implementation
certainly could not afford to work this way, but this will make some other
refactorings easier in the short term.

* subversion/include/private/svn_editor3e.h
  (svn_editor3_payload_resolve,
   svn_editor3_cb_payload_resolve_t,
   svn_editor3_cb_funcs_t): Delete the 'payload_resolve' method.
  (svn_payload_fetch): New.

* subversion/libsvn_delta/compat3e.c
  (svn_payload_fetch): New.
  (editor3_payload_resolve,
   svn_editor3_in_memory,
   svn_editor3__ev3_from_delta_for_commit): Delete the 'payload_resolve'
    method.

* subversion/libsvn_delta/editor3e.c
  (svn_editor3_payload_resolve,
   wrap_payload_resolve,
   svn_editor3__get_debug_editor): Delete the 'payload_resolve' method.

* subversion/libsvn_ra/ra_loader.c
  (txn_fetch_payloads): New.
  (svn_branch_repos_fetch_info,
   svn_branch_get_mutable_state,
   svn_ra_load_branching_state): Fetch payloads.

* subversion/svnmover/svnmover.c
  (element_differences,
   do_put_file,
   do_cat): No longer call 'svn_editor3_payload_resolve'.

Modified:
    subversion/branches/move-tracking-2/subversion/include/private/svn_editor3e.h
    subversion/branches/move-tracking-2/subversion/libsvn_delta/compat3e.c
    subversion/branches/move-tracking-2/subversion/libsvn_delta/editor3e.c
    subversion/branches/move-tracking-2/subversion/libsvn_ra/ra_loader.c
    subversion/branches/move-tracking-2/subversion/svnmover/svnmover.c

Modified: subversion/branches/move-tracking-2/subversion/include/private/svn_editor3e.h
URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/include/private/svn_editor3e.h?rev=1709877&r1=1709876&r2=1709877&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/include/private/svn_editor3e.h (original)
+++ subversion/branches/move-tracking-2/subversion/include/private/svn_editor3e.h Wed Oct 21 16:27:20 2015
@@ -780,17 +780,6 @@ svn_editor3_delete(svn_editor3_t *editor
                    const char *branch_id,
                    svn_branch_eid_t eid);
 
-/** Fetch full payload.
- *
- * If the payload in @a element is defined only by reference (to a
- * path@rev location in the repository), fetch the full payload.
- * That is, leave the 'ref' field as it is and also fill in the
- * 'kind', 'props', and other fields as appropriate.
- */
-svn_error_t *
-svn_editor3_payload_resolve(svn_editor3_t *editor,
-                            svn_element_content_t *element);
-
 /** Register a sequence point.
  *
  * At a sequence point, elements are arranged in a tree hierarchy: each
@@ -924,13 +913,6 @@ typedef svn_error_t *(*svn_editor3_cb_de
   svn_branch_eid_t eid,
   apr_pool_t *scratch_pool);
 
-/** @see svn_editor3_payload_resolve(), #svn_editor3_t
- */
-typedef svn_error_t *(*svn_editor3_cb_payload_resolve_t)(
-  void *baton,
-  svn_element_content_t *element,
-  apr_pool_t *scratch_pool);
-
 /** @see svn_editor3_sequence_point(), #svn_editor3_t
  */
 typedef svn_error_t *(*svn_editor3_cb_sequence_point_t)(
@@ -973,7 +955,6 @@ typedef struct svn_editor3_cb_funcs_t
   svn_editor3_cb_copy_one_t cb_copy_one;
   svn_editor3_cb_copy_tree_t cb_copy_tree;
   svn_editor3_cb_delete_t cb_delete;
-  svn_editor3_cb_payload_resolve_t cb_payload_resolve;
 
   svn_editor3_cb_sequence_point_t cb_sequence_point;
   svn_editor3_cb_complete_t cb_complete;
@@ -1069,6 +1050,17 @@ typedef svn_error_t *(*svn_editor3__shim
   apr_pool_t *scratch_pool
   );
 
+/*
+ */
+svn_error_t *
+svn_payload_fetch(svn_element_payload_t **payload_p,
+                  svn_branch_txn_t *txn,
+                  svn_element_branch_ref_t branch_ref,
+                  svn_editor3__shim_fetch_func_t fetch_func,
+                  void *fetch_baton,
+                  apr_pool_t *result_pool,
+                  apr_pool_t *scratch_pool);
+
 /* An object for communicating out-of-band details between an Ev1-to-Ev3
  * shim and an Ev3-to-Ev1 shim. */
 typedef struct svn_editor3__shim_connector_t svn_editor3__shim_connector_t;

Modified: subversion/branches/move-tracking-2/subversion/libsvn_delta/compat3e.c
URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/libsvn_delta/compat3e.c?rev=1709877&r1=1709876&r2=1709877&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/libsvn_delta/compat3e.c (original)
+++ subversion/branches/move-tracking-2/subversion/libsvn_delta/compat3e.c Wed Oct 21 16:27:20 2015
@@ -1075,6 +1075,40 @@ payload_get_storage_pathrev(svn_pathrev_
   return SVN_NO_ERROR;
 }
 
+svn_error_t *
+svn_payload_fetch(svn_element_payload_t **payload_p,
+                  svn_branch_txn_t *txn,
+                  svn_element_branch_ref_t branch_ref,
+                  svn_editor3__shim_fetch_func_t fetch_func,
+                  void *fetch_baton,
+                  apr_pool_t *result_pool,
+                  apr_pool_t *scratch_pool)
+{
+  ev3_from_delta_baton_t eb;
+  svn_pathrev_t storage_pathrev;
+
+  /* Simulate the existence of /top0 in r0. */
+  if (branch_ref.rev == 0 && branch_ref.eid == 0)
+    {
+      *payload_p = svn_element_payload_create_dir(apr_hash_make(result_pool),
+                                                  result_pool);
+      return SVN_NO_ERROR;
+    }
+
+  eb.txn = txn;
+  eb.fetch_func = fetch_func;
+  eb.fetch_baton = fetch_baton;
+
+  SVN_ERR(storage_pathrev_from_branch_ref(&storage_pathrev,
+                                          branch_ref, txn->repos,
+                                          scratch_pool, scratch_pool));
+
+  SVN_ERR(payload_fetch(payload_p, NULL,
+                        &eb, &storage_pathrev, result_pool, scratch_pool));
+  (*payload_p)->branch_ref = branch_ref;
+  return SVN_NO_ERROR;
+}
+
 /* Fill in the actual payload, from its reference, if not already done.
  */
 static svn_error_t *
@@ -1106,25 +1140,6 @@ payload_resolve(svn_element_payload_t *p
   return SVN_NO_ERROR;
 }
 
-static svn_error_t *
-editor3_payload_resolve(void *baton,
-                        svn_element_content_t *element,
-                        apr_pool_t *scratch_pool)
-{
-  ev3_from_delta_baton_t *eb = baton;
-
-  SVN_ERR_ASSERT(element);
-  SVN_ERR_ASSERT(!element->payload
-                 || svn_element_payload_invariants(element->payload));
-
-  /* If payload is only by reference, fetch full payload. */
-  if (element->payload && PAYLOAD_IS_ONLY_BY_REFERENCE(element->payload))
-    {
-      SVN_ERR(payload_resolve(element->payload, eb, scratch_pool));
-    }
-  return SVN_NO_ERROR;
-}
-
 /* An #svn_editor3_t method. */
 static svn_error_t *
 editor3_new_eid(void *baton,
@@ -1928,7 +1943,6 @@ svn_editor3_in_memory(svn_editor3_t **ed
     editor3_copy_one,
     editor3_copy_tree,
     editor3_delete,
-    editor3_payload_resolve,
     editor3_sequence_point,
     editor3_mem_complete,
     editor3_mem_abort
@@ -1972,7 +1986,6 @@ svn_editor3__ev3_from_delta_for_commit(
     editor3_copy_one,
     editor3_copy_tree,
     editor3_delete,
-    editor3_payload_resolve,
     editor3_sequence_point,
     editor3_complete,
     editor3_abort

Modified: subversion/branches/move-tracking-2/subversion/libsvn_delta/editor3e.c
URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/libsvn_delta/editor3e.c?rev=1709877&r1=1709876&r2=1709877&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/libsvn_delta/editor3e.c (original)
+++ subversion/branches/move-tracking-2/subversion/libsvn_delta/editor3e.c Wed Oct 21 16:27:20 2015
@@ -338,19 +338,6 @@ svn_editor3_delete(svn_editor3_t *editor
 }
 
 svn_error_t *
-svn_editor3_payload_resolve(svn_editor3_t *editor,
-                            svn_element_content_t *element)
-{
-  SVN_ERR_ASSERT(svn_element_payload_invariants(element->payload));
-
-  DO_CALLBACK(editor, cb_payload_resolve,
-              1(element));
-
-  SVN_ERR_ASSERT(svn_element_payload_invariants(element->payload));
-  return SVN_NO_ERROR;
-}
-
-svn_error_t *
 svn_editor3_sequence_point(svn_editor3_t *editor)
 {
   SHOULD_NOT_BE_FINISHED(editor);
@@ -579,18 +566,6 @@ wrap_delete(void *baton,
 }
 
 static svn_error_t *
-wrap_payload_resolve(void *baton,
-                     svn_element_content_t *element,
-                     apr_pool_t *scratch_pool)
-{
-  wrapper_baton_t *eb = baton;
-
-  SVN_ERR(svn_editor3_payload_resolve(eb->wrapped_editor,
-                                      element));
-  return SVN_NO_ERROR;
-}
-
-static svn_error_t *
 wrap_sequence_point(void *baton,
                     apr_pool_t *scratch_pool)
 {
@@ -636,7 +611,6 @@ svn_editor3__get_debug_editor(svn_editor
     wrap_copy_one,
     wrap_copy_tree,
     wrap_delete,
-    wrap_payload_resolve,
     wrap_sequence_point,
     wrap_complete,
     wrap_abort

Modified: subversion/branches/move-tracking-2/subversion/libsvn_ra/ra_loader.c
URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/libsvn_ra/ra_loader.c?rev=1709877&r1=1709876&r2=1709877&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/libsvn_ra/ra_loader.c (original)
+++ subversion/branches/move-tracking-2/subversion/libsvn_ra/ra_loader.c Wed Oct 21 16:27:20 2015
@@ -47,6 +47,7 @@
 #include "svn_dso.h"
 #include "svn_props.h"
 #include "svn_sorts.h"
+#include "svn_iter.h"
 
 #include "svn_config.h"
 #include "ra_loader.h"
@@ -725,6 +726,45 @@ svn_branch_revision_fetch_info(svn_branc
   return SVN_NO_ERROR;
 }
 
+/* Fetch all element payloads in TXN.
+ */
+static svn_error_t *
+txn_fetch_payloads(svn_branch_txn_t *txn,
+                   svn_editor3__shim_fetch_func_t fetch_func,
+                   void *fetch_baton,
+                   apr_pool_t *result_pool,
+                   apr_pool_t *scratch_pool)
+{
+  SVN_ITER_T(svn_branch_state_t) *bi;
+
+  /* Read payload of each element.
+     (In a real implementation, of course, we'd delay this until demanded.) */
+  for (SVN_ARRAY_ITER(bi, svn_branch_txn_get_branches(txn, scratch_pool),
+                      scratch_pool))
+    {
+      svn_branch_state_t *branch = bi->val;
+      const svn_element_tree_t *element_tree
+        = svn_branch_get_element_tree(branch);
+      SVN_ITER_T(svn_element_content_t) *hi;
+
+      for (SVN_HASH_ITER(hi, scratch_pool, element_tree->e_map))
+        {
+          int eid = *(const int *)hi->key;
+          svn_element_content_t *element = svn_branch_get_element(branch, eid);
+
+          if (! element->payload->is_subbranch_root)
+            {
+              SVN_ERR(svn_payload_fetch(&element->payload,
+                                        txn, element->payload->branch_ref,
+                                        fetch_func, fetch_baton,
+                                        result_pool, scratch_pool));
+            }
+        }
+    }
+
+  return SVN_NO_ERROR;
+}
+
 /* Create a new repository object and read the move-tracking /
  * branch-tracking metadata from the repository into it.
  */
@@ -732,6 +772,8 @@ static svn_error_t *
 svn_branch_repos_fetch_info(svn_branch_repos_t **repos_p,
                             svn_ra_session_t *ra_session,
                             const char *branch_info_dir,
+                            svn_editor3__shim_fetch_func_t fetch_func,
+                            void *fetch_baton,
                             apr_pool_t *result_pool,
                             apr_pool_t *scratch_pool)
 {
@@ -751,7 +793,9 @@ svn_branch_repos_fetch_info(svn_branch_r
                                              r,
                                              result_pool, scratch_pool));
       SVN_ERR(svn_branch_repos_add_revision(repos, txn));
-    }
+      SVN_ERR(txn_fetch_payloads(txn, fetch_func, fetch_baton,
+                                 result_pool, scratch_pool));
+      }
 
   *repos_p = repos;
   return SVN_NO_ERROR;
@@ -765,6 +809,8 @@ svn_branch_get_mutable_state(svn_branch_
                              svn_ra_session_t *ra_session,
                              const char *branch_info_dir,
                              svn_revnum_t base_revision,
+                             svn_editor3__shim_fetch_func_t fetch_func,
+                             void *fetch_baton,
                              apr_pool_t *result_pool,
                              apr_pool_t *scratch_pool)
 {
@@ -779,6 +825,8 @@ svn_branch_get_mutable_state(svn_branch_
                                          base_revision,
                                          result_pool, scratch_pool));
   SVN_ERR_ASSERT(txn->rev == base_revision);
+  SVN_ERR(txn_fetch_payloads(txn, fetch_func, fetch_baton,
+                             result_pool, scratch_pool));
 
   /* Update all the 'predecessor' info to point to the BASE_REVISION instead
      of to that revision's predecessor. */
@@ -984,14 +1032,6 @@ svn_ra_load_branching_state(svn_branch_t
       SVN_ERR(svn_ra_get_latest_revnum(session, &base_revision, scratch_pool));
     }
 
-  SVN_ERR(svn_branch_repos_fetch_info(&repos,
-                                      session, branch_info_dir,
-                                      result_pool, scratch_pool));
-  SVN_ERR(svn_branch_get_mutable_state(branching_txn_p,
-                                       repos, session, branch_info_dir,
-                                       base_revision,
-                                       result_pool, scratch_pool));
-
   /* fetcher */
   SVN_ERR(svn_ra_get_repos_root2(session, &repos_root_url, result_pool));
   SVN_ERR(svn_ra_get_session_url(session, &session_url, scratch_pool));
@@ -1002,6 +1042,16 @@ svn_ra_load_branching_state(svn_branch_t
   *fetch_func = svn_ra_fetch;
   *fetch_baton = fbb;
 
+  SVN_ERR(svn_branch_repos_fetch_info(&repos,
+                                      session, branch_info_dir,
+                                      *fetch_func, *fetch_baton,
+                                      result_pool, scratch_pool));
+  SVN_ERR(svn_branch_get_mutable_state(branching_txn_p,
+                                       repos, session, branch_info_dir,
+                                       base_revision,
+                                       *fetch_func, *fetch_baton,
+                                       result_pool, scratch_pool));
+
   return SVN_NO_ERROR;
 }
 

Modified: subversion/branches/move-tracking-2/subversion/svnmover/svnmover.c
URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/svnmover/svnmover.c?rev=1709877&r1=1709876&r2=1709877&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/svnmover/svnmover.c (original)
+++ subversion/branches/move-tracking-2/subversion/svnmover/svnmover.c Wed Oct 21 16:27:20 2015
@@ -296,16 +296,6 @@ element_differences(apr_hash_t **diff_p,
       svn_element_content_t *element_right
         = svn_element_tree_get(right, e);
 
-      /* If node payload is given by reference, resolve it to full payload */
-      if (element_left)
-        {
-          SVN_ERR(svn_editor3_payload_resolve(editor, element_left));
-        }
-      if (element_right)
-        {
-          SVN_ERR(svn_editor3_payload_resolve(editor, element_right));
-        }
-
       if (! svn_element_content_equal(element_left, element_right,
                                       scratch_pool))
         {
@@ -2270,7 +2260,6 @@ do_put_file(svn_editor3_t *editor,
       svn_element_content_t *existing_element
         = svn_branch_get_element(file_el_rev->branch, file_el_rev->eid);
 
-      SVN_ERR(svn_editor3_payload_resolve(editor, existing_element));
       props = existing_element->payload->props;
     }
   else
@@ -2346,7 +2335,6 @@ do_cat(svn_editor3_t *editor,
   svn_element_content_t *existing_element
     = svn_branch_get_element(file_el_rev->branch, file_el_rev->eid);
 
-  SVN_ERR(svn_editor3_payload_resolve(editor, existing_element));
   props = existing_element->payload->props;
   text = existing_element->payload->text;