You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@subversion.apache.org by Daniel Shahaf <d....@daniel.shahaf.name> on 2010/07/30 11:46:29 UTC

[PATCH] neon capabilities exchange

Trivial, but I'm trying to avoid a context switch:

[[[
Index: subversion/libsvn_ra_neon/options.c
===================================================================
--- subversion/libsvn_ra_neon/options.c (revision 980674)
+++ subversion/libsvn_ra_neon/options.c (working copy)
@@ -144,6 +144,8 @@ parse_capabilities(ne_request *req,
   *youngest_rev = SVN_INVALID_REVNUM;
 
   /* Start out assuming all capabilities are unsupported. */
+  apr_hash_set(ras->capabilities, SVN_RA_CAPABILITY_PARTIAL_REPLAY,
+               APR_HASH_KEY_STRING, capability_no);
   apr_hash_set(ras->capabilities, SVN_RA_CAPABILITY_DEPTH,
                APR_HASH_KEY_STRING, capability_no);
   apr_hash_set(ras->capabilities, SVN_RA_CAPABILITY_MERGEINFO,
Index: subversion/libsvn_ra_serf/options.c
===================================================================
--- subversion/libsvn_ra_serf/options.c (revision 980674)
+++ subversion/libsvn_ra_serf/options.c (working copy)
@@ -394,6 +394,8 @@ options_response_handler(serf_request_t *request,
   serf_bucket_t *hdrs = serf_bucket_response_get_headers(response);
 
   /* Start out assuming all capabilities are unsupported. */
+  apr_hash_set(orc->session->capabilities, SVN_RA_CAPABILITY_PARTIAL_REPLAY,
+               APR_HASH_KEY_STRING, capability_no);
   apr_hash_set(orc->session->capabilities, SVN_RA_CAPABILITY_DEPTH,
                APR_HASH_KEY_STRING, capability_no);
   apr_hash_set(orc->session->capabilities, SVN_RA_CAPABILITY_MERGEINFO,
]]]

How would the lack of these lines cause neon/serf to behave when run against
old servers?  (should they just loop because apr_hash_get() would return NULL?
but that's /not/ how they actually behave...)

Daniel
(it's trivial enough that I'll probably commit it later even if I can't test it)

Re: [PATCH] neon capabilities exchange

Posted by Daniel Shahaf <d....@daniel.shahaf.name>.
Daniel Shahaf wrote on Fri, Jul 30, 2010 at 15:30:19 +0300:
> So, here's an updated patch.  I'll commit it in a few days if I don't hear
> objections.

0:% svn ci --cl part
Sending        subversion/libsvn_ra_neon/options.c
Sending        subversion/libsvn_ra_serf/options.c
Sending        subversion/svnsync/main.c
Transmitting file data ...
Committed revision 984923.

> (btw, should the "partial replay capability present" check be done at every
> connection, rather than only in 'svnsync init'?  Well, maybe...)

Tabling.

Re: [PATCH] neon capabilities exchange

Posted by Daniel Shahaf <d....@daniel.shahaf.name>.
Daniel Shahaf wrote on Fri, Jul 30, 2010 at 14:46:29 +0300:
> Trivial, but I'm trying to avoid a context switch:
> 
> [[[
> Index: subversion/libsvn_ra_neon/options.c
> ===================================================================
> --- subversion/libsvn_ra_neon/options.c (revision 980674)
> +++ subversion/libsvn_ra_neon/options.c (working copy)
> @@ -144,6 +144,8 @@ parse_capabilities(ne_request *req,
>    *youngest_rev = SVN_INVALID_REVNUM;
>  
>    /* Start out assuming all capabilities are unsupported. */
> +  apr_hash_set(ras->capabilities, SVN_RA_CAPABILITY_PARTIAL_REPLAY,
> +               APR_HASH_KEY_STRING, capability_no);
>    apr_hash_set(ras->capabilities, SVN_RA_CAPABILITY_DEPTH,
>                 APR_HASH_KEY_STRING, capability_no);
>    apr_hash_set(ras->capabilities, SVN_RA_CAPABILITY_MERGEINFO,
> Index: subversion/libsvn_ra_serf/options.c
> ===================================================================
> --- subversion/libsvn_ra_serf/options.c (revision 980674)
> +++ subversion/libsvn_ra_serf/options.c (working copy)
> @@ -394,6 +394,8 @@ options_response_handler(serf_request_t *request,
>    serf_bucket_t *hdrs = serf_bucket_response_get_headers(response);
>  
>    /* Start out assuming all capabilities are unsupported. */
> +  apr_hash_set(orc->session->capabilities, SVN_RA_CAPABILITY_PARTIAL_REPLAY,
> +               APR_HASH_KEY_STRING, capability_no);
>    apr_hash_set(orc->session->capabilities, SVN_RA_CAPABILITY_DEPTH,
>                 APR_HASH_KEY_STRING, capability_no);
>    apr_hash_set(orc->session->capabilities, SVN_RA_CAPABILITY_MERGEINFO,
> ]]]
> 
> How would the lack of these lines cause neon/serf to behave when run against
> old servers?  (should they just loop because apr_hash_get() would return NULL?
> but that's /not/ how they actually behave...)

Re: [PATCH] neon capabilities exchange

Posted by Daniel Shahaf <d....@daniel.shahaf.name>.
Daniel Shahaf wrote on Fri, Jul 30, 2010 at 14:46:29 +0300:
> Trivial, but I'm trying to avoid a context switch:
> 
> [[[
> Index: subversion/libsvn_ra_neon/options.c
> ===================================================================
> --- subversion/libsvn_ra_neon/options.c (revision 980674)
> +++ subversion/libsvn_ra_neon/options.c (working copy)
> @@ -144,6 +144,8 @@ parse_capabilities(ne_request *req,
>    *youngest_rev = SVN_INVALID_REVNUM;
>  
>    /* Start out assuming all capabilities are unsupported. */
> +  apr_hash_set(ras->capabilities, SVN_RA_CAPABILITY_PARTIAL_REPLAY,
> +               APR_HASH_KEY_STRING, capability_no);
>    apr_hash_set(ras->capabilities, SVN_RA_CAPABILITY_DEPTH,
>                 APR_HASH_KEY_STRING, capability_no);
>    apr_hash_set(ras->capabilities, SVN_RA_CAPABILITY_MERGEINFO,
> Index: subversion/libsvn_ra_serf/options.c
> ===================================================================
> --- subversion/libsvn_ra_serf/options.c (revision 980674)
> +++ subversion/libsvn_ra_serf/options.c (working copy)
> @@ -394,6 +394,8 @@ options_response_handler(serf_request_t *request,
>    serf_bucket_t *hdrs = serf_bucket_response_get_headers(response);
>  
>    /* Start out assuming all capabilities are unsupported. */
> +  apr_hash_set(orc->session->capabilities, SVN_RA_CAPABILITY_PARTIAL_REPLAY,
> +               APR_HASH_KEY_STRING, capability_no);
>    apr_hash_set(orc->session->capabilities, SVN_RA_CAPABILITY_DEPTH,
>                 APR_HASH_KEY_STRING, capability_no);
>    apr_hash_set(orc->session->capabilities, SVN_RA_CAPABILITY_MERGEINFO,
> ]]]
> 
> How would the lack of these lines cause neon/serf to behave when run against
> old servers?  (should they just loop because apr_hash_get() would return NULL?
> but that's /not/ how they actually behave...)

>From IRC:

15:03 <@Bert> danielsh: (Nevermind.. it's the difference between returning unknown capability.. and not supported capability when the 
              server doesn't support it)
15:04 <@danielsh> Bert: *nod*, "unknown capability" is what I think should happen,
15:05 <@danielsh> but if that were the case,
15:05 <@danielsh> I'd expect the error to be reported (by folks who use pre-1.5 servers)
15:06 <@Bert> danielsh: The only way to get in that code path would be to use svnsync to sync a partial repository. Maybe svnsync just 
              handles that error?
15:07 <@danielsh> Bert: true, svnsync/main.c:738 just filters the UNKNOWN out
15:07 <@Bert> *nod*.. see svnsync/main.c around line 738
15:07 <@danielsh> isn't that a bug?
15:07 <@danielsh> unknown != no (as you said)
15:08 <@Bert> Well.. the result in both cases is that you get the SVN_ERR_RA_PARTIAL_REPLAY_NOT_SUPPORTED error from svnsync
15:08 <@danielsh> oh. and it leaks an error too
15:09 <@danielsh> Bert: true, but with a different error message
15:09 <@danielsh> you'd get SVN_ERR_UNKNOWN_CAPABILITY in one case but not in the other
15:09 <@danielsh> "Don't know anything about capability '%s'"
15:09 <@Bert> So we should probably fix neon.. and then we can just use SVN_ERR()
15:10 <@danielsh> I'll write that

So, here's an updated patch.  I'll commit it in a few days if I don't hear
objections.

[[[
Fix a bug in the neon/serf capabilities exchange, and plug a related error
leak in svnsync.

* subversion/libsvn_ra_neon/options.c (parse_capabilities),
* subversion/libsvn_ra_serf/options.c  (options_response_handler):
    Initialize SVN_RA_CAPABILITY_PARTIAL_REPLAY in the capabilities hash.

* subversion/svnsync/main.c
  (do_initialize):
    Plug an error leak, and start considering "unknown capability" as an
    actual error.
]]]

[[[
Index: subversion/libsvn_ra_neon/options.c
===================================================================
--- subversion/libsvn_ra_neon/options.c	(revision 980674)
+++ subversion/libsvn_ra_neon/options.c	(working copy)
@@ -144,6 +144,8 @@ parse_capabilities(ne_request *req,
   *youngest_rev = SVN_INVALID_REVNUM;
 
   /* Start out assuming all capabilities are unsupported. */
+  apr_hash_set(ras->capabilities, SVN_RA_CAPABILITY_PARTIAL_REPLAY,
+               APR_HASH_KEY_STRING, capability_no);
   apr_hash_set(ras->capabilities, SVN_RA_CAPABILITY_DEPTH,
                APR_HASH_KEY_STRING, capability_no);
   apr_hash_set(ras->capabilities, SVN_RA_CAPABILITY_MERGEINFO,
Index: subversion/libsvn_ra_serf/options.c
===================================================================
--- subversion/libsvn_ra_serf/options.c	(revision 980674)
+++ subversion/libsvn_ra_serf/options.c	(working copy)
@@ -394,6 +394,8 @@ options_response_handler(serf_request_t *request,
   serf_bucket_t *hdrs = serf_bucket_response_get_headers(response);
 
   /* Start out assuming all capabilities are unsupported. */
+  apr_hash_set(orc->session->capabilities, SVN_RA_CAPABILITY_PARTIAL_REPLAY,
+               APR_HASH_KEY_STRING, capability_no);
   apr_hash_set(orc->session->capabilities, SVN_RA_CAPABILITY_DEPTH,
                APR_HASH_KEY_STRING, capability_no);
   apr_hash_set(orc->session->capabilities, SVN_RA_CAPABILITY_MERGEINFO,
Index: subversion/svnsync/main.c
===================================================================
--- subversion/svnsync/main.c	(revision 980674)
+++ subversion/svnsync/main.c	(working copy)
@@ -735,14 +735,11 @@ do_initialize(svn_ra_session_t *to_session,
                                                &server_supports_partial_replay,
                                                SVN_RA_CAPABILITY_PARTIAL_REPLAY,
                                                pool);
-      if (err && err->apr_err == SVN_ERR_UNKNOWN_CAPABILITY)
-        {
-          svn_error_clear(err);
-          server_supports_partial_replay = FALSE;
-        }
+      if (err && err->apr_err != SVN_ERR_UNKNOWN_CAPABILITY)
+        return svn_error_return(err);
 
-      if (!server_supports_partial_replay)
-        return svn_error_create(SVN_ERR_RA_PARTIAL_REPLAY_NOT_SUPPORTED, NULL,
+      if (err || !server_supports_partial_replay)
+        return svn_error_create(SVN_ERR_RA_PARTIAL_REPLAY_NOT_SUPPORTED, err,
                                 NULL);
     }
 
]]]

Daniel
(btw, should the "partial replay capability present" check be done at every
connection, rather than only in 'svnsync init'?  Well, maybe...)