@cryptotaxi247 / kubo / commits / d84dfafe6

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 }