提交 b8125ad0 作者: vyzo 提交者: Łukasz Magiera

namecache: return errors in the Follow/Unfollow interface

License: MIT
Signed-off-by: 's avatarvyzo <vyzo@hackzen.org>
上级 ceaa7528
...@@ -52,7 +52,11 @@ Follows an IPNS name by periodically resolving in the backround. ...@@ -52,7 +52,11 @@ Follows an IPNS name by periodically resolving in the backround.
return return
} }
n.Namecache.Follow(req.Arguments()[0], false) err = n.Namecache.Follow(req.Arguments()[0], false)
if err != nil {
res.SetError(err, cmdkit.ErrNormal)
return
}
res.SetOutput(&ipnsFollowResult{true}) res.SetOutput(&ipnsFollowResult{true})
}, },
...@@ -85,7 +89,11 @@ pinning in the backround. ...@@ -85,7 +89,11 @@ pinning in the backround.
return return
} }
n.Namecache.Follow(req.Arguments()[0], true) err = n.Namecache.Follow(req.Arguments()[0], true)
if err != nil {
res.SetError(err, cmdkit.ErrNormal)
return
}
res.SetOutput(&ipnsFollowResult{true}) res.SetOutput(&ipnsFollowResult{true})
}, },
...@@ -138,7 +146,11 @@ var ipnsFollowCancelCmd = &cmds.Command{ ...@@ -138,7 +146,11 @@ var ipnsFollowCancelCmd = &cmds.Command{
return return
} }
n.Namecache.Unfollow(req.Arguments()[0]) err = n.Namecache.Unfollow(req.Arguments()[0])
if err != nil {
res.SetError(err, cmdkit.ErrNormal)
return
}
res.SetOutput(&ipnsFollowResult{true}) res.SetOutput(&ipnsFollowResult{true})
}, },
......
...@@ -3,6 +3,7 @@ package namecache ...@@ -3,6 +3,7 @@ package namecache
import ( import (
"context" "context"
"fmt"
"strings" "strings"
"sync" "sync"
"time" "time"
...@@ -24,8 +25,11 @@ var log = logging.Logger("namecache") ...@@ -24,8 +25,11 @@ var log = logging.Logger("namecache")
// NameCache represents a following cache of names // NameCache represents a following cache of names
type NameCache interface { type NameCache interface {
Follow(name string, pinit bool) // Follow starts following name, pinning it if pinit is true
Unfollow(name string) Follow(name string, pinit bool) error
// Unofollow cancels a follow
Unfollow(name string) error
// ListFollows returns a list of followed names
ListFollows() []string ListFollows() []string
} }
...@@ -51,21 +55,23 @@ func NewNameCache(ctx context.Context, nsys namesys.NameSystem, pinning pin.Pinn ...@@ -51,21 +55,23 @@ func NewNameCache(ctx context.Context, nsys namesys.NameSystem, pinning pin.Pinn
// Follow spawns a goroutine that periodically resolves a name // Follow spawns a goroutine that periodically resolves a name
// and (when pinit is true) pins it in the background // and (when pinit is true) pins it in the background
func (nc *nameCache) Follow(name string, pinit bool) { func (nc *nameCache) Follow(name string, pinit bool) error {
nc.mx.Lock() nc.mx.Lock()
defer nc.mx.Unlock() defer nc.mx.Unlock()
if _, ok := nc.follows[name]; ok { if _, ok := nc.follows[name]; ok {
return return fmt.Errorf("Already following %s", name)
} }
ctx, cancel := context.WithCancel(nc.ctx) ctx, cancel := context.WithCancel(nc.ctx)
go nc.followName(ctx, name, pinit) go nc.followName(ctx, name, pinit)
nc.follows[name] = cancel nc.follows[name] = cancel
return nil
} }
// Unfollow cancels a follow // Unfollow cancels a follow
func (nc *nameCache) Unfollow(name string) { func (nc *nameCache) Unfollow(name string) error {
nc.mx.Lock() nc.mx.Lock()
defer nc.mx.Unlock() defer nc.mx.Unlock()
...@@ -73,7 +79,10 @@ func (nc *nameCache) Unfollow(name string) { ...@@ -73,7 +79,10 @@ func (nc *nameCache) Unfollow(name string) {
if ok { if ok {
cancel() cancel()
delete(nc.follows, name) delete(nc.follows, name)
return nil
} }
return fmt.Errorf("Unknown name %s", name)
} }
// ListFollows returns a list of names currently being followed // ListFollows returns a list of names currently being followed
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论