This CO is administered by "user-level" applications to specify end-points that the user would like to be connected with.
When AddAddress is called, the address is added to _connection_state and ConnectTo is called on the address. If the node connects, all is fine, if not, this will attempt twice more to connect. If that fails, every hour thereafter, this CO will try 3 more times to get connected until it does or it is removed. If a Managed connection disconnects, this will automatically attempt to repair the connection by acting as if the address had just been added. All this is handled by using _connection_state as the state holder per address.
Наследование: PolicyBasedConnectionOverlord
Пример #1
0
    public StructuredNode(AHAddress add, string realm):base(add,realm)
    {
      /**
       * Here are the ConnectionOverlords
       */ 
      _leafco = new LeafConnectionOverlord(this);
      _snco = new StructuredNearConnectionOverlord(this);
      _ssco = new StructuredShortcutConnectionOverlord(this);
      _cco = new ChotaConnectionOverlord(this);
      _mco = new ManagedConnectionOverlord(this);
#if !BRUNET_SIMULATOR
      _localco = new LocalConnectionOverlord(this);
      _iphandler = new IPHandler();
      _iphandler.Subscribe(this, null);
#endif

      /**
       * Turn on some protocol support : 
       */
      /// Turn on Packet Forwarding Support :
      GetTypeSource(PType.Protocol.Forwarding).Subscribe(new PacketForwarder(this), null);
      //Handles AHRouting:
      GetTypeSource(PType.Protocol.AH).Subscribe(new AHHandler(this), this);
      GetTypeSource(PType.Protocol.Echo).Subscribe(new EchoHandler(), this);
      
      //Add the standard RPC handlers:
      _rpc.AddHandler("sys:ctm", new CtmRequestHandler(this));
      sys_link = new ConnectionPacketHandler(this);
      _rpc.AddHandler("sys:link", sys_link);
      _rpc.AddHandler("trace", new TraceRpcHandler(this));
      //Serve some public information about our ConnectionTable
      _rpc.AddHandler("ConnectionTable", new ConnectionTableRpc(ConnectionTable, _rpc));
      //Add a map-reduce handlers:
      _mr_handler = new MapReduceHandler(this);
      //Subscribe it with the RPC handler:
      _rpc.AddHandler("mapreduce", _mr_handler);

      //Subscribe map-reduce tasks
      _mr_handler.SubscribeTask(new MapReduceTrace(this));
      _mr_handler.SubscribeTask(new MapReduceRangeCounter(this));

      
      /*
       * Handle Node state changes.
       */
      StateChangeEvent += delegate(Node n, Node.ConnectionState s) {
        if( s == Node.ConnectionState.Leaving ) {
          //Start our StructuredNode specific leaving:
          Leave();
        }
      };

      _connection_table.ConnectionEvent += new EventHandler(this.EstimateSize);
      _connection_table.ConnectionEvent += new EventHandler(this.UpdateNeighborStatus);
      _connection_table.DisconnectionEvent += new EventHandler(this.EstimateSize);
      _connection_table.DisconnectionEvent += new EventHandler(this.UpdateNeighborStatus);
    }
Пример #2
0
    protected void EstablishConnection()
    {
      var node0 = Node0.Node;
      var node1 = Node1.Node;
      ManagedConnectionOverlord mco = new ManagedConnectionOverlord(node0);
      mco.Start();
      node0.AddConnectionOverlord(mco);
      mco.Set(node1.Address);

      EventHandler eh = delegate(object obj, EventArgs ea) { AreConnectedHandler(); };
      _are_connected = new AreConnected(node0, node1, eh);
      _are_connected.Start();
    }
