fix(blockservice) respect context in GetBlocks
License: MIT Signed-off-by: Brian Tiger Chow <brian@perfmode.com>
Brian Tiger Chow committed
Nov 23, 2014 at 22:47 UTC
e27de2bfa2369b4629749d718182fdfdff0bb61e
1 file changed
+17
-9
blockservice/blockservice.go
+17
-9
@@ -99,29 +99,37 @@ func (s *BlockService) GetBlock(ctx context.Context, k u.Key) (*blocks.Block, er
99
// the returned channel.
100
// NB: No guarantees are made about order.
101
func (s *BlockService) GetBlocks(ctx context.Context, ks []u.Key) <-chan *blocks.Block {
102
- out := make(chan *blocks.Block, 32)
102
+ out := make(chan *blocks.Block, 0)
103
go func() {
104
- var toFetch []u.Key
104
+ defer close(out)
105
+ var misses []u.Key
106
for _, k := range ks {
106
- block, err := s.Blockstore.Get(k)
107
+ hit, err := s.Blockstore.Get(k)
108
if err != nil {
108
- toFetch = append(toFetch, k)
109
+ misses = append(misses, k)
110
continue
111
}
112
log.Debug("Blockservice: Got data in datastore.")
112
- out <- block
113
+ select {
114
+ case out <- hit:
115
+ case <-ctx.Done():
116
+ return
117
+ }
118
}
119
115
- nblocks, err := s.Remote.GetBlocks(ctx, toFetch)
120
+ rblocks, err := s.Remote.GetBlocks(ctx, misses)
121
if err != nil {
122
log.Errorf("Error with GetBlocks: %s", err)
123
return
124
}
125
121
- for blk := range nblocks {
122
- out <- blk
126
+ for b := range rblocks {
127
+ select {
128
+ case out <- b:
129
+ case <-ctx.Done():
130
+ return
131
+ }
132
}
124
- close(out)
133
}()
134
return out
135
}