allow promises to fail
License: MIT Signed-off-by: Jeromy <jeromyj@gmail.com>
Jeromy committed
Jan 27, 2016 at 18:55 UTC
d84dfafe695720bd08dcb6e7d6e42ebef27a46a3
1 file changed
+12
merkledag/merkledag.go
+12
@@ -192,6 +192,9 @@ func GetNodes(ctx context.Context, ds DAGService, keys []key.Key) []NodeGetter {
192
select {
193
case opt, ok := <-nodechan:
194
if !ok {
195
+ for _, p := range promises {
196
+ p.Fail(ErrNotFound)
197
+ }
198
return
199
}
200
@@ -239,6 +242,7 @@ func newNodePromise(ctx context.Context) (NodeGetter, chan<- *Node) {
242
return &nodePromise{
243
recv: ch,
244
ctx: ctx,
245
+ err: make(chan error, 1),
246
}, ch
247
}
248
@@ -246,6 +250,7 @@ type nodePromise struct {
250
cache *Node
251
recv <-chan *Node
252
ctx context.Context
253
+ err chan error
254
}
255
256
// NodeGetter provides a promise like interface for a dag Node
@@ -254,6 +259,11 @@ type nodePromise struct {
259
// cached node.
260
type NodeGetter interface {
261
Get(context.Context) (*Node, error)
262
+ Fail(err error)
263
+}
264
+
265
+func (np *nodePromise) Fail(err error) {
266
+ np.err <- err
267
}
268
269
func (np *nodePromise) Get(ctx context.Context) (*Node, error) {
@@ -268,6 +278,8 @@ func (np *nodePromise) Get(ctx context.Context) (*Node, error) {
278
return nil, np.ctx.Err()
279
case <-ctx.Done():
280
return nil, ctx.Err()
281
+ case err := <-np.err:
282
+ return nil, err
283
}
284
return np.cache, nil
285
}