소스 검색

Add initial history-tracking backend code for reputation module. Not called or tested yet.

svn:r1310
Nick Mathewson 20 년 전
부모
커밋
da9d5ccfda
4개의 변경된 파일194개의 추가작업 그리고 4개의 파일을 삭제
  1. 6 3
      src/common/util.h
  2. 1 1
      src/or/Makefile.am
  3. 12 0
      src/or/or.h
  4. 175 0
      src/or/rephist.c

+ 6 - 3
src/common/util.h

@@ -41,6 +41,7 @@ void *tor_realloc(void *ptr, size_t size);
 char *tor_strdup(const char *s);
 char *tor_strndup(const char *s, size_t n);
 #define tor_free(p) do {if(p) {free(p); (p)=NULL;}} while(0)
+void tor_strlower(char *s);
 
 typedef struct {
   void **list;
@@ -66,9 +67,11 @@ strmap_t* strmap_new(void);
 void* strmap_set(strmap_t *map, const char *key, void *val);
 void* strmap_get(strmap_t *map, const char *key);
 void* strmap_remove(strmap_t *map, const char *key);
-void strmap_foreach(strmap_t *map,
-		    void* (*fn)(const char *key, void *val, void *data),
-		    void *data);
+void* strmap_set_lc(strmap_t *map, const char *key, void *val);
+void* strmap_get_lc(strmap_t *map, const char *key);
+void* strmap_remove_lc(strmap_t *map, const char *key);
+typedef void* (*strmap_foreach_fn)(const char *key, void *val, void *data);
+void strmap_foreach(strmap_t *map, strmap_foreach_fn fn, void *data);
 void strmap_free(strmap_t *map, void (*free_val)(void*));
 
 strmap_iter_t *strmap_iter_init(strmap_t *map);

+ 1 - 1
src/or/Makefile.am

@@ -7,7 +7,7 @@ bin_PROGRAMS = tor
 tor_SOURCES = buffers.c circuit.c command.c connection.c \
              connection_or.c config.c dirserv.c \
              onion.c router.c routerlist.c directory.c dns.c connection_edge.c \
-             cpuworker.c main.c tor_main.c
+             rephist.c cpuworker.c main.c tor_main.c
 
 tor_LDADD = ../common/libor.a
 

+ 12 - 0
src/or/or.h

@@ -900,6 +900,18 @@ void directory_set_dirty();
 size_t dirserv_get_directory(const char **cp);
 
 
+/********************************* rephist.c ***************************/
+
+void rep_hist_init(void);
+void rep_hist_note_connect_failed(const char* nickname, time_t when);
+void rep_hist_note_connect_succeeded(const char* nickname, time_t when);
+void rep_hist_note_connection_died(const char* nickname, time_t when);
+void rep_hist_note_extend_succeeded(const char *from_name,
+				    const char *to_name);
+void rep_hist_note_extend_failed(const char *from_name, const char *to_name);
+void rep_hist_dump_status(time_t now);
+
+
 #endif
 
 /*

+ 175 - 0
src/or/rephist.c

@@ -0,0 +1,175 @@
+/* Copyright 2004 Roger Dingledine */
+/* See LICENSE for licensing information */
+/* $Id$ */
+
+#include "or.h"
+
+typedef struct link_history_t {
+  time_t since;
+  unsigned long n_extend_ok;
+  unsigned long n_extend_fail;
+} link_history_t;
+
+typedef struct or_history_t {
+  time_t since;
+  unsigned long n_conn_ok;
+  unsigned long n_conn_fail;
+  unsigned long uptime;
+  unsigned long downtime;
+  time_t up_since;
+  time_t down_since;
+  strmap_t *link_history_map;
+} or_history_t;
+
+static strmap_t *history_map;
+
+static or_history_t *get_or_history(const char* nickname)
+{
+  or_history_t *hist;
+  hist = (or_history_t*) strmap_get(history_map, nickname);
+  if (!hist) {
+    hist = tor_malloc_zero(sizeof(or_history_t));
+    hist->link_history_map = strmap_new();
+    hist->since = time(NULL);
+    strmap_set(history_map, nickname, hist);
+  }
+  return hist;
+}
+
+static link_history_t *get_link_history(const char *from_name,
+					const char *to_name)
+{
+  or_history_t *orhist;
+  link_history_t *lhist;
+  orhist = get_or_history(from_name);
+  lhist = (link_history_t*) strmap_get(orhist->link_history_map, to_name);
+  if (!lhist) {
+    lhist = tor_malloc_zero(sizeof(link_history_t));
+    lhist->since = time(NULL);
+    strmap_set(orhist->link_history_map, to_name, lhist);
+  }
+  return lhist;
+}
+
+static void update_or_history(or_history_t *hist, time_t when)
+{
+  assert(hist);
+  if (hist->up_since) {
+    assert(!hist->down_since);
+    hist->uptime += (when - hist->up_since);
+    hist->up_since = when;
+  } else if (hist->down_since) {
+    hist->downtime += (when - hist->down_since);
+    hist->down_since = when;
+  }
+}
+
+void rep_hist_init(void)
+{
+  history_map = strmap_new();
+}
+
+void rep_hist_note_connect_failed(const char* nickname, time_t when)
+{
+  or_history_t *hist;
+  hist = get_or_history(nickname);
+  ++hist->n_conn_fail;
+  if (hist->up_since) {
+    hist->uptime += (when - hist->up_since);
+    hist->up_since = 0;
+  }
+  if (!hist->down_since)
+    hist->down_since = when;
+}
+
+void rep_hist_note_connect_succeeded(const char* nickname, time_t when)
+{
+  or_history_t *hist;
+  hist = get_or_history(nickname);
+  ++hist->n_conn_ok;
+  if (hist->down_since) {
+    hist->downtime += (when - hist->down_since);
+    hist->down_since = 0;
+  }
+  if (!hist->up_since)
+    hist->up_since = when;
+}
+void rep_hist_note_connection_died(const char* nickname, time_t when)
+{
+  or_history_t *hist;
+  hist = get_or_history(nickname);
+  if (hist->up_since) {
+    hist->uptime += (when - hist->up_since);
+    hist->up_since = 0;
+  }
+  if (!hist->down_since)
+    hist->down_since = when;
+}
+
+void rep_hist_note_extend_succeeded(const char *from_name,
+				    const char *to_name)
+{
+  link_history_t *hist;
+  hist = get_link_history(from_name, to_name);
+  ++hist->n_extend_ok;
+}
+void rep_hist_note_extend_failed(const char *from_name, const char *to_name)
+{
+  link_history_t *hist;
+  hist = get_link_history(from_name, to_name);
+  ++hist->n_extend_fail;
+}
+
+void rep_hist_dump_status(time_t now)
+{
+  strmap_iter_t *lhist_it;
+  strmap_iter_t *orhist_it;
+  const char *name1, *name2;
+  or_history_t *or_history;
+  link_history_t *link_history;
+  double uptime;
+  char buffer[2048];
+  char *cp;
+  int len;
+
+  log(LOG_WARN, "--------------- Dumping history information:");
+
+  for (orhist_it = strmap_iter_init(history_map); !strmap_iter_done(orhist_it);
+       orhist_it = strmap_iter_next(history_map,orhist_it)) {
+    strmap_iter_get(orhist_it, &name1, (void**)&or_history);
+
+    update_or_history(or_history, now);
+
+    uptime = ((double)or_history->uptime) / or_history->downtime;
+    log(LOG_WARN, "OR %s: %ld/%ld good connection attempts; uptime %.2f%%",
+	name1,
+	or_history->n_conn_ok, or_history->n_conn_fail+or_history->n_conn_ok,
+	uptime*100.0);
+
+    strcpy(buffer, "    Good extend attempts: ");
+    len = strlen(buffer);
+    for (lhist_it = strmap_iter_init(or_history->link_history_map);
+	 !strmap_iter_done(lhist_it);
+	 lhist_it = strmap_iter_next(or_history->link_history_map, lhist_it)) {
+      strmap_iter_get(lhist_it, &name2, (void**)&link_history);
+      len += snprintf(buffer+len, 2048-len, "%s(%ld/%ld); ", name2,
+		      link_history->n_extend_ok,
+		      link_history->n_extend_ok+link_history->n_extend_fail);
+      if (len >= 2048) {
+	buffer[2047]='\0';
+	break;
+      }
+    }
+    log(LOG_WARN, buffer);
+  }
+}
+
+
+
+/*
+  Local Variables:
+  mode:c
+  indent-tabs-mode:nil
+  c-basic-offset:2
+  End:
+*/