[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]
[or-cvs] [tor/master] Fix misreporting of stream bandwidths.
Author: Mike Perry <mikeperry-git@xxxxxxxxxx>
Date: Thu, 14 May 2009 05:20:27 -0700
Subject: Fix misreporting of stream bandwidths.
Commit: 29bf271ba2deb9714f515e03a9674ac43b9d7156
---
ChangeLog | 1 +
src/or/connection.c | 1 +
src/or/connection_edge.c | 1 +
src/or/control.c | 22 ++++++++++++++++++++++
src/or/or.h | 1 +
5 files changed, 26 insertions(+), 0 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index 4918dd2..b898ff8 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -12,6 +12,7 @@ Changes in version 0.2.1.15??? - ????-??-??
directory authority. Fixes part of bug 932.
- When we change to or from being a bridge, reset our counts of
client usage by country. Fixes bug 932.
+ - Fix a bug that made stream bandwidth get misreported to the controller.
Changes in version 0.2.1.14-rc - 2009-04-12
diff --git a/src/or/connection.c b/src/or/connection.c
index 3a01c28..15a7110 100644
--- a/src/or/connection.c
+++ b/src/or/connection.c
@@ -618,6 +618,7 @@ connection_about_to_close_connection(connection_t *conn)
conn->marked_for_close_file, conn->marked_for_close);
dnsserv_reject_request(edge_conn);
}
+ control_event_stream_bandwidth(edge_conn);
control_event_stream_status(edge_conn, STREAM_EVENT_CLOSED,
edge_conn->end_reason);
circ = circuit_get_by_edge_conn(edge_conn);
diff --git a/src/or/connection_edge.c b/src/or/connection_edge.c
index b350c08..f7b4e35 100644
--- a/src/or/connection_edge.c
+++ b/src/or/connection_edge.c
@@ -160,6 +160,7 @@ connection_edge_destroy(circid_t circ_id, edge_connection_t *conn)
"CircID %d: At an edge. Marking connection for close.", circ_id);
if (conn->_base.type == CONN_TYPE_AP) {
connection_mark_unattached_ap(conn, END_STREAM_REASON_DESTROY);
+ control_event_stream_bandwidth(conn);
control_event_stream_status(conn, STREAM_EVENT_CLOSED,
END_STREAM_REASON_DESTROY);
conn->end_reason |= END_STREAM_REASON_FLAG_ALREADY_SENT_CLOSED;
diff --git a/src/or/control.c b/src/or/control.c
index 26758de..3e0fb84 100644
--- a/src/or/control.c
+++ b/src/or/control.c
@@ -3275,6 +3275,28 @@ control_event_or_conn_status(or_connection_t *conn, or_conn_status_event_t tp,
return 0;
}
+/**
+ * Print out STREAM_BW event for a single conn
+ */
+int
+control_event_stream_bandwidth(edge_connection_t *edge_conn)
+{
+ if (EVENT_IS_INTERESTING(EVENT_STREAM_BANDWIDTH_USED)) {
+ if (!edge_conn->n_read && !edge_conn->n_written)
+ return 0;
+
+ send_control_event(EVENT_STREAM_BANDWIDTH_USED, ALL_NAMES,
+ "650 STREAM_BW "U64_FORMAT" %lu %lu\r\n",
+ U64_PRINTF_ARG(edge_conn->_base.global_identifier),
+ (unsigned long)edge_conn->n_read,
+ (unsigned long)edge_conn->n_written);
+
+ edge_conn->n_written = edge_conn->n_read = 0;
+ }
+
+ return 0;
+}
+
/** A second or more has elapsed: tell any interested control
* connections how much bandwidth streams have used. */
int
diff --git a/src/or/or.h b/src/or/or.h
index 731cf5e..a20015e 100644
--- a/src/or/or.h
+++ b/src/or/or.h
@@ -3225,6 +3225,7 @@ int control_event_stream_status(edge_connection_t *conn,
int control_event_or_conn_status(or_connection_t *conn,
or_conn_status_event_t e, int reason);
int control_event_bandwidth_used(uint32_t n_read, uint32_t n_written);
+int control_event_stream_bandwidth(edge_connection_t *edge_conn);
int control_event_stream_bandwidth_used(void);
void control_event_logmsg(int severity, unsigned int domain, const char *msg);
int control_event_descriptors_changed(smartlist_t *routers);
--
1.5.6.5