Skip to content

Commit 9d2b6d9

Browse files
committed
feat: move namesys into go-ipfs
1 parent 52a7477 commit 9d2b6d9

30 files changed

+2578
-363
lines changed

core/commands/dht_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ package commands
33
import (
44
"testing"
55

6-
"github.com/ipfs/go-namesys"
6+
"github.com/ipfs/go-ipfs/lib/namesys"
77

88
ipns "github.com/ipfs/go-ipns"
99
"github.com/libp2p/go-libp2p-core/test"

core/commands/dns.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import (
66

77
cmdenv "github.com/ipfs/go-ipfs/core/commands/cmdenv"
88
ncmd "github.com/ipfs/go-ipfs/core/commands/name"
9-
namesys "github.com/ipfs/go-namesys"
9+
namesys "github.com/ipfs/go-ipfs/lib/namesys"
1010
nsopts "github.com/ipfs/interface-go-ipfs-core/options/namesys"
1111

1212
cmds "github.com/ipfs/go-ipfs-cmds"

core/commands/name/ipns.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import (
88
"time"
99

1010
cmdenv "github.com/ipfs/go-ipfs/core/commands/cmdenv"
11-
namesys "github.com/ipfs/go-namesys"
11+
namesys "github.com/ipfs/go-ipfs/lib/namesys"
1212

1313
cmds "github.com/ipfs/go-ipfs-cmds"
1414
logging "github.com/ipfs/go-log"

core/commands/resolve.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import (
99

1010
cmdenv "github.com/ipfs/go-ipfs/core/commands/cmdenv"
1111
ncmd "github.com/ipfs/go-ipfs/core/commands/name"
12-
ns "github.com/ipfs/go-namesys"
12+
ns "github.com/ipfs/go-ipfs/lib/namesys"
1313

1414
cidenc "github.com/ipfs/go-cidutil/cidenc"
1515
cmds "github.com/ipfs/go-ipfs-cmds"

core/core.go

+4-4
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,14 @@ import (
1414
"io"
1515

1616
"github.com/ipfs/go-filestore"
17-
"github.com/ipfs/go-ipfs-pinner"
17+
pin "github.com/ipfs/go-ipfs-pinner"
1818

1919
bserv "github.com/ipfs/go-blockservice"
2020
"github.com/ipfs/go-fetcher"
2121
"github.com/ipfs/go-graphsync"
2222
bstore "github.com/ipfs/go-ipfs-blockstore"
2323
exchange "github.com/ipfs/go-ipfs-exchange-interface"
24-
"github.com/ipfs/go-ipfs-provider"
24+
provider "github.com/ipfs/go-ipfs-provider"
2525
ipld "github.com/ipfs/go-ipld-format"
2626
logging "github.com/ipfs/go-log"
2727
mfs "github.com/ipfs/go-mfs"
@@ -46,11 +46,11 @@ import (
4646
"github.com/ipfs/go-ipfs/core/node"
4747
"github.com/ipfs/go-ipfs/core/node/libp2p"
4848
"github.com/ipfs/go-ipfs/fuse/mount"
49+
"github.com/ipfs/go-ipfs/lib/namesys"
50+
ipnsrp "github.com/ipfs/go-ipfs/lib/namesys/republisher"
4951
"github.com/ipfs/go-ipfs/p2p"
5052
"github.com/ipfs/go-ipfs/peering"
5153
"github.com/ipfs/go-ipfs/repo"
52-
"github.com/ipfs/go-namesys"
53-
ipnsrp "github.com/ipfs/go-namesys/republisher"
5454
)
5555

5656
var log = logging.Logger("core")

core/coreapi/coreapi.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ import (
4242
"github.com/ipfs/go-ipfs/core"
4343
"github.com/ipfs/go-ipfs/core/node"
4444
"github.com/ipfs/go-ipfs/repo"
45-
"github.com/ipfs/go-namesys"
45+
"github.com/ipfs/go-ipfs/lib/namesys"
4646
)
4747

4848
type CoreAPI struct {

core/coreapi/name.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import (
77
"time"
88

99
"github.com/ipfs/go-ipfs-keystore"
10-
"github.com/ipfs/go-namesys"
10+
"github.com/ipfs/go-ipfs/lib/namesys"
1111

1212
ipath "github.com/ipfs/go-path"
1313
coreiface "github.com/ipfs/interface-go-ipfs-core"

core/coreapi/path.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import (
55
"fmt"
66
gopath "path"
77

8-
"github.com/ipfs/go-namesys/resolve"
8+
"github.com/ipfs/go-ipfs/lib/namesys/resolve"
99

1010
"github.com/ipfs/go-cid"
1111
"github.com/ipfs/go-fetcher"

core/corehttp/gateway_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import (
1515
core "github.com/ipfs/go-ipfs/core"
1616
"github.com/ipfs/go-ipfs/core/coreapi"
1717
repo "github.com/ipfs/go-ipfs/repo"
18-
namesys "github.com/ipfs/go-namesys"
18+
namesys "github.com/ipfs/go-ipfs/lib/namesys"
1919

2020
datastore "github.com/ipfs/go-datastore"
2121
syncds "github.com/ipfs/go-datastore/sync"

core/corehttp/hostname.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import (
1212
cid "github.com/ipfs/go-cid"
1313
core "github.com/ipfs/go-ipfs/core"
1414
coreapi "github.com/ipfs/go-ipfs/core/coreapi"
15-
namesys "github.com/ipfs/go-namesys"
15+
namesys "github.com/ipfs/go-ipfs/lib/namesys"
1616
"github.com/libp2p/go-libp2p-core/peer"
1717
dns "github.com/miekg/dns"
1818

core/node/ipns.go

+4-4
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,17 @@ import (
44
"fmt"
55
"time"
66

7-
"github.com/ipfs/go-ipfs-util"
7+
util "github.com/ipfs/go-ipfs-util"
88
"github.com/ipfs/go-ipns"
99
"github.com/libp2p/go-libp2p-core/crypto"
1010
"github.com/libp2p/go-libp2p-core/peerstore"
1111
"github.com/libp2p/go-libp2p-core/routing"
12-
"github.com/libp2p/go-libp2p-record"
12+
record "github.com/libp2p/go-libp2p-record"
1313
madns "github.com/multiformats/go-multiaddr-dns"
1414

15+
"github.com/ipfs/go-ipfs/lib/namesys"
16+
"github.com/ipfs/go-ipfs/lib/namesys/republisher"
1517
"github.com/ipfs/go-ipfs/repo"
16-
"github.com/ipfs/go-namesys"
17-
"github.com/ipfs/go-namesys/republisher"
1818
)
1919

2020
const DefaultIpnsCacheSize = 128

fuse/ipns/common.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import (
44
"context"
55

66
"github.com/ipfs/go-ipfs/core"
7-
nsys "github.com/ipfs/go-namesys"
7+
nsys "github.com/ipfs/go-ipfs/lib/namesys"
88
path "github.com/ipfs/go-path"
99
ft "github.com/ipfs/go-unixfs"
1010
ci "github.com/libp2p/go-libp2p-core/crypto"

go.mod

+4-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@ require (
1111
github.com/fsnotify/fsnotify v1.4.9
1212
github.com/gabriel-vasile/mimetype v1.1.2
1313
github.com/go-bindata/go-bindata/v3 v3.1.3
14+
github.com/gogo/protobuf v1.3.2
1415
github.com/hashicorp/go-multierror v1.1.1
16+
github.com/hashicorp/golang-lru v0.5.4
1517
github.com/ipfs/go-bitswap v0.4.0
1618
github.com/ipfs/go-block-format v0.0.3
1719
github.com/ipfs/go-blockservice v0.1.7
@@ -31,6 +33,7 @@ require (
3133
github.com/ipfs/go-ipfs-chunker v0.0.5
3234
github.com/ipfs/go-ipfs-cmds v0.6.0
3335
github.com/ipfs/go-ipfs-config v0.16.0
36+
github.com/ipfs/go-ipfs-ds-help v0.1.1
3437
github.com/ipfs/go-ipfs-exchange-interface v0.0.1
3538
github.com/ipfs/go-ipfs-exchange-offline v0.0.1
3639
github.com/ipfs/go-ipfs-files v0.0.9
@@ -50,7 +53,6 @@ require (
5053
github.com/ipfs/go-metrics-interface v0.0.1
5154
github.com/ipfs/go-metrics-prometheus v0.0.2
5255
github.com/ipfs/go-mfs v0.1.2
53-
github.com/ipfs/go-namesys v0.3.1
5456
github.com/ipfs/go-path v0.1.2
5557
github.com/ipfs/go-pinning-service-http-client v0.1.0
5658
github.com/ipfs/go-unixfs v0.2.5
@@ -102,6 +104,7 @@ require (
102104
github.com/prometheus/statsd_exporter v0.21.0 // indirect
103105
github.com/stretchr/testify v1.7.0
104106
github.com/syndtr/goleveldb v1.0.0
107+
github.com/whyrusleeping/base32 v0.0.0-20170828182744-c30ac30633cc
105108
github.com/whyrusleeping/go-sysinfo v0.0.0-20190219211824-4a357d4b90b1
106109
github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7
107110
go.opencensus.io v0.23.0

go.sum

-7
Original file line numberDiff line numberDiff line change
@@ -300,7 +300,6 @@ github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+u
300300
github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck=
301301
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
302302
github.com/google/gopacket v1.1.17/go.mod h1:UdDNZ1OO62aGYVnPhxT1U6aI7ukYtA/kB8vaU0diBUM=
303-
github.com/google/gopacket v1.1.18/go.mod h1:UdDNZ1OO62aGYVnPhxT1U6aI7ukYtA/kB8vaU0diBUM=
304303
github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8=
305304
github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo=
306305
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
@@ -511,8 +510,6 @@ github.com/ipfs/go-ipld-git v0.1.1 h1:TWGnZjS0htmEmlMFEkA3ogrNCqWjIxwr16x1OsdhG+
511510
github.com/ipfs/go-ipld-git v0.1.1/go.mod h1:+VyMqF5lMcJh4rwEppV0e6g4nCCHXThLYYDpKUkJubI=
512511
github.com/ipfs/go-ipld-legacy v0.1.0 h1:wxkkc4k8cnvIGIjPO0waJCe7SHEyFgl+yQdafdjGrpA=
513512
github.com/ipfs/go-ipld-legacy v0.1.0/go.mod h1:86f5P/srAmh9GcIcWQR9lfFLZPrIyyXQeVlOWeeWEuI=
514-
github.com/ipfs/go-ipns v0.0.2/go.mod h1:WChil4e0/m9cIINWLxZe1Jtf77oz5L05rO2ei/uKJ5U=
515-
github.com/ipfs/go-ipns v0.1.0/go.mod h1:3IbsuPkR6eAGcnx+E7j6HpOSbSQJPZ6zlRj+NK3jPxQ=
516513
github.com/ipfs/go-ipns v0.1.2 h1:O/s/0ht+4Jl9+VoxoUo0zaHjnZUS+aBQIKTuzdZ/ucI=
517514
github.com/ipfs/go-ipns v0.1.2/go.mod h1:ioQ0j02o6jdIVW+bmi18f4k2gRf0AV3kZ9KeHYHICnQ=
518515
github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM=
@@ -542,10 +539,7 @@ github.com/ipfs/go-metrics-prometheus v0.0.2 h1:9i2iljLg12S78OhC6UAiXi176xvQGiZa
542539
github.com/ipfs/go-metrics-prometheus v0.0.2/go.mod h1:ELLU99AQQNi+zX6GCGm2lAgnzdSH3u5UVlCdqSXnEks=
543540
github.com/ipfs/go-mfs v0.1.2 h1:DlelNSmH+yz/Riy0RjPKlooPg0KML4lXGdLw7uZkfAg=
544541
github.com/ipfs/go-mfs v0.1.2/go.mod h1:T1QBiZPEpkPLzDqEJLNnbK55BVKVlNi2a+gVm4diFo0=
545-
github.com/ipfs/go-namesys v0.3.1 h1:DqmeXlVODejOyECAqoqhSB5JGRv8aRFhtG0oPDmxsMc=
546-
github.com/ipfs/go-namesys v0.3.1/go.mod h1:/BL4xk8LP5Lq82AmaRKyxZv/eYRlumNiU9SZUe1Hlps=
547542
github.com/ipfs/go-path v0.0.7/go.mod h1:6KTKmeRnBXgqrTvzFrPV3CamxcgvXX/4z79tfAd2Sno=
548-
github.com/ipfs/go-path v0.0.9/go.mod h1:VpDkSBKQ9EFQOUgi54Tq/O/tGi8n1RfYNks13M3DEs8=
549543
github.com/ipfs/go-path v0.1.1/go.mod h1:vC8q4AKOtrjJz2NnllIrmr2ZbGlF5fW2OKKyhV9ggb0=
550544
github.com/ipfs/go-path v0.1.2 h1:yQxN9JNhO4KbaaYtVgVpIH0BQDzn5Zpl5A6to93O7Ck=
551545
github.com/ipfs/go-path v0.1.2/go.mod h1:3DdbxZb0PtT0g3UlMqyzms1UBKPc0pQ2NHx5/XScYdY=
@@ -755,7 +749,6 @@ github.com/libp2p/go-libp2p-interface-connmgr v0.0.1/go.mod h1:GarlRLH0LdeWcLnYM
755749
github.com/libp2p/go-libp2p-interface-connmgr v0.0.4/go.mod h1:GarlRLH0LdeWcLnYM/SaBykKFl9U5JFnbBGruAk/D5k=
756750
github.com/libp2p/go-libp2p-interface-connmgr v0.0.5/go.mod h1:GarlRLH0LdeWcLnYM/SaBykKFl9U5JFnbBGruAk/D5k=
757751
github.com/libp2p/go-libp2p-interface-pnet v0.0.1/go.mod h1:el9jHpQAXK5dnTpKA4yfCNBZXvrzdOU75zz+C6ryp3k=
758-
github.com/libp2p/go-libp2p-kad-dht v0.11.1/go.mod h1:5ojtR2acDPqh/jXf5orWy8YGb8bHQDS+qeDcoscL/PI=
759752
github.com/libp2p/go-libp2p-kad-dht v0.13.1 h1:wQgzOpoc+dcPVDb3h0HNWUjon5JiYEqsA4iNBUtIA7A=
760753
github.com/libp2p/go-libp2p-kad-dht v0.13.1/go.mod h1:iVdxmsKHVPQSCGPP4V/A+tDFCLsxrREZUBX8ohOcKDw=
761754
github.com/libp2p/go-libp2p-kbucket v0.3.1/go.mod h1:oyjT5O7tS9CQurok++ERgc46YLwEpuGoFq9ubvoUOio=

lib/namesys/base.go

+120
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
package namesys
2+
3+
import (
4+
"context"
5+
"strings"
6+
"time"
7+
8+
path "github.com/ipfs/go-path"
9+
opts "github.com/ipfs/interface-go-ipfs-core/options/namesys"
10+
)
11+
12+
type onceResult struct {
13+
value path.Path
14+
ttl time.Duration
15+
err error
16+
}
17+
18+
type resolver interface {
19+
resolveOnceAsync(ctx context.Context, name string, options opts.ResolveOpts) <-chan onceResult
20+
}
21+
22+
// resolve is a helper for implementing Resolver.ResolveN using resolveOnce.
23+
func resolve(ctx context.Context, r resolver, name string, options opts.ResolveOpts) (path.Path, error) {
24+
ctx, cancel := context.WithCancel(ctx)
25+
defer cancel()
26+
27+
err := ErrResolveFailed
28+
var p path.Path
29+
30+
resCh := resolveAsync(ctx, r, name, options)
31+
32+
for res := range resCh {
33+
p, err = res.Path, res.Err
34+
if err != nil {
35+
break
36+
}
37+
}
38+
39+
return p, err
40+
}
41+
42+
func resolveAsync(ctx context.Context, r resolver, name string, options opts.ResolveOpts) <-chan Result {
43+
resCh := r.resolveOnceAsync(ctx, name, options)
44+
depth := options.Depth
45+
outCh := make(chan Result, 1)
46+
47+
go func() {
48+
defer close(outCh)
49+
var subCh <-chan Result
50+
var cancelSub context.CancelFunc
51+
defer func() {
52+
if cancelSub != nil {
53+
cancelSub()
54+
}
55+
}()
56+
57+
for {
58+
select {
59+
case res, ok := <-resCh:
60+
if !ok {
61+
resCh = nil
62+
break
63+
}
64+
65+
if res.err != nil {
66+
emitResult(ctx, outCh, Result{Err: res.err})
67+
return
68+
}
69+
log.Debugf("resolved %s to %s", name, res.value.String())
70+
if !strings.HasPrefix(res.value.String(), ipnsPrefix) {
71+
emitResult(ctx, outCh, Result{Path: res.value})
72+
break
73+
}
74+
75+
if depth == 1 {
76+
emitResult(ctx, outCh, Result{Path: res.value, Err: ErrResolveRecursion})
77+
break
78+
}
79+
80+
subopts := options
81+
if subopts.Depth > 1 {
82+
subopts.Depth--
83+
}
84+
85+
var subCtx context.Context
86+
if cancelSub != nil {
87+
// Cancel previous recursive resolve since it won't be used anyways
88+
cancelSub()
89+
}
90+
subCtx, cancelSub = context.WithCancel(ctx)
91+
_ = cancelSub
92+
93+
p := strings.TrimPrefix(res.value.String(), ipnsPrefix)
94+
subCh = resolveAsync(subCtx, r, p, subopts)
95+
case res, ok := <-subCh:
96+
if !ok {
97+
subCh = nil
98+
break
99+
}
100+
101+
// We don't bother returning here in case of context timeout as there is
102+
// no good reason to do that, and we may still be able to emit a result
103+
emitResult(ctx, outCh, res)
104+
case <-ctx.Done():
105+
return
106+
}
107+
if resCh == nil && subCh == nil {
108+
return
109+
}
110+
}
111+
}()
112+
return outCh
113+
}
114+
115+
func emitResult(ctx context.Context, outCh chan<- Result, r Result) {
116+
select {
117+
case outCh <- r:
118+
case <-ctx.Done():
119+
}
120+
}

lib/namesys/cache.go

+62
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package namesys
2+
3+
import (
4+
"time"
5+
6+
path "github.com/ipfs/go-path"
7+
)
8+
9+
func (ns *mpns) cacheGet(name string) (path.Path, bool) {
10+
// existence of optional mapping defined via IPFS_NS_MAP is checked first
11+
if ns.staticMap != nil {
12+
val, ok := ns.staticMap[name]
13+
if ok {
14+
return val, true
15+
}
16+
}
17+
18+
if ns.cache == nil {
19+
return "", false
20+
}
21+
22+
ientry, ok := ns.cache.Get(name)
23+
if !ok {
24+
return "", false
25+
}
26+
27+
entry, ok := ientry.(cacheEntry)
28+
if !ok {
29+
// should never happen, purely for sanity
30+
log.Panicf("unexpected type %T in cache for %q.", ientry, name)
31+
}
32+
33+
if time.Now().Before(entry.eol) {
34+
return entry.val, true
35+
}
36+
37+
ns.cache.Remove(name)
38+
39+
return "", false
40+
}
41+
42+
func (ns *mpns) cacheSet(name string, val path.Path, ttl time.Duration) {
43+
if ns.cache == nil || ttl <= 0 {
44+
return
45+
}
46+
ns.cache.Add(name, cacheEntry{
47+
val: val,
48+
eol: time.Now().Add(ttl),
49+
})
50+
}
51+
52+
func (ns *mpns) cacheInvalidate(name string) {
53+
if ns.cache == nil {
54+
return
55+
}
56+
ns.cache.Remove(name)
57+
}
58+
59+
type cacheEntry struct {
60+
val path.Path
61+
eol time.Time
62+
}

0 commit comments

Comments
 (0)