opensubscriber
   Find in this group all groups
 
Unknown more information…

i : issues@subversion.tigris.org 18 June 2012 • 7:13PM -0400

[Issue 4195] properties after close_file on checkout over https
by philip

REPLY TO AUTHOR
 
REPLY TO GROUP




http://subversion.tigris.org/issues/show_bug.cgi?id=4195






------- Additional comments from philip@tigr... Mon Jun 18 04:13:42 -0700 2012 -------
I patched re_serf/serf to store pointers from the PROPFIND request to GET and
the GET to the PROPFIND. This allows no_more_writes to check whether it "splits"
the PROPFIND and GET by moving the GET to hold_requests. When this split doesn't
happen the abort doesn't occur.  When the split does happen the abort occurs
shortly after.


Index: outgoing.c
===================================================================
--- outgoing.c  (revision 1622)
+++ outgoing.c  (working copy)
@@ -282,6 +282,10 @@
     /* We can take the *next* request in our list and assume it hasn't
      * been written yet and 'save' it for the new socket.
      */
+
+    if (request->next->pair_prev)
+      printf("!!!split\n");
+
     conn->hold_requests = request->next;
     conn->hold_requests_tail = conn->requests_tail;
     request->next = NULL;
@@ -1288,6 +1292,9 @@
     request->written = 0;
     request->next = NULL;

+    request->pair_next = NULL;
+    request->pair_prev = NULL;
+
     /* Link the request to the end of the request chain. */
     if (conn->state == SERF_CONN_CLOSING) {
         link_requests(&conn->hold_requests, &conn->hold_requests_tail, request);
@@ -1303,7 +1310,24 @@
     return request;
}

+apr_status_t serf_connection_request_pair(serf_connection_t *conn,
+                                          void *one,
+                                          void *two)
+{
+  serf_request_t *request = conn->requests;

+  while(request && request->setup_baton != one)
+    request = request->next;
+
+  if (!request || !request->next || request->next->setup_baton != two)
+    return APR_EGENERAL;
+
+  request->pair_next = request->next;
+  request->next->pair_prev = request;
+
+  return APR_SUCCESS;
+}
+
serf_request_t *serf_connection_priority_request_create(
     serf_connection_t *conn,
     serf_request_setup_t setup,
Index: serf_private.h
===================================================================
--- serf_private.h      (revision 1622)
+++ serf_private.h      (working copy)
@@ -67,6 +67,9 @@
     int written;
     int priority;

+    struct serf_request_t *pair_next;
+    struct serf_request_t *pair_prev;
+

Index: ../src/subversion/libsvn_ra_serf/update.c
===================================================================
--- ../src/subversion/libsvn_ra_serf/update.c   (revision 1351229)
+++ ../src/subversion/libsvn_ra_serf/update.c   (working copy)
@@ -1333,7 +1344,15 @@

           fetch_ctx->handler = handler;

+          printf("!!!create: GET %p %s\n", handler->conn->conn, handler->path);
+          propfind_handler->get = handler;
+          handler->propfind = propfind_handler;
+          handler->other_done = FALSE;
           svn_ra_serf__request_create(handler);
+          if (serf_connection_request_pair(handler->conn->conn,
+                                           propfind_handler,
+                                           handler))
+            abort();

           ctx->active_fetches++;
         }

------------------------------------------------------
http://subversion.tigris.org/ds/viewMessage.do?dsForumId=463&dsMessageId=2971815

To unsubscribe from this discussion, e-mail: [issues-unsubscribe@subv...].

Bookmark with:

Delicious   Digg   reddit   Facebook   StumbleUpon

Related Messages

opensubscriber is not affiliated with the authors of this message nor responsible for its content.