Skip to content

Commit

Permalink
WIP
Browse files Browse the repository at this point in the history
  • Loading branch information
Brian Tiger Chow committed Jan 28, 2015
1 parent bbcec1d commit 8e8da82
Show file tree
Hide file tree
Showing 3 changed files with 109 additions and 22 deletions.
27 changes: 21 additions & 6 deletions cmd/ipfs-gateway-fs/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,19 @@ import (
"time"

context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context"
"github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/crowdmob/goamz/aws"
"github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/crowdmob/goamz/s3"
aws "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/crowdmob/goamz/aws"
s3 "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/crowdmob/goamz/s3"
"github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore"
syncds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync"
core "github.com/jbenet/go-ipfs/core"
corehttp "github.com/jbenet/go-ipfs/core/corehttp"
corerepo "github.com/jbenet/go-ipfs/core/corerepo"
"github.com/jbenet/go-ipfs/core/corerouting"
coreunix "github.com/jbenet/go-ipfs/core/coreunix"
config "github.com/jbenet/go-ipfs/repo/config"
fsrepo "github.com/jbenet/go-ipfs/repo/fsrepo"
"github.com/jbenet/go-ipfs/thirdparty/s3-datastore"
s3datastore "github.com/jbenet/go-ipfs/thirdparty/s3-datastore"
ds2 "github.com/jbenet/go-ipfs/util/datastore2"
)

var (
Expand Down Expand Up @@ -59,13 +63,19 @@ func run() error {
return err
}
}

repo := fsrepo.At(repoPath)
if err := repo.Open(); err != nil { // owned by node
return err
}

node, err := core.NewIPFSNode(ctx, core.Online(repo))
s3, err := makeS3Datastore()
if err != nil {
return err
}
enhanced, err := enhanceDatastore(s3)
if err != nil {
return err
}
node, err := core.NewIPFSNode(ctx, core.OnlineWithRouting(repo, corerouting.GrandCentralServer(enhanced)))
if err != nil {
return err
}
Expand Down Expand Up @@ -146,3 +156,8 @@ func makeS3Datastore() (*s3datastore.S3Datastore, error) {
Client: s3c,
}, nil
}

func enhanceDatastore(d datastore.Datastore) (datastore.ThreadSafeDatastore, error) {
// TODO cache
return ds2.CloserWrap(syncds.MutexWrap(d)), nil
}
38 changes: 22 additions & 16 deletions core/core.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package core

