⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chordobserver.c

📁 P2P模拟器
💻 C
字号:
/* * Copyright (c) 2003-2005 Jinyang Li *                    Massachusetts Institute of Technology *  * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: *  * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. *  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */#include "chordobserver.h"#include "p2psim/node.h"#include "p2psim/args.h"#include "p2psim/network.h"#include "protocols/protocolfactory.h"#include <iostream>#include <set>#include <algorithm>#include <stdio.h>using namespace std;ChordObserver* ChordObserver::_instance = 0;ChordObserver*ChordObserver::Instance(Args *a){  if(!_instance)    _instance = New ChordObserver(a);  return _instance;}ChordObserver::ChordObserver(Args *a) : _type("Chord"){  _instance = this;  if (a)    _oracle_num = a->nget( "oracle", 0, 10 );  else    _oracle_num = 0;  _totallivenodes = 0;  assert(_type.find("Chord") == 0 || _type.find("Koorde") == 0);  ids.clear();  const set<Node*> *l = Network::Instance()->getallnodes();  Chord::IDMap n;  for(set<Node*>::iterator pos = l->begin(); pos != l->end(); ++pos) {    Chord *t = dynamic_cast<Chord*>(*pos);    n.ip = t->ip();    n.id = t->id();    n.timestamp = 0;    ids.push_back(n);    if (_oracle_num)      t->registerObserver(this);  }  sort(ids.begin(),ids.end(),Chord::IDMap::cmp);#ifdef CHORD_DEBUG  for (uint i = 0; i < ids.size(); i++)     printf("%qx %u\n", ids[i].id, ids[i].ip);#endif}vector<Chord::IDMap>ChordObserver::get_sorted_nodes(){  assert(ids.size()>0);  return ids;}voidChordObserver::static_simulation(){  const set<Node*> *l = Network::Instance()->getallnodes();  Topology *t = Network::Instance()->gettopology();  uint query = 0;  double all = 0.0;  for(set<Node*>::iterator pos = l->begin(); pos != l->end(); ++pos) {    Chord *start = dynamic_cast<Chord*>(*pos);    for (uint i = 0; i < 10; i++) {      unsigned lat = 0;      Chord *curr = start;      Chord::CHID key = ConsistentHash::getRandID();      Chord::IDMap next = curr->next_hop(key);      while (next.ip!=curr->ip()) {	lat += t->latency(curr->ip(),next.ip);	curr = dynamic_cast<Chord*>(Network::Instance()->getnode(next.ip));	next = curr->next_hop(key);      }      lat += t->latency(next.ip,start->ip());      all += (double)lat;      query++;    }  }  printf("%.3f %u\n",all/query,query);}ChordObserver::~ChordObserver(){}voidChordObserver::kick(Observed *o, ObserverInfo *oi){  if (!oi) return;  char *event = (char *) oi;  assert( event );  string event_s(event);  assert(_oracle_num);  Chord *n = (Chord *) o;  assert( n );    set<Node*>::iterator pos;   Chord *c = 0;  const set<Node*> *l = Network::Instance()->getallnodes();   if( event_s == "join" ) {    //ids.clear();#ifdef CHORD_DEBUG    printf("ChordObserver oracle node %u,%qx joined\n", n->ip(), n->id());#endif    //add this newly joined node to the sorted list of alive nodes    vector<Chord::IDMap>::iterator p;    p = upper_bound(ids.begin(),ids.end(),n->idmap(),Chord::IDMap::cmp);    if (p->ip != n->ip())       ids.insert(p,1,n->idmap());     for (pos = l->begin(); pos != l->end(); ++pos) {      c = (Chord *)(*pos);      assert(c);      if (c->alive() && c->ip() != n->ip()) {	c->oracle_node_joined(n->idmap());      }    }    n->initstate();  } else if (event_s == "crash") {#ifdef CHORD_DEBUG    printf("%llu ChordObserver oracle node %u,%qx crashed\n", now(), n->ip(), n->id());#endif    //delete this crashed node to the sorted list of alive nodes    vector<Chord::IDMap>::iterator p;    p = find(ids.begin(),ids.end(),n->idmap());    assert(p->ip == n->ip());    ids.erase(p);    for (pos = l->begin(); pos != l->end(); ++pos) {      c = (Chord *)(*pos);      assert(c);      if (c->alive() && c->ip() != n->ip()) 	c->oracle_node_died(n->idmap());    }  }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -