Skip to content
This repository has been archived by the owner on Feb 1, 2023. It is now read-only.

delay finding providers #17

Merged
merged 1 commit into from
Oct 23, 2018
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 26 additions & 14 deletions bitswap.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ const (
// results.
// TODO: if a 'non-nice' strategy is implemented, consider increasing this value
maxProvidersPerRequest = 3
findProviderDelay = 1 * time.Second
providerRequestTimeout = time.Second * 10
provideTimeout = time.Second * 15
sizeBatchRequestChan = 32
Expand Down Expand Up @@ -230,14 +231,6 @@ func (bs *Bitswap) GetBlocks(ctx context.Context, keys []cid.Cid) (<-chan blocks

bs.wm.WantBlocks(ctx, keys, nil, mses)

// NB: Optimization. Assumes that providers of key[0] are likely to
// be able to provide for all keys. This currently holds true in most
// every situation. Later, this assumption may not hold as true.
req := &blockRequest{
Cid: keys[0],
Ctx: ctx,
}

remaining := cid.NewSet()
for _, k := range keys {
remaining.Add(k)
Expand All @@ -252,13 +245,37 @@ func (bs *Bitswap) GetBlocks(ctx context.Context, keys []cid.Cid) (<-chan blocks
// can't just defer this call on its own, arguments are resolved *when* the defer is created
bs.CancelWants(remaining.Keys(), mses)
}()
findProvsDelay := time.NewTimer(findProviderDelay)
defer findProvsDelay.Stop()

findProvsDelayCh := findProvsDelay.C
req := &blockRequest{
Cid: keys[0],
Ctx: ctx,
}

var findProvsReqCh chan<- *blockRequest

for {
select {
case <-findProvsDelayCh:
// NB: Optimization. Assumes that providers of key[0] are likely to
// be able to provide for all keys. This currently holds true in most
// every situation. Later, this assumption may not hold as true.
findProvsReqCh = bs.findKeys
findProvsDelayCh = nil
case findProvsReqCh <- req:
findProvsReqCh = nil
case blk, ok := <-promise:
if !ok {
return
}

// No need to find providers now.
findProvsDelay.Stop()
findProvsDelayCh = nil
findProvsReqCh = nil

bs.CancelWants([]cid.Cid{blk.Cid()}, mses)
remaining.Remove(blk.Cid())
select {
Expand All @@ -272,12 +289,7 @@ func (bs *Bitswap) GetBlocks(ctx context.Context, keys []cid.Cid) (<-chan blocks
}
}()

select {
case bs.findKeys <- req:
return out, nil
case <-ctx.Done():
return nil, ctx.Err()
}
return out, nil
}

func (bs *Bitswap) getNextSessionID() uint64 {
Expand Down