Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
G
go-ipfs
概览
概览
详情
活动
周期分析
版本库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程表
图表
维基
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
jihao
go-ipfs
Commits
5639042d
提交
5639042d
authored
1月 03, 2015
作者:
Juan Batiz-Benet
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
bitswap: send wantlist code reuse + debug logs
上级
7629ad7e
隐藏空白字符变更
内嵌
并排
正在显示
1 个修改的文件
包含
62 行增加
和
23 行删除
+62
-23
bitswap.go
exchange/bitswap/bitswap.go
+62
-23
没有找到文件。
exchange/bitswap/bitswap.go
浏览文件 @
5639042d
...
...
@@ -3,6 +3,7 @@
package
bitswap
import
(
"fmt"
"math"
"sync"
"time"
...
...
@@ -170,58 +171,96 @@ func (bs *bitswap) HasBlock(ctx context.Context, blk *blocks.Block) error {
return
bs
.
network
.
Provide
(
ctx
,
blk
.
Key
())
}
func
(
bs
*
bitswap
)
sendWantListTo
(
ctx
context
.
Context
,
peers
<-
chan
peer
.
ID
)
error
{
func
(
bs
*
bitswap
)
sendWantlistMsgToPeer
(
ctx
context
.
Context
,
m
bsmsg
.
BitSwapMessage
,
p
peer
.
ID
)
error
{
logd
:=
fmt
.
Sprintf
(
"%s bitswap.sendWantlistMsgToPeer(%d, %s)"
,
bs
.
self
,
len
(
m
.
Wantlist
()),
p
)
log
.
Debugf
(
"%s sending wantlist"
,
logd
)
if
err
:=
bs
.
send
(
ctx
,
p
,
m
);
err
!=
nil
{
log
.
Errorf
(
"%s send wantlist error: %s"
,
logd
,
err
)
return
err
}
log
.
Debugf
(
"%s send wantlist success"
,
logd
)
return
nil
}
func
(
bs
*
bitswap
)
sendWantlistMsgToPeers
(
ctx
context
.
Context
,
m
bsmsg
.
BitSwapMessage
,
peers
<-
chan
peer
.
ID
)
error
{
if
peers
==
nil
{
panic
(
"Cant send wantlist to nil peerchan"
)
}
message
:=
bsmsg
.
New
()
for
_
,
wanted
:=
range
bs
.
wantlist
.
Entries
()
{
message
.
AddEntry
(
wanted
.
Key
,
wanted
.
Priority
)
}
logd
:=
fmt
.
Sprintf
(
"%s bitswap.sendWantlistMsgTo(%d)"
,
bs
.
self
,
len
(
m
.
Wantlist
()))
log
.
Debugf
(
"%s begin"
,
logd
)
defer
log
.
Debugf
(
"%s end"
,
logd
)
set
:=
pset
.
New
()
wg
:=
sync
.
WaitGroup
{}
for
peerToQuery
:=
range
peers
{
log
.
Event
(
ctx
,
"PeerToQuery"
,
peerToQuery
)
logd
:=
fmt
.
Sprintf
(
"%sto(%s)"
,
logd
,
peerToQuery
)
if
!
set
.
TryAdd
(
peerToQuery
)
{
//Do once per peer
log
.
Debugf
(
"%s skipped (already sent)"
,
logd
)
continue
}
wg
.
Add
(
1
)
go
func
(
p
peer
.
ID
)
{
defer
wg
.
Done
()
if
err
:=
bs
.
send
(
ctx
,
p
,
message
);
err
!=
nil
{
log
.
Error
(
err
)
return
}
bs
.
sendWantlistMsgToPeer
(
ctx
,
m
,
p
)
}(
peerToQuery
)
}
wg
.
Wait
()
return
nil
}
func
(
bs
*
bitswap
)
sendWantlistToProviders
(
ctx
context
.
Context
,
wantlist
*
wantlist
.
ThreadSafe
)
{
ctx
,
cancel
:=
context
.
WithCancel
(
ctx
)
defer
cancel
()
func
(
bs
*
bitswap
)
sendWantlistToPeers
(
ctx
context
.
Context
,
peers
<-
chan
peer
.
ID
)
error
{
message
:=
bsmsg
.
New
()
message
.
SetFull
(
true
)
for
_
,
e
:=
range
bs
.
wantlist
.
Entries
()
{
message
.
AddEntry
(
e
.
Key
,
e
.
Priority
)
for
_
,
wanted
:=
range
bs
.
wantlist
.
Entries
()
{
message
.
AddEntry
(
wanted
.
Key
,
wanted
.
Priority
)
}
return
bs
.
sendWantlistMsgToPeers
(
ctx
,
message
,
peers
)
}
set
:=
pset
.
New
()
func
(
bs
*
bitswap
)
sendWantlistToProviders
(
ctx
context
.
Context
)
{
logd
:=
fmt
.
Sprintf
(
"%s bitswap.sendWantlistToProviders"
,
bs
.
self
)
log
.
Debugf
(
"%s begin"
,
logd
)
defer
log
.
Debugf
(
"%s end"
,
logd
)
ctx
,
cancel
:=
context
.
WithCancel
(
ctx
)
defer
cancel
()
// prepare a channel to hand off to sendWantlistToPeers
sendToPeers
:=
make
(
chan
peer
.
ID
)
// Get providers for all entries in wantlist (could take a while)
wg
:=
sync
.
WaitGroup
{}
for
_
,
e
:=
range
wantlist
.
Entries
()
{
for
_
,
e
:=
range
bs
.
wantlist
.
Entries
()
{
wg
.
Add
(
1
)
go
func
(
k
u
.
Key
)
{
defer
wg
.
Done
()
logd
:=
fmt
.
Sprintf
(
"%s(entry: %s)"
,
logd
,
k
)
log
.
Debugf
(
"%s asking dht for providers"
,
logd
)
child
,
_
:=
context
.
WithTimeout
(
ctx
,
providerRequestTimeout
)
providers
:=
bs
.
network
.
FindProvidersAsync
(
child
,
k
,
maxProvidersPerRequest
)
for
prov
:=
range
providers
{
if
set
.
TryAdd
(
prov
)
{
//Do once per peer
bs
.
send
(
ctx
,
prov
,
message
)
}
log
.
Debugf
(
"%s dht returned provider %s. send wantlist"
,
logd
,
prov
)
sendToPeers
<-
prov
}
}(
e
.
Key
)
}
wg
.
Wait
()
go
func
()
{
wg
.
Wait
()
// make sure all our children do finish.
close
(
sendToPeers
)
}()
err
:=
bs
.
sendWantlistToPeers
(
ctx
,
sendToPeers
)
if
err
!=
nil
{
log
.
Errorf
(
"%s sendWantlistToPeers error: %s"
,
logd
,
err
)
}
}
func
(
bs
*
bitswap
)
taskWorker
(
ctx
context
.
Context
)
{
...
...
@@ -247,7 +286,7 @@ func (bs *bitswap) clientWorker(parent context.Context) {
select
{
case
<-
broadcastSignal
:
// Resend unfulfilled wantlist keys
bs
.
sendWantlistToProviders
(
ctx
,
bs
.
wantlist
)
bs
.
sendWantlistToProviders
(
ctx
)
broadcastSignal
=
time
.
After
(
rebroadcastDelay
.
Get
())
case
ks
:=
<-
bs
.
batchRequests
:
if
len
(
ks
)
==
0
{
...
...
@@ -266,7 +305,7 @@ func (bs *bitswap) clientWorker(parent context.Context) {
// newer bitswap strategies.
child
,
_
:=
context
.
WithTimeout
(
ctx
,
providerRequestTimeout
)
providers
:=
bs
.
network
.
FindProvidersAsync
(
child
,
ks
[
0
],
maxProvidersPerRequest
)
err
:=
bs
.
sendWant
ListTo
(
ctx
,
providers
)
err
:=
bs
.
sendWant
listToPeers
(
ctx
,
providers
)
if
err
!=
nil
{
log
.
Errorf
(
"error sending wantlist: %s"
,
err
)
}
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论