Пример #3
0
    public static void Run(RelayOverlapSimulator sim, Address addr1, Address addr2)
    {
      Console.WriteLine("Beginning");
      sim.Complete(false);

      SimpleTimer.RunSteps(1000000, false);
      StructuredNode node1 = (sim.Nodes[addr1] as NodeMapping).Node as StructuredNode;
      StructuredNode node2 = (sim.Nodes[addr2] as NodeMapping).Node as StructuredNode;
      sim.Complete(true);

      ManagedConnectionOverlord mco = new ManagedConnectionOverlord(node1);
      mco.Start();
      node1.AddConnectionOverlord(mco);
      mco.Set(addr2);

      Connection con1 = node1.ConnectionTable.GetConnection(ConnectionType.Structured, addr2);
      while(con1 == null) {
        SimpleTimer.RunStep();
        con1 = node1.ConnectionTable.GetConnection(ConnectionType.Structured, addr2);
      }

      Console.WriteLine(addr1 + "<=>" + addr2 + ":");
      Console.WriteLine("\t" + node1.ConnectionTable.GetConnection(ConnectionType.Structured, addr2) + "\n");
      sim.FindOverlap(node1, node2);
      node1.Disconnect();
      node2.Disconnect();
      SimpleTimer.RunSteps(100000);
      Console.WriteLine("End");
    }
Пример #4
0
    // Static Members

    public static void Simulator(RelayOverlapSimulator sim)
    {
      Address addr1 = null, addr2 = null;
      sim.AddDisconnectedPair(out addr1, out addr2, sim.NCEnable);
      sim.Complete(false);
      SimpleTimer.RunSteps(1000000, false);

      StructuredNode node1 = (sim.Nodes[addr1] as NodeMapping).Node as StructuredNode;
      StructuredNode node2 = (sim.Nodes[addr2] as NodeMapping).Node as StructuredNode;

      ManagedConnectionOverlord mco = new ManagedConnectionOverlord(node1);
      mco.Start();
      node1.AddConnectionOverlord(mco);
      mco.Set(addr2);
      SimpleTimer.RunSteps(100000, false);

      Console.WriteLine(addr1 + "<=>" + addr2 + ":");
      Console.WriteLine("\t" + node1.ConnectionTable.GetConnection(ConnectionType.Structured, addr2) + "\n");
      sim.PrintConnections(node1);
      Console.WriteLine();
      sim.PrintConnections(node2);

      Console.WriteLine("\nPhase 2 -- Disconnect...");
      sim.FindOverlap(node1, node2);
      sim.CloseOverlap(node1);
      sim.CloseOverlap(node2);

      SimpleTimer.RunSteps(100000, false);

      Console.WriteLine(addr1 + "<=>" + addr2 + ":");
      Console.WriteLine("\t" + node1.ConnectionTable.GetConnection(ConnectionType.Structured, addr2) + "\n");
      sim.PrintConnections(node1);
      Console.WriteLine();
      sim.PrintConnections(node2);

      sim.Disconnect();
    }
Пример #5
0
    protected Result DoNatTest(Simulator sim, Node node0, Node node1)
    {
      sim.Complete(true);
//      SimpleTimer.RunSteps(3600000);
      SimpleTimer.RunSteps(600000);
      long throughput = Throughput(node0.EdgeListenerList) + Throughput(node1.EdgeListenerList);
      DateTime start = DateTime.UtcNow;

      ManagedConnectionOverlord mco = new ManagedConnectionOverlord(node0);
      mco.Start();
      node0.AddConnectionOverlord(mco);
      mco.Set(node1.Address);

      AreConnected connected = new AreConnected(node0, node1, null);
      connected.Start();
      connected.Run(120);

      long time = (DateTime.UtcNow - start).Ticks / TimeSpan.TicksPerMillisecond;
      double avg_throughput = 0;
      if(time > 0) {
        throughput = Throughput(node0.EdgeListenerList) +
          Throughput(node1.EdgeListenerList) - throughput;
        avg_throughput = (1.0 * throughput) / time / 1000;
      }

      sim.Disconnect();
      return new Result(connected.TATypeAsString, time, avg_throughput);
    }