feat(routingd) add support for redis
Brian Tiger Chow committed
Feb 6, 2015 at 17:21 UTC
f3e141b3cf6547c1ec675cb33aa7a98c0caf1233
1 file changed
+40
-12
cmd/ipfs_routingd/main.go
+40
-12
@@ -1,35 +1,40 @@
1
package main
2
3
import (
4
+ "errors"
5
"flag"
6
"log"
7
"os"
8
"os/signal"
9
+ "time"
10
11
context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context"
12
aws "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/crowdmob/goamz/aws"
13
s3 "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/crowdmob/goamz/s3"
14
+ "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/fzzy/radix/redis"
15
"github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore"
16
syncds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync"
17
core "github.com/jbenet/go-ipfs/core"
18
corerouting "github.com/jbenet/go-ipfs/core/corerouting"
19
config "github.com/jbenet/go-ipfs/repo/config"
20
fsrepo "github.com/jbenet/go-ipfs/repo/fsrepo"
21
+ redisds "github.com/jbenet/go-ipfs/thirdparty/redis-datastore"
22
s3datastore "github.com/jbenet/go-ipfs/thirdparty/s3-datastore"
23
ds2 "github.com/jbenet/go-ipfs/util/datastore2"
24
)
25
26
var (
23
- s3bucket = flag.String("aws-bucket", "", "S3 bucket for routing datastore")
27
+ ttl = flag.Duration("ttl", 12*time.Hour, "routing datastore (also available: aws)")
28
+ redisHost = flag.String("redis-host", "localhost:6379", "redis tcp host address:port")
29
+ redisPassword = flag.String("redis-pass", "", "redis password if required")
30
+ datastoreOption = flag.String("datastore", "redis", "routing datastore (also available: aws)")
31
+ s3bucket = flag.String("aws-bucket", "", "S3 bucket for aws routing datastore")
32
s3region = flag.String("aws-region", aws.USWest2.Name, "S3 region")
33
nBitsForKeypair = flag.Int("b", 1024, "number of bits for keypair (if repo is uninitialized)")
34
)
35
36
func main() {
37
flag.Parse()
30
- if *s3bucket == "" {
31
- log.Fatal("bucket is required")
32
- }
38
if err := run(); err != nil {
39
log.Println(err)
40
}
@@ -56,18 +61,41 @@ func run() error {
61
if err := repo.Open(); err != nil { // owned by node
62
return err
63
}
59
- s3, err := makeS3Datastore()
60
- if err != nil {
61
- return err
62
- }
63
- enhanced, err := enhanceDatastore(s3)
64
- if err != nil {
65
- return err
64
+
65
+ var ds datastore.ThreadSafeDatastore
66
+ switch *datastoreOption {
67
+ case "redis":
68
+ redisClient, err := redis.Dial("tcp", *redisHost)
69
+ if err != nil {
70
+ return err
71
+ }
72
+ if *redisPassword != "" {
73
+ if err := redisClient.Cmd("AUTH", *redisPassword).Err; err != nil {
74
+ return err
75
+ }
76
+ }
77
+ redisds, err := redisds.NewExpiringDatastore(redisClient, *ttl)
78
+ if err != nil {
79
+ return err
80
+ }
81
+ ds = redisds
82
+ case "aws":
83
+ s3raw, err := makeS3Datastore()
84
+ if err != nil {
85
+ return err
86
+ }
87
+ s3, err := enhanceDatastore(s3raw)
88
+ if err != nil {
89
+ return err
90
+ }
91
+ ds = s3
92
+ default:
93
+ return errors.New("unsupported datastore type")
94
}
95
node, err := core.NewIPFSNode(ctx,
96
core.OnlineWithOptions(
97
repo,
70
- corerouting.SupernodeServer(enhanced),
98
+ corerouting.SupernodeServer(ds),
99
core.DefaultHostOption),
100
)
101
if err != nil {