func New(alive *bool, port *int, orga *string, orgp *int, httpport *int, fingers, maxsuccessors uint) *types.Storage_t { org := organizer.New(*orga, *orgp) if org == nil { panic(nil) } c, listener := register(org, port, fingers, maxsuccessors, alive) if c == nil { println("Failed to setup chord") return nil } httplistener := host.SetupHttpListener(c.Node, httpport) dht := new(types.Storage_t) dht.Chord = c dht.Storagemap = make(types.Storagemap_t) dht.Chord.Owner = dht dht.Joining = true if httplistener != nil { dht.Listener = httplistener } netutils.RPCRegisterName("DHT", dht) joinhost := c.Successor if joinhost.Equal(c.Node) { dht.Joining = false } err := c.Join(joinhost, nil) if err != nil { org.ReportDead(c.Node.ID) return nil } println("Joined chord ring on: " + joinhost.Address()) slave := new(types.Slave_t) slave.KillFunc = func() { println("Killed by organizer") c.Organizer.ReportDead(c.Node.ID) listener.Close() if httplistener != nil { httplistener.Close() } *alive = false } slave.LeaveFunc = func() { println("Received order to leave from organizer") c.Owner.(*types.Storage_t).Leave(nil, nil) *alive = false } ok := netutils.RPCRegisterName("Slave", slave) if ok { go chord.RunStabilizer(c) go chord.RunPredecessorCheck(c) go chord.RunReporter(c) go chord.RunFixFingers(c) go EnvControl(dht) if httplistener != nil { http.HandleFunc("/", dht.Reqhandler) go http.Serve(httplistener, nil) } } c.Organizer.HostChange(c.Node) return dht }