提交 d84dfafe 作者: Jeromy

allow promises to fail

License: MIT
Signed-off-by: 's avatarJeromy <jeromyj@gmail.com>
上级 600c95eb
...@@ -192,6 +192,9 @@ func GetNodes(ctx context.Context, ds DAGService, keys []key.Key) []NodeGetter { ...@@ -192,6 +192,9 @@ func GetNodes(ctx context.Context, ds DAGService, keys []key.Key) []NodeGetter {
select { select {
case opt, ok := <-nodechan: case opt, ok := <-nodechan:
if !ok { if !ok {
for _, p := range promises {
p.Fail(ErrNotFound)
}
return return
} }
...@@ -239,6 +242,7 @@ func newNodePromise(ctx context.Context) (NodeGetter, chan<- *Node) { ...@@ -239,6 +242,7 @@ func newNodePromise(ctx context.Context) (NodeGetter, chan<- *Node) {
return &nodePromise{ return &nodePromise{
recv: ch, recv: ch,
ctx: ctx, ctx: ctx,
err: make(chan error, 1),
}, ch }, ch
} }
...@@ -246,6 +250,7 @@ type nodePromise struct { ...@@ -246,6 +250,7 @@ type nodePromise struct {
cache *Node cache *Node
recv <-chan *Node recv <-chan *Node
ctx context.Context ctx context.Context
err chan error
} }
// NodeGetter provides a promise like interface for a dag Node // NodeGetter provides a promise like interface for a dag Node
...@@ -254,6 +259,11 @@ type nodePromise struct { ...@@ -254,6 +259,11 @@ type nodePromise struct {
// cached node. // cached node.
type NodeGetter interface { type NodeGetter interface {
Get(context.Context) (*Node, error) Get(context.Context) (*Node, error)
Fail(err error)
}
func (np *nodePromise) Fail(err error) {
np.err <- err
} }
func (np *nodePromise) Get(ctx context.Context) (*Node, error) { func (np *nodePromise) Get(ctx context.Context) (*Node, error) {
...@@ -268,6 +278,8 @@ func (np *nodePromise) Get(ctx context.Context) (*Node, error) { ...@@ -268,6 +278,8 @@ func (np *nodePromise) Get(ctx context.Context) (*Node, error) {
return nil, np.ctx.Err() return nil, np.ctx.Err()
case <-ctx.Done(): case <-ctx.Done():
return nil, ctx.Err() return nil, ctx.Err()
case err := <-np.err:
return nil, err
} }
return np.cache, nil return np.cache, nil
} }
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论