[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[or-cvs] kill -USR1 the or and it will dump conn/circuit stats to st...
- To: or-cvs@freehaven.net
- Subject: [or-cvs] kill -USR1 the or and it will dump conn/circuit stats to st...
- From: arma@seul.org (Roger Dingledine)
- Date: Sat, 21 Sep 2002 18:41:51 -0400 (EDT)
- Delivered-To: archiver@seul.org
- Delivered-To: or-cvs-outgoing@seul.org
- Delivered-To: or-cvs@seul.org
- Delivery-Date: Sat, 21 Sep 2002 18:41:52 -0400
- Reply-To: or-dev@freehaven.net
- Sender: owner-or-cvs@freehaven.net
Update of /home/or/cvsroot/src/or
In directory moria.seul.org:/home/arma/work/onion/cvs/src/or
Modified Files:
circuit.c connection.c main.c or.h
Log Message:
kill -USR1 the or and it will dump conn/circuit stats to stdout
Index: circuit.c
===================================================================
RCS file: /home/or/cvsroot/src/or/circuit.c,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -d -r1.12 -r1.13
--- circuit.c 24 Aug 2002 07:55:49 -0000 1.12
+++ circuit.c 21 Sep 2002 22:41:48 -0000 1.13
@@ -8,6 +8,12 @@
static circuit_t *global_circuitlist=NULL;
+char *circuit_state_to_string[] = {
+ "receiving the onion", /* 0 */
+ "connecting to firsthop", /* 1 */
+ "open" /* 2 */
+};
+
/********* END VARIABLES ************/
void circuit_add(circuit_t *circ) {
@@ -397,5 +403,20 @@
connection_send_destroy(circ->n_aci, circ->n_conn);
circuit_free(circ);
}
+}
+
+void circuit_dump_by_conn(connection_t *conn) {
+ circuit_t *circ;
+
+ for(circ=global_circuitlist;circ;circ = circ->next) {
+ if(circ->p_conn == conn) {
+ printf("Conn %d has App-ward circuit: aci %d (other side %d), state %d (%s)\n",
+ conn->poll_index, circ->p_aci, circ->n_aci, circ->state, circuit_state_to_string[circ->state]);
+ }
+ if(circ->n_conn == conn) {
+ printf("Conn %d has Exit-ward circuit: aci %d (other side %d), state %d (%s)\n",
+ conn->poll_index, circ->n_aci, circ->p_aci, circ->state, circuit_state_to_string[circ->state]);
+ }
+ }
}
Index: connection.c
===================================================================
RCS file: /home/or/cvsroot/src/or/connection.c,v
retrieving revision 1.21
retrieving revision 1.22
diff -u -d -r1.21 -r1.22
--- connection.c 17 Sep 2002 08:14:37 -0000 1.21
+++ connection.c 21 Sep 2002 22:41:48 -0000 1.22
@@ -8,38 +8,43 @@
extern or_options_t options; /* command-line and config-file options */
-#if 0
-/* these are now out of date :( -RD */
char *conn_type_to_string[] = {
- "OP listener", /* 0 */
- "OP", /* 1 */
- "OR listener", /* 2 */
- "OR", /* 3 */
- "App" /* 4 */
+ "", /* 0 */
+ "OP listener", /* 1 */
+ "OP", /* 2 */
+ "OR listener", /* 3 */
+ "OR", /* 4 */
+ "Exit", /* 5 */
+ "App listener",/* 6 */
+ "App" /* 7 */
};
char *conn_state_to_string[][10] = {
+ { }, /* no type associated with 0 */
{ "ready" }, /* op listener, 0 */
{ "awaiting keys", /* op, 0 */
"open", /* 1 */
"close", /* 2 */
"close_wait" }, /* 3 */
{ "ready" }, /* or listener, 0 */
- { "connecting (as client)", /* or, 0 */
- "sending auth (as client)", /* 1 */
- "waiting for auth (as client)", /* 2 */
- "sending nonce (as client)", /* 3 */
- "waiting for auth (as server)", /* 4 */
- "sending auth (as server)", /* 5 */
- "waiting for nonce (as server)",/* 6 */
- "open" }, /* 7 */
- { "connecting", /* exit, 0 */
- "open", /* 1 */
- "waiting for dest info", /* 2 */
- "flushing buffer, then will close",/* 3 */
- "close_wait" } /* 4 */
+ { "connecting (as OP)", /* or, 0 */
+ "sending keys (as OP)", /* 1 */
+ "connecting (as client)", /* 2 */
+ "sending auth (as client)", /* 3 */
+ "waiting for auth (as client)", /* 4 */
+ "sending nonce (as client)", /* 5 */
+ "waiting for auth (as server)", /* 6 */
+ "sending auth (as server)", /* 7 */
+ "waiting for nonce (as server)",/* 8 */
+ "open" }, /* 9 */
+ { "waiting for dest info", /* exit, 0 */
+ "connecting", /* 1 */
+ "open" }, /* 2 */
+ { "ready" }, /* app listener, 0 */
+ { "awaiting dest info", /* app, 0 */
+ "waiting for OR connection", /* 1 */
+ "open" } /* 2 */
};
-#endif
/********* END VARIABLES ************/
@@ -399,6 +404,14 @@
if(conn->type == CONN_TYPE_OR || conn->type == CONN_TYPE_OP)
return 1;
+ return 0;
+}
+
+int connection_is_listener(connection_t *conn) {
+ if(conn->type == CONN_TYPE_OP_LISTENER ||
+ conn->type == CONN_TYPE_OR_LISTENER ||
+ conn->type == CONN_TYPE_AP_LISTENER)
+ return 1;
return 0;
}
Index: main.c
===================================================================
RCS file: /home/or/cvsroot/src/or/main.c,v
retrieving revision 1.21
retrieving revision 1.22
diff -u -d -r1.21 -r1.22
--- main.c 4 Sep 2002 06:29:28 -0000 1.21
+++ main.c 21 Sep 2002 22:41:48 -0000 1.22
@@ -18,6 +18,8 @@
static int nfds=0; /* number of connections currently active */
+static int please_dumpstats=0; /* whether we should dump stats during the loop */
+
/* private key */
static crypto_pk_env_t *prkey;
@@ -439,6 +441,9 @@
options.ORPort, options.OPPort, options.APPort);
for(;;) {
+ if(please_dumpstats) {
+ dumpstats();
+ }
if(prepare_for_poll(&timeout) < 0) {
log(LOG_DEBUG,"do_main_loop(): prepare_for_poll failed, exiting.");
return -1;
@@ -483,18 +488,46 @@
}
}
-void catch () {
+void catchint () {
errno = 0; /* netcat does this. it looks fun. */
- log(LOG_DEBUG,"Catching ^c, exiting cleanly.");
+ log(LOG_NOTICE,"Catching ^c, exiting cleanly.");
exit(0);
}
+void catchusr1 () {
+ please_dumpstats = 1;
+}
+
+void dumpstats (void) { /* dump stats to stdout */
+ int i;
+ connection_t *conn;
+ extern char *conn_type_to_string[];
+ extern char *conn_state_to_string[][10];
+
+ printf("Dumping stats:\n");
+
+ for(i=0;i<nfds;i++) {
+ conn = connection_array[i];
+ printf("Conn %d (socket %d) type %d (%s), state %d (%s)\n",
+ i, conn->s, conn->type, conn_type_to_string[conn->type],
+ conn->state, conn_state_to_string[conn->type][conn->state]);
+ if(!connection_is_listener(conn)) {
+ printf("Conn %d is to '%s:%d'.\n",i,conn->address, conn->port);
+ }
+ circuit_dump_by_conn(conn); /* dump info about all the circuits using this conn */
+ printf("\n");
+ }
+
+ please_dumpstats = 0;
+}
+
int main(int argc, char *argv[]) {
int retval = 0;
- signal (SIGINT, catch); /* to catch ^c so we can exit cleanly */
+ signal (SIGINT, catchint); /* to catch ^c so we can exit cleanly */
+ signal (SIGUSR1, catchusr1); /* to dump stats to stdout */
if ( getoptions(argc,argv,&options) ) exit(1);
log(options.loglevel,NULL); /* assign logging severity level from options */
Index: or.h
===================================================================
RCS file: /home/or/cvsroot/src/or/or.h,v
retrieving revision 1.22
retrieving revision 1.23
diff -u -d -r1.22 -r1.23
--- or.h 19 Sep 2002 20:13:27 -0000 1.22
+++ or.h 21 Sep 2002 22:41:48 -0000 1.23
@@ -386,6 +386,8 @@
void circuit_about_to_close_connection(connection_t *conn);
/* flush and send destroys for all circuits using conn */
+void circuit_dump_by_conn(connection_t *conn);
+
/********************************* command.c ***************************/
void command_process_cell(cell_t *cell, connection_t *conn);
@@ -439,6 +441,7 @@
void connection_init_timeval(connection_t *conn);
int connection_speaks_cells(connection_t *conn);
+int connection_is_listener(connection_t *conn);
int connection_state_is_open(connection_t *conn);
int connection_send_destroy(aci_t aci, connection_t *conn);
@@ -554,6 +557,10 @@
int prepare_for_poll(int *timeout);
int do_main_loop(void);
+
+void catchint();
+void catchusr1();
+void dumpstats(void);
int main(int argc, char *argv[]);