Author: ivan
Date: Sat Dec 26 09:14:25 2015
New Revision: 1721716
URL: http://svn.apache.org/viewvc?rev=1721716&view=rev
Log:
Cache youngest revision during processing one request on mod_dav_svn.
* subversion/mod_dav_svn/dav_svn.h
(dav_svn_repos): Add YOUNGEST_REV member.
(dav_svn__create_txn): Drop const qualifier from REPOS argument.
(dav_svn__get_youngest_rev): New function declaration.
* subversion/mod_dav_svn/util.c
(dav_svn__get_youngest_rev): New function.
* subversion/mod_dav_svn/activity.c
* subversion/mod_dav_svn/liveprops.c
* subversion/mod_dav_svn/lock.c
* subversion/mod_dav_svn/reports/get-location-segments.c
* subversion/mod_dav_svn/reports/update.c
* subversion/mod_dav_svn/repos.c
* subversion/mod_dav_svn/version.c
(dav_svn__create_txn, insert_prop_internal, append_locks,
dav_svn__get_location_segments_report, dav_svn__update_report,
prep_regular, prep_version, parse_querystring,
dav_svn__working_to_regular_resource, get_option, dav_svn__checkout):
Use dav_svn__get_youngest_rev() instead of direct call to
svn_fs_youngest_rev().
(get_parentpath_resource, get_resource): Initialize RESPO->YOUNGEST_REV to
SVN_INVALID_REVNUM.
Modified:
subversion/trunk/subversion/mod_dav_svn/activity.c
subversion/trunk/subversion/mod_dav_svn/dav_svn.h
subversion/trunk/subversion/mod_dav_svn/liveprops.c
subversion/trunk/subversion/mod_dav_svn/lock.c
subversion/trunk/subversion/mod_dav_svn/reports/get-location-segments.c
subversion/trunk/subversion/mod_dav_svn/reports/update.c
subversion/trunk/subversion/mod_dav_svn/repos.c
subversion/trunk/subversion/mod_dav_svn/util.c
subversion/trunk/subversion/mod_dav_svn/version.c
Modified: subversion/trunk/subversion/mod_dav_svn/activity.c
URL:
http://svn.apache.org/viewvc/subversion/trunk/subversion/mod_dav_svn/activity.c?rev=1721716&r1=1721715&r2=1721716&view=diff
==============================================================================
--- subversion/trunk/subversion/mod_dav_svn/activity.c (original)
+++ subversion/trunk/subversion/mod_dav_svn/activity.c Sat Dec 26 09:14:25 2015
@@ -227,7 +227,7 @@ dav_svn__store_activity(const dav_svn_re
dav_error *
-dav_svn__create_txn(const dav_svn_repos *repos,
+dav_svn__create_txn(dav_svn_repos *repos,
const char **ptxn_name,
apr_hash_t *revprops,
apr_pool_t *pool)
@@ -248,7 +248,7 @@ dav_svn__create_txn(const dav_svn_repos
svn_string_create(repos->username, pool));
}
- serr = svn_fs_youngest_rev(&rev, repos->fs, pool);
+ serr = dav_svn__get_youngest_rev(&rev, repos, pool);
if (serr != NULL)
{
return dav_svn__convert_err(serr, HTTP_INTERNAL_SERVER_ERROR,
Modified: subversion/trunk/subversion/mod_dav_svn/dav_svn.h
URL:
http://svn.apache.org/viewvc/subversion/trunk/subversion/mod_dav_svn/dav_svn.h?rev=1721716&r1=1721715&r2=1721716&view=diff
==============================================================================
--- subversion/trunk/subversion/mod_dav_svn/dav_svn.h (original)
+++ subversion/trunk/subversion/mod_dav_svn/dav_svn.h Sat Dec 26 09:14:25 2015
@@ -149,6 +149,9 @@ typedef struct dav_svn_repos {
/* The path to the activities db */
const char *activities_db;
+ /* Cached yongest revision of the repository. SVN_INVALID_REVNUM if
+ youngest revision is not fetched yet. */
+ svn_revnum_t youngest_rev;
} dav_svn_repos;
@@ -462,7 +465,7 @@ const char *dav_svn__get_vtxn_root_stub(
NOTE: This function will overwrite the svn:author property, if
any, found in REVPROPS. */
dav_error *
-dav_svn__create_txn(const dav_svn_repos *repos,
+dav_svn__create_txn(dav_svn_repos *repos,
const char **ptxn_name,
apr_hash_t *revprops,
apr_pool_t *pool);
@@ -1055,6 +1058,19 @@ int dav_svn__error_response_tag(request_
int dav_svn__parse_request_skel(svn_skel_t **skel, request_rec *r,
apr_pool_t *pool);
+/* Set *YOUNGEST_P to the number of the youngest revision in REPOS.
+ *
+ * Youngest revision will be cached in REPOS->YOUNGEST_REV to avoid
+ * fetching the youngest revision multiple times during proccessing
+ * the request.
+ *
+ * Uses SCRATCH_POOL for temporary allocations.
+ */
+svn_error_t *
+dav_svn__get_youngest_rev(svn_revnum_t *youngest_p,
+ dav_svn_repos *repos,
+ apr_pool_t *scratch_pool);
+
/*** mirror.c ***/
/* Perform the fixup hook for the R request. */
Modified: subversion/trunk/subversion/mod_dav_svn/liveprops.c
URL:
http://svn.apache.org/viewvc/subversion/trunk/subversion/mod_dav_svn/liveprops.c?rev=1721716&r1=1721715&r2=1721716&view=diff
==============================================================================
--- subversion/trunk/subversion/mod_dav_svn/liveprops.c (original)
+++ subversion/trunk/subversion/mod_dav_svn/liveprops.c Sat Dec 26 09:14:25 2015
@@ -598,8 +598,8 @@ insert_prop_internal(const dav_resource
{
svn_revnum_t revnum;
- serr = svn_fs_youngest_rev(&revnum, resource->info->repos->fs,
- scratch_pool);
+ serr = dav_svn__get_youngest_rev(&revnum, resource->info->repos,
+ scratch_pool);
if (serr != NULL)
{
ap_log_rerror(APLOG_MARK, APLOG_ERR, serr->apr_err,
Modified: subversion/trunk/subversion/mod_dav_svn/lock.c
URL:
http://svn.apache.org/viewvc/subversion/trunk/subversion/mod_dav_svn/lock.c?rev=1721716&r1=1721715&r2=1721716&view=diff
==============================================================================
--- subversion/trunk/subversion/mod_dav_svn/lock.c (original)
+++ subversion/trunk/subversion/mod_dav_svn/lock.c Sat Dec 26 09:14:25 2015
@@ -717,7 +717,7 @@ append_locks(dav_lockdb *lockdb,
/* Commit a 0-byte file: */
- if ((serr = svn_fs_youngest_rev(&rev, repos->fs, resource->pool)))
+ if ((serr = dav_svn__get_youngest_rev(&rev, repos, resource->pool)))
return dav_svn__convert_err(serr, HTTP_INTERNAL_SERVER_ERROR,
"Could not determine youngest revision",
resource->pool);
Modified:
subversion/trunk/subversion/mod_dav_svn/reports/get-location-segments.c
URL:
http://svn.apache.org/viewvc/subversion/trunk/subversion/mod_dav_svn/reports/get-location-segments.c?rev=1721716&r1=1721715&r2=1721716&view=diff
==============================================================================
--- subversion/trunk/subversion/mod_dav_svn/reports/get-location-segments.c
(original)
+++ subversion/trunk/subversion/mod_dav_svn/reports/get-location-segments.c Sat
Dec 26 09:14:25 2015
@@ -183,8 +183,8 @@ dav_svn__get_location_segments_report(co
{
svn_revnum_t youngest;
- serr = svn_fs_youngest_rev(&youngest, resource->info->repos->fs,
- resource->pool);
+ serr = dav_svn__get_youngest_rev(&youngest, resource->info->repos,
+ resource->pool);
if (serr != NULL)
return dav_svn__convert_err(serr, HTTP_INTERNAL_SERVER_ERROR,
"Could not determine youngest revision",
Modified: subversion/trunk/subversion/mod_dav_svn/reports/update.c
URL:
http://svn.apache.org/viewvc/subversion/trunk/subversion/mod_dav_svn/reports/update.c?rev=1721716&r1=1721715&r2=1721716&view=diff
==============================================================================
--- subversion/trunk/subversion/mod_dav_svn/reports/update.c (original)
+++ subversion/trunk/subversion/mod_dav_svn/reports/update.c Sat Dec 26
09:14:25 2015
@@ -970,7 +970,7 @@ dav_svn__update_report(const dav_resourc
dav_error *derr = NULL;
const char *src_path = NULL;
const char *dst_path = NULL;
- const dav_svn_repos *repos = resource->info->repos;
+ dav_svn_repos *repos = resource->info->repos;
const char *target = "";
svn_boolean_t text_deltas = TRUE;
svn_depth_t requested_depth = svn_depth_unknown;
@@ -1028,7 +1028,7 @@ dav_svn__update_report(const dav_resourc
/* Ask the repository about its youngest revision (which we'll need
for some input validation later). */
- if ((serr = svn_fs_youngest_rev(&youngest, repos->fs, resource->pool)))
+ if ((serr = dav_svn__get_youngest_rev(&youngest, repos, resource->pool)))
return dav_svn__convert_err(serr, HTTP_INTERNAL_SERVER_ERROR,
"Could not determine the youngest "
"revision for the update process.",
Modified: subversion/trunk/subversion/mod_dav_svn/repos.c
URL:
http://svn.apache.org/viewvc/subversion/trunk/subversion/mod_dav_svn/repos.c?rev=1721716&r1=1721715&r2=1721716&view=diff
==============================================================================
--- subversion/trunk/subversion/mod_dav_svn/repos.c (original)
+++ subversion/trunk/subversion/mod_dav_svn/repos.c Sat Dec 26 09:14:25 2015
@@ -810,7 +810,7 @@ prep_regular(dav_resource_combined *comb
### other cases besides a BC? */
if (comb->priv.root.rev == SVN_INVALID_REVNUM)
{
- serr = svn_fs_youngest_rev(&comb->priv.root.rev, repos->fs, pool);
+ serr = dav_svn__get_youngest_rev(&comb->priv.root.rev, repos, pool);
if (serr != NULL)
{
return dav_svn__convert_err(serr, HTTP_INTERNAL_SERVER_ERROR,
@@ -879,9 +879,9 @@ prep_version(dav_resource_combined *comb
/* if we don't have a revision, then assume the youngest */
if (!SVN_IS_VALID_REVNUM(comb->priv.root.rev))
{
- serr = svn_fs_youngest_rev(&comb->priv.root.rev,
- comb->priv.repos->fs,
- pool);
+ serr = dav_svn__get_youngest_rev(&comb->priv.root.rev,
+ comb->priv.repos,
+ pool);
if (serr != NULL)
{
/* ### might not be a baseline */
@@ -1583,6 +1583,7 @@ get_parentpath_resource(request_rec *r,
repos->special_uri = dav_svn__get_special_uri(r);
repos->username = r->user;
repos->client_capabilities = apr_hash_make(repos->pool);
+ repos->youngest_rev = SVN_INVALID_REVNUM;
/* Make sure this type of resource always has a trailing slash; if
not, redirect to a URI that does. */
@@ -2020,7 +2021,7 @@ parse_querystring(request_rec *r, const
else
{
/* No peg-rev? Default to HEAD, just like the cmdline client. */
- serr = svn_fs_youngest_rev(&peg_rev, comb->priv.repos->fs, pool);
+ serr = dav_svn__get_youngest_rev(&peg_rev, comb->priv.repos, pool);
if (serr != NULL)
return dav_svn__convert_err(serr, HTTP_INTERNAL_SERVER_ERROR,
"Couldn't fetch youngest rev.", pool);
@@ -2259,6 +2260,7 @@ get_resource(request_rec *r,
/* create the repository structure and stash it away */
repos = apr_pcalloc(r->pool, sizeof(*repos));
repos->pool = r->pool;
+ repos->youngest_rev = SVN_INVALID_REVNUM;
comb->priv.repos = repos;
@@ -4633,7 +4635,7 @@ dav_svn__working_to_regular_resource(dav
/* Change the URL into either a baseline-collection or a public one. */
if (priv->root.rev == SVN_INVALID_REVNUM)
{
- serr = svn_fs_youngest_rev(&priv->root.rev, repos->fs, resource->pool);
+ serr = dav_svn__get_youngest_rev(&priv->root.rev, repos, resource->pool);
if (serr != NULL)
return dav_svn__convert_err(serr, HTTP_INTERNAL_SERVER_ERROR,
"Could not determine youngest rev.",
Modified: subversion/trunk/subversion/mod_dav_svn/util.c
URL:
http://svn.apache.org/viewvc/subversion/trunk/subversion/mod_dav_svn/util.c?rev=1721716&r1=1721715&r2=1721716&view=diff
==============================================================================
--- subversion/trunk/subversion/mod_dav_svn/util.c (original)
+++ subversion/trunk/subversion/mod_dav_svn/util.c Sat Dec 26 09:14:25 2015
@@ -870,3 +870,19 @@ dav_svn__parse_request_skel(svn_skel_t *
*skel = svn_skel__parse(skel_str->data, skel_str->len, pool);
return OK;
}
+
+svn_error_t *
+dav_svn__get_youngest_rev(svn_revnum_t *youngest_p,
+ dav_svn_repos *repos,
+ apr_pool_t *scratch_pool)
+{
+ if (repos->youngest_rev == SVN_INVALID_REVNUM)
+ {
+ svn_revnum_t revnum;
+ SVN_ERR(svn_fs_youngest_rev(&revnum, repos->fs, scratch_pool));
+ repos->youngest_rev = revnum;
+ }
+
+ *youngest_p = repos->youngest_rev;
+ return SVN_NO_ERROR;
+}
Modified: subversion/trunk/subversion/mod_dav_svn/version.c
URL:
http://svn.apache.org/viewvc/subversion/trunk/subversion/mod_dav_svn/version.c?rev=1721716&r1=1721715&r2=1721716&view=diff
==============================================================================
--- subversion/trunk/subversion/mod_dav_svn/version.c (original)
+++ subversion/trunk/subversion/mod_dav_svn/version.c Sat Dec 26 09:14:25 2015
@@ -221,8 +221,8 @@ get_option(const dav_resource *resource,
const char *uuid;
/* Got youngest revision? */
- if ((serr = svn_fs_youngest_rev(&youngest, resource->info->repos->fs,
- resource->pool)))
+ if ((serr = dav_svn__get_youngest_rev(&youngest, resource->info->repos,
+ resource->pool)))
{
return dav_svn__convert_err
(serr, HTTP_INTERNAL_SERVER_ERROR,
@@ -616,8 +616,8 @@ dav_svn__checkout(dav_resource *resource
svn_revnum_t youngest;
/* make sure the baseline being checked out is the latest */
- serr = svn_fs_youngest_rev(&youngest, resource->info->repos->fs,
- resource->pool);
+ serr = dav_svn__get_youngest_rev(&youngest, resource->info->repos,
+ resource->pool);
if (serr != NULL)
{
/* ### correct HTTP error? */