public StructuredNode(AHAddress add, string realm):base(add,realm) { /** * Here are the ConnectionOverlords */ _leafco = new LeafConnectionOverlord(this); AddConnectionOverlord(_leafco); _snco = new StructuredNearConnectionOverlord(this); AddConnectionOverlord(_snco); _ssco = new StructuredShortcutConnectionOverlord(this); AddConnectionOverlord(_ssco); #if !BRUNET_SIMULATOR _iphandler = new IPHandler(); _iphandler.Subscribe(this, null); AddTADiscovery(new LocalDiscovery(this, Realm, _rpc, _iphandler)); #endif /** * Turn on some protocol support : */ /// Turn on Packet Forwarding Support : GetTypeSource(PType.Protocol.Forwarding).Subscribe(new PacketForwarder(this), null); AHHandler = new AHHandler(this); GetTypeSource(PType.Protocol.AH).Subscribe(AHHandler, 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); }
/** * Create a node with a given local address and * a set of Routers. * @param addr Address for the local node * @param realm the Realm or Namespace this node belongs to */ protected Node(Address addr, string realm) { //Start with the address hashcode: _sync = new Object(); lock(_sync) { DemuxHandler = new DemuxHandler(); /* * Make all the hashtables : */ _local_add = AddressParser.Parse( addr.ToMemBlock() ); _realm = String.Intern(realm); /* Set up the heartbeat */ _heart_period = 500; //500 ms, or 1/2 second. _heartbeat_handlers = new Dictionary<EventHandler, Brunet.Util.FuzzyEvent>(); _task_queue = new NodeTaskQueue(this); _packet_queue = new BCon.LFBlockingQueue<IAction>(); _running = 0; _send_pings = 1; _LOG = ProtocolLog.Monitor.Enabled; _connection_table = new ConnectionTable(new DefaultERPolicy(addr)); _connection_table.ConnectionEvent += this.ConnectionHandler; LockMgr = new ConnectionLockManager(_connection_table); //We start off offline. _con_state = Node.ConnectionState.Offline; /* Set up the ReqrepManager as a filter */ _rrm = new ReqrepManager(this.ToString()); DemuxHandler.GetTypeSource(PType.Protocol.ReqRep).Subscribe(_rrm, null); _rrm.Subscribe(this, null); this.HeartBeatEvent += _rrm.TimeoutChecker; /* Set up RPC */ _rpc = new RpcManager(_rrm); DemuxHandler.GetTypeSource( PType.Protocol.Rpc ).Subscribe(_rpc, null); //Add a map-reduce handlers: _mr_handler = new MR.MapReduceHandler(this); //Subscribe it with the RPC handler: _rpc.AddHandler("mapreduce", _mr_handler); /* * Where there is a change in the Connections, we might have a state * change */ _connection_table.ConnectionEvent += this.CheckForStateChange; _connection_table.DisconnectionEvent += this.CheckForStateChange; #if !BRUNET_SIMULATOR _codeinjection = new Brunet.Services.CodeInjection(this); _codeinjection.LoadLocalModules(); #endif /* * We must later make sure the EdgeEvent events from * any EdgeListeners are connected to _cph.EdgeHandler */ /** * Here are the protocols that every edge must support */ /* Here are the transport addresses */ _remote_ta = ImmutableList<TransportAddress>.Empty; /*@throw ArgumentNullException if the list ( new ArrayList()) is null. */ /* EdgeListener's */ _edgelistener_list = new ArrayList(); _co_list = new List<ConnectionOverlord>(); _edge_factory = new EdgeFactory(); _ta_discovery = ImmutableList<Discovery>.Empty; StateChangeEvent += HandleTADiscoveryState; /* Initialize this at 15 seconds */ _connection_timeout = new TimeSpan(0,0,0,0,15000); //Check the edges from time to time IAction cec_act = new HeartBeatAction(this, this.CheckEdgesCallback); _check_edges = Brunet.Util.FuzzyTimer.Instance.DoEvery(delegate(DateTime dt) { this.EnqueueAction(cec_act); }, 5000, 500); } }