Commit 1535a6a9 authored by Jeromy's avatar Jeromy

allow promises to fail

License: MIT
Signed-off-by: default avatarJeromy <jeromyj@gmail.com>
parent 7df6213e
...@@ -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 is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment