diff --git a/merkledag/merkledag.go b/merkledag/merkledag.go
index df6fa4187fe7a63e9a1632d0bd3f54039b2deb14..3761096ccdc98d6a738323f45497fd299278726b 100644
--- a/merkledag/merkledag.go
+++ b/merkledag/merkledag.go
@@ -192,6 +192,9 @@ func GetNodes(ctx context.Context, ds DAGService, keys []key.Key) []NodeGetter {
 			select {
 			case opt, ok := <-nodechan:
 				if !ok {
+					for _, p := range promises {
+						p.Fail(ErrNotFound)
+					}
 					return
 				}
 
@@ -239,6 +242,7 @@ func newNodePromise(ctx context.Context) (NodeGetter, chan<- *Node) {
 	return &nodePromise{
 		recv: ch,
 		ctx:  ctx,
+		err:  make(chan error, 1),
 	}, ch
 }
 
@@ -246,6 +250,7 @@ type nodePromise struct {
 	cache *Node
 	recv  <-chan *Node
 	ctx   context.Context
+	err   chan error
 }
 
 // NodeGetter provides a promise like interface for a dag Node
@@ -254,6 +259,11 @@ type nodePromise struct {
 // cached node.
 type NodeGetter interface {
 	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) {
@@ -268,6 +278,8 @@ func (np *nodePromise) Get(ctx context.Context) (*Node, error) {
 		return nil, np.ctx.Err()
 	case <-ctx.Done():
 		return nil, ctx.Err()
+	case err := <-np.err:
+		return nil, err
 	}
 	return np.cache, nil
 }