Commit 42770cc3 authored by Brian Tiger Chow's avatar Brian Tiger Chow

refac(exchange) replace timeout -> context in API

parent 252be07e
...@@ -4,12 +4,13 @@ import ( ...@@ -4,12 +4,13 @@ import (
"fmt" "fmt"
"time" "time"
context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context"
ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/datastore.go" ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/datastore.go"
mh "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash"
blocks "github.com/jbenet/go-ipfs/blocks" blocks "github.com/jbenet/go-ipfs/blocks"
exchange "github.com/jbenet/go-ipfs/exchange" exchange "github.com/jbenet/go-ipfs/exchange"
u "github.com/jbenet/go-ipfs/util" u "github.com/jbenet/go-ipfs/util"
mh "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash"
) )
// BlockService is a block datastore. // BlockService is a block datastore.
...@@ -65,7 +66,8 @@ func (s *BlockService) GetBlock(k u.Key) (*blocks.Block, error) { ...@@ -65,7 +66,8 @@ func (s *BlockService) GetBlock(k u.Key) (*blocks.Block, error) {
}, nil }, nil
} else if err == ds.ErrNotFound && s.Remote != nil { } else if err == ds.ErrNotFound && s.Remote != nil {
u.DOut("Blockservice: Searching bitswap.\n") u.DOut("Blockservice: Searching bitswap.\n")
blk, err := s.Remote.Block(k, time.Second*5) ctx, _ := context.WithTimeout(context.TODO(), 5*time.Second)
blk, err := s.Remote.Block(ctx, k)
if err != nil { if err != nil {
return nil, err return nil, err
} }
......
...@@ -2,7 +2,6 @@ package bitswap ...@@ -2,7 +2,6 @@ package bitswap
import ( import (
"errors" "errors"
"time"
context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context"
ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/datastore.go" ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/datastore.go"
...@@ -65,18 +64,14 @@ type bitswap struct { ...@@ -65,18 +64,14 @@ type bitswap struct {
strategy strategy.Strategy strategy strategy.Strategy
} }
// GetBlock attempts to retrieve a particular block from peers, within timeout. // GetBlock attempts to retrieve a particular block from peers within the
func (bs *bitswap) Block(k u.Key, timeout time.Duration) ( // deadline enforced by the context
func (bs *bitswap) Block(ctx context.Context, k u.Key) (
*blocks.Block, error) { *blocks.Block, error) {
ctx, _ := context.WithTimeout(context.Background(), timeout)
// TODO replace timeout with ctx in routing interface
begin := time.Now()
tleft := timeout - time.Now().Sub(begin)
provs_ch := bs.routing.FindProvidersAsync(ctx, k, 20) provs_ch := bs.routing.FindProvidersAsync(ctx, k, 20)
blockChannel := make(chan blocks.Block) blockChannel := make(chan blocks.Block)
after := time.After(tleft)
// TODO: when the data is received, shut down this for loop ASAP // TODO: when the data is received, shut down this for loop ASAP
go func() { go func() {
...@@ -98,8 +93,8 @@ func (bs *bitswap) Block(k u.Key, timeout time.Duration) ( ...@@ -98,8 +93,8 @@ func (bs *bitswap) Block(k u.Key, timeout time.Duration) (
case block := <-blockChannel: case block := <-blockChannel:
close(blockChannel) close(blockChannel)
return &block, nil return &block, nil
case <-after: case <-ctx.Done():
return nil, u.ErrTimeout return nil, ctx.Err()
} }
} }
......
...@@ -2,7 +2,8 @@ package bitswap ...@@ -2,7 +2,8 @@ package bitswap
import ( import (
"errors" "errors"
"time"
context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context"
blocks "github.com/jbenet/go-ipfs/blocks" blocks "github.com/jbenet/go-ipfs/blocks"
exchange "github.com/jbenet/go-ipfs/exchange" exchange "github.com/jbenet/go-ipfs/exchange"
...@@ -21,7 +22,7 @@ type offlineExchange struct { ...@@ -21,7 +22,7 @@ type offlineExchange struct {
// Block returns nil to signal that a block could not be retrieved for the // Block returns nil to signal that a block could not be retrieved for the
// given key. // given key.
// NB: This function may return before the timeout expires. // NB: This function may return before the timeout expires.
func (_ *offlineExchange) Block(k u.Key, timeout time.Duration) (*blocks.Block, error) { func (_ *offlineExchange) Block(context.Context, u.Key) (*blocks.Block, error) {
return nil, errors.New("Block unavailable. Operating in offline mode") return nil, errors.New("Block unavailable. Operating in offline mode")
} }
......
...@@ -2,7 +2,8 @@ package bitswap ...@@ -2,7 +2,8 @@ package bitswap
import ( import (
"testing" "testing"
"time"
context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context"
u "github.com/jbenet/go-ipfs/util" u "github.com/jbenet/go-ipfs/util"
testutil "github.com/jbenet/go-ipfs/util/testutil" testutil "github.com/jbenet/go-ipfs/util/testutil"
...@@ -10,7 +11,7 @@ import ( ...@@ -10,7 +11,7 @@ import (
func TestBlockReturnsErr(t *testing.T) { func TestBlockReturnsErr(t *testing.T) {
off := NewOfflineExchange() off := NewOfflineExchange()
_, err := off.Block(u.Key("foo"), time.Second) _, err := off.Block(context.TODO(), u.Key("foo"))
if err != nil { if err != nil {
return // as desired return // as desired
} }
......
package bitswap package bitswap
import ( import (
"time" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context"
blocks "github.com/jbenet/go-ipfs/blocks" blocks "github.com/jbenet/go-ipfs/blocks"
u "github.com/jbenet/go-ipfs/util" u "github.com/jbenet/go-ipfs/util"
...@@ -13,7 +13,7 @@ type Interface interface { ...@@ -13,7 +13,7 @@ type Interface interface {
// Block returns the block associated with a given key. // Block returns the block associated with a given key.
// TODO(brian): pass a context instead of a timeout // TODO(brian): pass a context instead of a timeout
Block(k u.Key, timeout time.Duration) (*blocks.Block, error) Block(context.Context, u.Key) (*blocks.Block, error)
// HasBlock asserts the existence of this block // HasBlock asserts the existence of this block
// TODO(brian): rename -> HasBlock // TODO(brian): rename -> HasBlock
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment