From 1dfcce9f5a8c46673e8a3e4006d2ced6005055fb Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Mon, 2 Feb 2015 07:31:53 -0800 Subject: [PATCH] fix(grc) move Bootstrap method onto routing interface --- core/corerouting/core.go | 13 +------------ routing/supernode/client.go | 4 ++++ routing/supernode/proxy/loopback.go | 5 +++++ routing/supernode/proxy/standard.go | 18 ++++++++++++++---- routing/supernode/server.go | 4 ++++ 5 files changed, 28 insertions(+), 16 deletions(-) diff --git a/core/corerouting/core.go b/core/corerouting/core.go index 45070bf17..50ba42575 100644 --- a/core/corerouting/core.go +++ b/core/corerouting/core.go @@ -66,18 +66,7 @@ func SupernodeClient(remotes ...peer.PeerInfo) core.RoutingOption { return nil, errors.New("need peerstore") } - // TODO move to bootstrap method - for _, info := range remotes { - if err := node.PeerHost.Connect(ctx, info); err != nil { - return nil, err // TODO - } - } - - var ids []peer.ID - for _, info := range remotes { - ids = append(ids, info.ID) - } - proxy := gcproxy.Standard(node.PeerHost, ids) + proxy := gcproxy.Standard(node.PeerHost, remotes) node.PeerHost.SetStreamHandler(gcproxy.ProtocolSNR, proxy.HandleStream) return supernode.NewClient(proxy, node.PeerHost, node.Peerstore, node.Identity) } diff --git a/routing/supernode/client.go b/routing/supernode/client.go index 96b58681e..14a264524 100644 --- a/routing/supernode/client.go +++ b/routing/supernode/client.go @@ -131,4 +131,8 @@ func (c *Client) Ping(ctx context.Context, id peer.ID) (time.Duration, error) { return time.Nanosecond, errors.New("supernode routing does not support the ping method") } +func (c *Client) Bootstrap(ctx context.Context) error { + return c.proxy.Bootstrap(ctx) +} + var _ routing.IpfsRouting = &Client{} diff --git a/routing/supernode/proxy/loopback.go b/routing/supernode/proxy/loopback.go index e5fa39deb..01aeeac3c 100644 --- a/routing/supernode/proxy/loopback.go +++ b/routing/supernode/proxy/loopback.go @@ -20,6 +20,11 @@ type Loopback struct { Local peer.ID } +func (_ *Loopback) Bootstrap(ctx context.Context) error { + return nil +} + + // SendMessage intercepts local requests, forwarding them to a local handler func (lb *Loopback) SendMessage(ctx context.Context, m *dhtpb.Message) error { response := lb.Handler.HandleRequest(ctx, lb.Local, m) diff --git a/routing/supernode/proxy/standard.go b/routing/supernode/proxy/standard.go index 1918e344a..1a095cd64 100644 --- a/routing/supernode/proxy/standard.go +++ b/routing/supernode/proxy/standard.go @@ -18,6 +18,7 @@ const ProtocolSNR = "/ipfs/supernoderouting" var log = eventlog.Logger("supernode/proxy") type Proxy interface { + Bootstrap(context.Context) error HandleStream(inet.Stream) SendMessage(ctx context.Context, m *dhtpb.Message) error SendRequest(ctx context.Context, m *dhtpb.Message) (*dhtpb.Message, error) @@ -25,13 +26,22 @@ type Proxy interface { type standard struct { Host host.Host - Remotes []peer.ID + Remotes []peer.PeerInfo } -func Standard(h host.Host, remotes []peer.ID) Proxy { +func Standard(h host.Host, remotes []peer.PeerInfo) Proxy { return &standard{h, remotes} } +func (px *standard) Bootstrap(ctx context.Context) error { + for _, info := range px.Remotes { + if err := px.Host.Connect(ctx, info); err != nil { + return err // TODO + } + } + return nil +} + func (p *standard) HandleStream(s inet.Stream) { // TODO(brian): Should clients be able to satisfy requests? log.Error("supernode client received (dropped) a routing message from", s.Conn().RemotePeer()) @@ -44,7 +54,7 @@ func (p *standard) HandleStream(s inet.Stream) { func (px *standard) SendMessage(ctx context.Context, m *dhtpb.Message) error { var err error for _, i := range rand.Perm(len(px.Remotes)) { - remote := px.Remotes[i] + remote := px.Remotes[i].ID if err = px.sendMessage(ctx, m, remote); err != nil { // careful don't re-declare err! continue } @@ -82,7 +92,7 @@ func (px *standard) sendMessage(ctx context.Context, m *dhtpb.Message, remote pe func (px *standard) SendRequest(ctx context.Context, m *dhtpb.Message) (*dhtpb.Message, error) { var err error for _, i := range rand.Perm(len(px.Remotes)) { - remote := px.Remotes[i] + remote := px.Remotes[i].ID var reply *dhtpb.Message reply, err = px.sendRequest(ctx, m, remote) // careful don't redeclare err! if err != nil { diff --git a/routing/supernode/server.go b/routing/supernode/server.go index 78a686ebe..5aca4c4d0 100644 --- a/routing/supernode/server.go +++ b/routing/supernode/server.go @@ -32,6 +32,10 @@ func NewServer(ds datastore.ThreadSafeDatastore, ps peer.Peerstore, local peer.I return s, nil } +func (_ *Server) Bootstrap(ctx context.Context) error { + return nil +} + // HandleLocalRequest implements the proxy.RequestHandler interface. This is // where requests are received from the outside world. func (s *Server) HandleRequest(ctx context.Context, p peer.ID, req *dhtpb.Message) *dhtpb.Message {