Browse Source

Merge branch 'bug2756_relay' into maint-0.2.2

Nick Mathewson 13 years ago
parent
commit
c5ffd44ccd
5 changed files with 34 additions and 2 deletions
  1. 11 0
      changes/bug2756
  2. 2 0
      src/or/connection.c
  3. 17 0
      src/or/connection_edge.c
  4. 1 0
      src/or/connection_edge.h
  5. 3 2
      src/or/relay.c

+ 11 - 0
changes/bug2756

@@ -0,0 +1,11 @@
+  o Minor bugfixes (spec conformance, performance):
+    - We now ask the other side of a stream (the client or the exit)
+      for more data on that stream when the amount of queued data on
+      that stream dips low enough.  Previously, we wouldn't ask the
+      other side for more data until either it sent us more data
+      (which it wasn't supposed to do if it had exhausted its
+      window!) or until we had completely flushed all our queued
+      data.  Fixing this should improve throughput.  Fixes bug 2756;
+      bugfix on the earliest released versions of Tor (svn commit
+      r152).
+

+ 2 - 0
src/or/connection.c

@@ -3245,6 +3245,8 @@ connection_flushed_some(connection_t *conn)
     r = connection_dirserv_flushed_some(TO_DIR_CONN(conn));
   } else if (conn->type == CONN_TYPE_OR) {
     r = connection_or_flushed_some(TO_OR_CONN(conn));
+  } else if (CONN_IS_EDGE(conn)) {
+    r = connection_edge_flushed_some(TO_EDGE_CONN(conn));
   }
   conn->in_flushed_some = 0;
   return r;

+ 17 - 0
src/or/connection_edge.c

@@ -301,6 +301,23 @@ connection_edge_end_errno(edge_connection_t *conn)
   return connection_edge_end(conn, reason);
 }
 
+/** We just wrote some data to <b>conn</b>; act appropriately.
+ *
+ * (That is, if it's open, consider sending a stream-level sendme cell if we
+ * have just flushed enough.)
+ */
+int
+connection_edge_flushed_some(edge_connection_t *conn)
+{
+  switch (conn->_base.state) {
+    case AP_CONN_STATE_OPEN:
+    case EXIT_CONN_STATE_OPEN:
+      connection_edge_consider_sending_sendme(conn);
+      break;
+  }
+  return 0;
+}
+
 /** Connection <b>conn</b> has finished writing and has no bytes left on
  * its outbuf.
  *

+ 1 - 0
src/or/connection_edge.h

@@ -23,6 +23,7 @@ int connection_edge_process_inbuf(edge_connection_t *conn,
 int connection_edge_destroy(circid_t circ_id, edge_connection_t *conn);
 int connection_edge_end(edge_connection_t *conn, uint8_t reason);
 int connection_edge_end_errno(edge_connection_t *conn);
+int connection_edge_flushed_some(edge_connection_t *conn);
 int connection_edge_finished_flushing(edge_connection_t *conn);
 int connection_edge_finished_connecting(edge_connection_t *conn);
 

+ 3 - 2
src/or/relay.c

@@ -1409,8 +1409,9 @@ connection_edge_package_raw_inbuf(edge_connection_t *conn, int package_partial,
   goto repeat_connection_edge_package_raw_inbuf;
 }
 
-/** Called when we've just received a relay data cell, or when
- * we've just finished flushing all bytes to stream <b>conn</b>.
+/** Called when we've just received a relay data cell, when
+ * we've just finished flushing all bytes to stream <b>conn</b>,
+ * or when we've flushed *some* bytes to the stream <b>conn</b>.
  *
  * If conn->outbuf is not too full, and our deliver window is
  * low, send back a suitable number of stream-level sendme cells.