import (
"errors"
"fmt"
"io"
"time"
Expand Down Expand Up @@ -144,10 +145,7 @@ func Offline(r repo.Repo) ConfigOption {
return Standard(r, false)
}

func OnlineWithRouting(r repo.Repo, router routing.IpfsRouting) ConfigOption {
if router == nil {
panic("router required")
}
func OnlineWithRouting(r repo.Repo, router RoutingOption) ConfigOption {
return standardWithRouting(r, true, router)
}

Expand All @@ -157,11 +155,11 @@ func Online(r repo.Repo) ConfigOption {

// DEPRECATED: use Online, Offline functions
func Standard(r repo.Repo, online bool) ConfigOption {
return standardWithRouting(r, online, nil)
return standardWithRouting(r, online, DHTOption)
}

// TODO refactor so maybeRouter isn't special-cased in this way
func standardWithRouting(r repo.Repo, online bool, maybeRouter routing.IpfsRouting) ConfigOption {
func standardWithRouting(r repo.Repo, online bool, routingOption RoutingOption) ConfigOption {
return func(ctx context.Context) (n *IpfsNode, err error) {
// FIXME perform node construction in the main constructor so it isn't
// necessary to perform this teardown in this scope.
Expand Down Expand Up @@ -203,7 +201,7 @@ func standardWithRouting(r repo.Repo, online bool, maybeRouter routing.IpfsRouti
}

if online {
if err := n.startOnlineServices(ctx, maybeRouter); err != nil {
if err := n.startOnlineServices(ctx, routingOption); err != nil {
return nil, err
}
} else {
Expand All @@ -215,7 +213,7 @@ func standardWithRouting(r repo.Repo, online bool, maybeRouter routing.IpfsRouti
}
}

func (n *IpfsNode) startOnlineServices(ctx context.Context, maybeRouter routing.IpfsRouting) error {
func (n *IpfsNode) startOnlineServices(ctx context.Context, routingOption RoutingOption) error {

if n.PeerHost != nil { // already online.
return debugerror.New("node already online")
Expand All @@ -236,15 +234,11 @@ func (n *IpfsNode) startOnlineServices(ctx context.Context, maybeRouter routing.
n.Diagnostics = diag.NewDiagnostics(n.Identity, n.PeerHost)

// setup routing service
if maybeRouter != nil {
n.Routing = maybeRouter
} else {
dhtRouting, err := constructDHTRouting(ctx, n.PeerHost, n.Repo.Datastore())
if err != nil {
return debugerror.Wrap(err)
}
n.Routing = dhtRouting
r, err := routingOption(ctx, n)
if err != nil {
return debugerror.Wrap(err)
}
n.Routing = r

// setup exchange service
const alwaysSendToPeer = true // use YesManStrategy
Expand Down Expand Up @@ -456,3 +450,15 @@ func constructDHTRouting(ctx context.Context, host p2phost.Host, ds datastore.Th
dhtRouting.Validator[IpnsValidatorTag] = namesys.ValidateIpnsRecord
return dhtRouting, nil
}

type RoutingOption func(context.Context, *IpfsNode) (routing.IpfsRouting, error)

var DHTOption RoutingOption = func(ctx context.Context, n *IpfsNode) (routing.IpfsRouting, error) {
if n.PeerHost == nil {
return nil, errors.New("dht requires a peerhost")
}
if n.Repo == nil {
return nil, errors.New("dht requires a datastore. (node has no Repo)")
}
return constructDHTRouting(ctx, n.PeerHost, n.Repo.Datastore())
}
66 changes: 66 additions & 0 deletions core/corerouting/core.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
package corerouting

import (
"errors"

context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context"
datastore "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore"
core "github.com/jbenet/go-ipfs/core"
"github.com/jbenet/go-ipfs/p2p/peer"
routing "github.com/jbenet/go-ipfs/routing"
grandcentral "github.com/jbenet/go-ipfs/routing/grandcentral"
gcproxy "github.com/jbenet/go-ipfs/routing/grandcentral/proxy"
)

// NB: DHT option is included in the core to avoid 1) because it's a sane
// default and 2) to avoid a circular dependency (it needs to be referenced in
// the core if it's going to be the default)

var (
errHostMissing = errors.New("grandcentral client requires a Host component")
errIdentityMissing = errors.New("grandcentral server requires a peer ID identity")
errPeerstoreMissing = errors.New("grandcentral server requires a peerstore")
errServersMissing = errors.New("grandcentral client requires at least 1 server peer")
)

// TODO doc
func GrandCentralServer(recordSource datastore.ThreadSafeDatastore) core.RoutingOption {
return func(ctx context.Context, node *core.IpfsNode) (routing.IpfsRouting, error) {
if node.Peerstore == nil {
return nil, errPeerstoreMissing
}
if node.Identity == "" {
return nil, errIdentityMissing
}
server, err := grandcentral.NewServer(recordSource, node.Peerstore, node.Identity)
if err != nil {
return nil, err
}
proxy := &gcproxy.Loopback{
Handler: server,
Local: node.Identity,
}
return grandcentral.NewClient(proxy, node.Peerstore, node.Identity)
}
}

// TODO doc
func GrandCentralClient(remotes ...peer.PeerInfo) core.RoutingOption {
return func(ctx context.Context, node *core.IpfsNode) (routing.IpfsRouting, error) {
if len(remotes) < 1 {
return nil, errServersMissing
}
if node.PeerHost == nil {
return nil, errHostMissing
}
if node.Identity == "" {
return nil, errIdentityMissing
}

// TODO right now, I think this has a hidden dependency on the
// bootstrap peers provided to the core.Node. Careful...

proxy := gcproxy.Standard(node.PeerHost, remotes[0].ID) // TODO support more than one
return grandcentral.NewClient(proxy, node.Peerstore, node.Identity)
}
}

0 comments on commit 8e8da82

Please sign in to comment.