diff --git a/cmd/ipfs/daemon.go b/cmd/ipfs/daemon.go index 7b51d902240..c35b2f178dc 100644 --- a/cmd/ipfs/daemon.go +++ b/cmd/ipfs/daemon.go @@ -45,6 +45,7 @@ const ( routingOptionDHTClientKwd = "dhtclient" routingOptionDHTKwd = "dht" routingOptionNoneKwd = "none" + routingOptionDefaultKwd = "default" unencryptTransportKwd = "disable-transport-encryption" unrestrictedApiAccessKwd = "unrestricted-api" writableKwd = "writable" @@ -150,7 +151,7 @@ Headers. Options: []cmdkit.Option{ cmdkit.BoolOption(initOptionKwd, "Initialize ipfs with default settings if not already initialized"), cmdkit.StringOption(initProfileOptionKwd, "Configuration profiles to apply for --init. See ipfs init --help for more"), - cmdkit.StringOption(routingOptionKwd, "Overrides the routing option").WithDefault("dht"), + cmdkit.StringOption(routingOptionKwd, "Overrides the routing option").WithDefault("default"), cmdkit.BoolOption(mountKwd, "Mounts IPFS to the filesystem"), cmdkit.BoolOption(writableKwd, "Enable writing objects (with POST, PUT and DELETE)"), cmdkit.StringOption(ipfsMountKwd, "Path to the mountpoint for IPFS (if using --mount). Defaults to config setting."), @@ -300,6 +301,22 @@ func daemonFunc(req *cmds.Request, re cmds.ResponseEmitter, env cmds.Environment } routingOption, _ := req.Options[routingOptionKwd].(string) + if err != nil { + re.SetError(err, cmdkit.ErrNormal) + return + } + if routingOption == routingOptionDefaultKwd { + cfg, err := repo.Config() + if err != nil { + re.SetError(err, cmdkit.ErrNormal) + return + } + + routingOption = cfg.Routing.Type + if routingOption == "" { + routingOption = routingOptionDHTKwd + } + } switch routingOption { case routingOptionSupernodeKwd: re.SetError(errors.New("supernode routing was never fully implemented and has been removed"), cmdkit.ErrNormal) diff --git a/cmd/ipfs/init.go b/cmd/ipfs/init.go index ab6bf17ed65..ee4171871a0 100644 --- a/cmd/ipfs/init.go +++ b/cmd/ipfs/init.go @@ -39,6 +39,9 @@ Available profiles: running IPFS on machines with public IPv4 addresses. 'test' - Reduces external interference of IPFS daemon, this is useful when using the daemon in test environments. + 'lowpower' - Reduces daemon overhead on the system. May affect node + functionality - performance of content discovery and data fetching + may be degraded. ipfs uses a repository in the local file system. By default, the repo is located at ~/.ipfs. To change the repo location, set the $IPFS_PATH diff --git a/docs/config.md b/docs/config.md index 33dc9d3aae4..e89a8fc9fd5 100644 --- a/docs/config.md +++ b/docs/config.md @@ -197,6 +197,12 @@ Default: `true` - `Interval` A number of seconds to wait between discovery checks. +- `Routing` +Content routing mode. Can be overridden with daemon `--routing` flag. +Valid modes are: + - `dht` (default) + - `dhtclient` + - `none` ## `Gateway` Options for the HTTP gateway. diff --git a/repo/config/config.go b/repo/config/config.go index ac7c1152b77..719170baad8 100644 --- a/repo/config/config.go +++ b/repo/config/config.go @@ -19,6 +19,7 @@ type Config struct { Addresses Addresses // local node's addresses Mounts Mounts // local node's mount points Discovery Discovery // local node's discovery mechanisms + Routing Routing // local node's routing settings Ipns Ipns // Ipns settings Bootstrap []string // local nodes's bootstrap peer addresses Gateway Gateway // local node's gateway server options diff --git a/repo/config/init.go b/repo/config/init.go index 26ac8e6ccf4..54d17f7b7bf 100644 --- a/repo/config/init.go +++ b/repo/config/init.go @@ -38,10 +38,16 @@ func Init(out io.Writer, nBitsForKeypair int) (*Config, error) { Datastore: datastore, Bootstrap: BootstrapPeerStrings(bootstrapPeers), Identity: identity, - Discovery: Discovery{MDNS{ - Enabled: true, - Interval: 10, - }}, + Discovery: Discovery{ + MDNS: MDNS{ + Enabled: true, + Interval: 10, + }, + }, + + Routing: Routing{ + Type: "dht", + }, // setup the node mount points. Mounts: Mounts{ diff --git a/repo/config/profile.go b/repo/config/profile.go index 74383cda63f..b20382ef4ed 100644 --- a/repo/config/profile.go +++ b/repo/config/profile.go @@ -1,5 +1,7 @@ package config +import "time" + // Transformer is a function which takes configuration and applies some filter to it type Transformer func(c *Config) error @@ -73,6 +75,15 @@ var Profiles = map[string]Transformer{ c.Datastore.Spec = DefaultDatastoreConfig().Spec return nil }, + "lowpower": func(c *Config) error { + c.Routing.Type = "dhtclient" + c.Reprovider.Interval = "0" + + c.Swarm.ConnMgr.LowWater = 20 + c.Swarm.ConnMgr.HighWater = 40 + c.Swarm.ConnMgr.GracePeriod = time.Minute.String() + return nil + }, } func appendSingle(a []string, b []string) []string { diff --git a/repo/config/routing.go b/repo/config/routing.go new file mode 100644 index 00000000000..e601cd5e8d3 --- /dev/null +++ b/repo/config/routing.go @@ -0,0 +1,7 @@ +package config + +// Routing defines configuration options for libp2p routing +type Routing struct { + // Type sets default daemon routing mode. + Type string +} diff --git a/test/sharness/t0020-init.sh b/test/sharness/t0020-init.sh index 65f811bc6c8..ffaa71152c8 100755 --- a/test/sharness/t0020-init.sh +++ b/test/sharness/t0020-init.sh @@ -167,6 +167,20 @@ test_expect_success "clean up ipfs dir" ' rm -rf "$IPFS_PATH" ' +test_expect_success "'ipfs init --profile=lowpower' succeeds" ' + BITS="1024" && + ipfs init --bits="$BITS" --profile=lowpower +' + +test_expect_success "'ipfs config Discovery.Routing' looks good" ' + ipfs config Routing.Type > actual_config && + test $(cat actual_config) = "dhtclient" +' + +test_expect_success "clean up ipfs dir" ' + rm -rf "$IPFS_PATH" +' + test_init_ipfs test_launch_ipfs_daemon