Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
G
go-ipfs
概览
概览
详情
活动
周期分析
版本库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程表
图表
维基
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
jihao
go-ipfs
Commits
22f0b879
提交
22f0b879
authored
10月 18, 2015
作者:
Jeromy
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix panic in bitswap working limit spawning
License: MIT Signed-off-by:
Jeromy
<
jeromyj@gmail.com
>
上级
9ca0be36
隐藏空白字符变更
内嵌
并排
正在显示
1 个修改的文件
包含
26 行增加
和
22 行删除
+26
-22
workers.go
exchange/bitswap/workers.go
+26
-22
没有找到文件。
exchange/bitswap/workers.go
浏览文件 @
22f0b879
...
...
@@ -5,7 +5,6 @@ import (
process
"github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess"
procctx
"github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess/context"
ratelimit
"github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess/ratelimit"
context
"github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context"
key
"github.com/ipfs/go-ipfs/blocks/key"
...
...
@@ -74,43 +73,48 @@ func (bs *Bitswap) taskWorker(ctx context.Context, id int) {
func
(
bs
*
Bitswap
)
provideWorker
(
px
process
.
Process
)
{
limit
er
:=
ratelimit
.
NewRateLimiter
(
px
,
provideWorkerMax
)
limit
:=
make
(
chan
struct
{}
,
provideWorkerMax
)
limitedGoProvide
:=
func
(
k
key
.
Key
,
wid
int
)
{
defer
func
()
{
// replace token when done
<-
limit
}()
ev
:=
logging
.
LoggableMap
{
"ID"
:
wid
}
limiter
.
LimitedGo
(
func
(
px
process
.
Process
)
{
ctx
:=
procctx
.
OnClosingContext
(
px
)
// derive ctx from px
defer
log
.
EventBegin
(
ctx
,
"Bitswap.ProvideWorker.Work"
,
ev
,
&
k
)
.
Done
()
ctx
:=
procctx
.
OnClosingContext
(
px
)
// derive ctx from px
defer
log
.
EventBegin
(
ctx
,
"Bitswap.ProvideWorker.Work"
,
ev
,
&
k
)
.
Done
()
ctx
,
cancel
:=
context
.
WithTimeout
(
ctx
,
provideTimeout
)
// timeout ctx
defer
cancel
()
ctx
,
cancel
:=
context
.
WithTimeout
(
ctx
,
provideTimeout
)
// timeout ctx
defer
cancel
()
if
err
:=
bs
.
network
.
Provide
(
ctx
,
k
);
err
!=
nil
{
log
.
Error
(
err
)
}
})
if
err
:=
bs
.
network
.
Provide
(
ctx
,
k
);
err
!=
nil
{
log
.
Error
(
err
)
}
}
// worker spawner, reads from bs.provideKeys until it closes, spawning a
// _ratelimited_ number of workers to handle each key.
limiter
.
Go
(
func
(
px
process
.
Process
)
{
for
wid
:=
2
;
;
wid
++
{
ev
:=
logging
.
LoggableMap
{
"ID"
:
1
}
log
.
Event
(
procctx
.
OnClosingContext
(
px
),
"Bitswap.ProvideWorker.Loop"
,
ev
)
for
wid
:=
2
;
;
wid
++
{
ev
:=
logging
.
LoggableMap
{
"ID"
:
1
}
log
.
Event
(
procctx
.
OnClosingContext
(
px
),
"Bitswap.ProvideWorker.Loop"
,
ev
)
select
{
case
<-
px
.
Closing
()
:
return
case
k
,
ok
:=
<-
bs
.
provideKeys
:
if
!
ok
{
log
.
Debug
(
"provideKeys channel closed"
)
return
}
select
{
case
<-
px
.
Closing
()
:
return
case
k
,
ok
:=
<-
bs
.
provideKeys
:
if
!
ok
{
log
.
Debug
(
"provideKeys channel closed"
)
return
}
limitedGoProvide
(
k
,
wid
)
case
limit
<-
struct
{}{}
:
go
limitedGoProvide
(
k
,
wid
)
}
}
}
)
}
}
func
(
bs
*
Bitswap
)
provideCollector
(
ctx
context
.
Context
)
{
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论