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;