Commit a3eaabfe authored by Roger Dingledine's avatar Roger Dingledine
Browse files

Be willing to read or write on local connections (e.g. controller

connections) even when the global rate limiting buckets are empty.


svn:r9368
parent b470da0e
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -19,6 +19,8 @@ Changes in version 0.1.2.7-alpha - 2007-??-??
    - Servers decline directory requests much more aggressively when
      they're low on bandwidth. Otherwise they end up queueing more and
      more directory responses, which can't be good for latency.
    - Be willing to read or write on local connections (e.g. controller
      connections) even when the global rate limiting buckets are empty.

  o Minor bugfixes:
    - When computing clock skew from directory HTTP headers, consider what
+17 −1
Original line number Diff line number Diff line
@@ -1099,8 +1099,16 @@ retry_all_listeners(int force, smartlist_t *replaced_conns,

extern int global_read_bucket, global_write_bucket;

/** Did our global write bucket run dry last second? If so, we are
 * likely to run dry again this second, so be stingy with the tokens
 * we just put in. */
static int global_write_bucket_empty_last_second = 0;

/** Helper function to decide how many bytes out of <b>global_bucket</b>
 * we're willing to use for this transaction. <b>base</b> is the size
 * of a cell on the network; <b>priority</b> says whether we should
 * write many of them or just a few; and <b>conn_bucket</b> (if
 * non-negative) provides an upper limit for our answer. */
static int
connection_bucket_round_robin(int base, int priority,
                              int global_bucket, int conn_bucket)
@@ -1142,6 +1150,10 @@ connection_bucket_read_limit(connection_t *conn)
    or_connection_t *or_conn = TO_OR_CONN(conn);
    conn_bucket = or_conn->read_bucket;
  }
  if (conn_is_internal(conn->addr, 0)) {
    /* be willing to read on local conns even if our buckets are empty */
    return conn_bucket>=0 ? conn_bucket : 2**14;
  }
  return connection_bucket_round_robin(base, priority,
                                       global_read_bucket, conn_bucket);
}
@@ -1154,6 +1166,10 @@ connection_bucket_write_limit(connection_t *conn)
               CELL_NETWORK_SIZE : RELAY_PAYLOAD_SIZE;
  int priority = conn->type != CONN_TYPE_DIR;

  if (conn_is_internal(conn->addr, 0)) {
    /* be willing to write to local conns even if our buckets are empty */
    return conn->outbuf_flushlen;
  }
  return connection_bucket_round_robin(base, priority, global_write_bucket,
                                       conn->outbuf_flushlen);
}
@@ -1590,7 +1606,7 @@ connection_outbuf_too_full(connection_t *conn)
 * from connection_write_to_buf() when an entire TLS record is ready.
 *
 * Update conn-\>timestamp_lastwritten to now, and call flush_buf
 * or flush_buf_tls appropriately. If it succeeds and there no more
 * or flush_buf_tls appropriately. If it succeeds and there are no more
 * more bytes on conn->outbuf, then call connection_finished_flushing
 * on it too.
 *