@cryptotaxi247 / kubo / commits / e27de2bfa

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 }