Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
G
go-ipfs
概览
概览
详情
活动
周期分析
版本库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程表
图表
维基
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
jihao
go-ipfs
Commits
d36b6dbd
提交
d36b6dbd
authored
4月 23, 2019
作者:
Łukasz Magiera
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
reprovider: use goprocess
License: MIT Signed-off-by:
Łukasz Magiera
<
magik6k@gmail.com
>
上级
14866308
隐藏空白字符变更
内嵌
并排
正在显示
4 个修改的文件
包含
50 行增加
和
39 行删除
+50
-39
provider.go
core/node/provider.go
+13
-13
providers.go
reprovide/providers.go
+4
-4
reprovide.go
reprovide/reprovide.go
+29
-17
reprovide_test.go
reprovide/reprovide_test.go
+4
-5
没有找到文件。
core/node/provider.go
浏览文件 @
d36b6dbd
...
...
@@ -45,6 +45,16 @@ func ProviderCtor(mctx helpers.MetricsCtx, lc fx.Lifecycle, queue *provider.Queu
func
ReproviderCtor
(
mctx
helpers
.
MetricsCtx
,
lc
fx
.
Lifecycle
,
cfg
*
config
.
Config
,
bs
BaseBlocks
,
ds
format
.
DAGService
,
pinning
pin
.
Pinner
,
rt
routing
.
IpfsRouting
)
(
*
reprovide
.
Reprovider
,
error
)
{
var
keyProvider
reprovide
.
KeyChanFunc
reproviderInterval
:=
kReprovideFrequency
if
cfg
.
Reprovider
.
Interval
!=
""
{
dur
,
err
:=
time
.
ParseDuration
(
cfg
.
Reprovider
.
Interval
)
if
err
!=
nil
{
return
nil
,
err
}
reproviderInterval
=
dur
}
switch
cfg
.
Reprovider
.
Strategy
{
case
"all"
:
fallthrough
...
...
@@ -57,21 +67,11 @@ func ReproviderCtor(mctx helpers.MetricsCtx, lc fx.Lifecycle, cfg *config.Config
default
:
return
nil
,
fmt
.
Errorf
(
"unknown reprovider strategy '%s'"
,
cfg
.
Reprovider
.
Strategy
)
}
return
reprovide
.
NewReprovider
(
helpers
.
LifecycleCtx
(
mctx
,
lc
),
rt
,
keyProvider
),
nil
return
reprovide
.
NewReprovider
(
helpers
.
LifecycleCtx
(
mctx
,
lc
),
r
eproviderInterval
,
r
t
,
keyProvider
),
nil
}
// Reprovider runs the reprovider service
func
Reprovider
(
cfg
*
config
.
Config
,
reprovider
*
reprovide
.
Reprovider
)
error
{
reproviderInterval
:=
kReprovideFrequency
if
cfg
.
Reprovider
.
Interval
!=
""
{
dur
,
err
:=
time
.
ParseDuration
(
cfg
.
Reprovider
.
Interval
)
if
err
!=
nil
{
return
err
}
reproviderInterval
=
dur
}
go
reprovider
.
Run
(
reproviderInterval
)
// TODO: refactor reprovider to have Start/Stop, use lifecycle
func
Reprovider
(
lp
lcProcess
,
reprovider
*
reprovide
.
Reprovider
)
error
{
lp
.
Append
(
reprovider
.
Run
)
return
nil
}
reprovide/providers.go
浏览文件 @
d36b6dbd
...
...
@@ -3,13 +3,13 @@ package reprovide
import
(
"context"
"github.com/ipfs/go-ipfs/pin"
pin
"github.com/ipfs/go-ipfs/pin"
"github.com/ipfs/go-cid"
"github.com/ipfs/go-cidutil"
cid
"github.com/ipfs/go-cid"
cidutil
"github.com/ipfs/go-cidutil"
blocks
"github.com/ipfs/go-ipfs-blockstore"
ipld
"github.com/ipfs/go-ipld-format"
"github.com/ipfs/go-merkledag"
merkledag
"github.com/ipfs/go-merkledag"
)
// NewBlockstoreProvider returns key provider using bstore.AllKeysChan
...
...
reprovide/reprovide.go
浏览文件 @
d36b6dbd
...
...
@@ -2,67 +2,77 @@ package reprovide
import
(
"context"
"errors"
"fmt"
"time"
backoff
"github.com/cenkalti/backoff"
cid
"github.com/ipfs/go-cid"
"github.com/cenkalti/backoff"
"github.com/ipfs/go-cid"
logging
"github.com/ipfs/go-log"
"github.com/ipfs/go-verifcid"
"github.com/jbenet/goprocess"
goprocessctx
"github.com/jbenet/goprocess/context"
routing
"github.com/libp2p/go-libp2p-routing"
)
var
log
=
logging
.
Logger
(
"reprovider"
)
//KeyChanFunc is function streaming CIDs to pass to content routing
//
KeyChanFunc is function streaming CIDs to pass to content routing
type
KeyChanFunc
func
(
context
.
Context
)
(
<-
chan
cid
.
Cid
,
error
)
type
doneFunc
func
(
error
)
type
Reprovider
struct
{
ctx
context
.
Context
trigger
chan
doneFunc
closing
chan
struct
{}
// The routing system to provide values through
rsys
routing
.
ContentRouting
keyProvider
KeyChanFunc
tick
time
.
Duration
}
// NewReprovider creates new Reprovider instance.
func
NewReprovider
(
ctx
context
.
Context
,
rsys
routing
.
ContentRouting
,
keyProvider
KeyChanFunc
)
*
Reprovider
{
func
NewReprovider
(
ctx
context
.
Context
,
tick
time
.
Duration
,
rsys
routing
.
ContentRouting
,
keyProvider
KeyChanFunc
)
*
Reprovider
{
return
&
Reprovider
{
ctx
:
ctx
,
trigger
:
make
(
chan
doneFunc
),
closing
:
make
(
chan
struct
{}),
rsys
:
rsys
,
keyProvider
:
keyProvider
,
tick
:
tick
,
}
}
// Run re-provides keys with 'tick' interval or when triggered
func
(
rp
*
Reprovider
)
Run
(
tick
time
.
Duration
)
{
func
(
rp
*
Reprovider
)
Run
(
proc
goprocess
.
Process
)
{
ctx
:=
goprocessctx
.
WithProcessClosing
(
rp
.
ctx
,
proc
)
defer
close
(
rp
.
closing
)
// dont reprovide immediately.
// may have just started the daemon and shutting it down immediately.
// probability( up another minute | uptime ) increases with uptime.
after
:=
time
.
After
(
time
.
Minute
)
var
done
doneFunc
for
{
if
tick
==
0
{
if
rp
.
tick
==
0
{
after
=
make
(
chan
time
.
Time
)
}
select
{
case
<-
rp
.
ctx
.
Done
()
:
case
<-
ctx
.
Done
()
:
return
case
done
=
<-
rp
.
trigger
:
case
<-
after
:
}
//'mute' the trigger channel so when `ipfs bitswap reprovide` is called
//a 'reprovider is already running' error is returned
//
'mute' the trigger channel so when `ipfs bitswap reprovide` is called
//
a 'reprovider is already running' error is returned
unmute
:=
rp
.
muteTrigger
()
err
:=
rp
.
Reprovide
(
)
err
:=
rp
.
reprovide
(
ctx
)
if
err
!=
nil
{
log
.
Debug
(
err
)
}
...
...
@@ -73,13 +83,13 @@ func (rp *Reprovider) Run(tick time.Duration) {
unmute
()
after
=
time
.
After
(
tick
)
after
=
time
.
After
(
rp
.
tick
)
}
}
//
R
eprovide registers all keys given by rp.keyProvider to libp2p content routing
func
(
rp
*
Reprovider
)
Reprovide
(
)
error
{
keychan
,
err
:=
rp
.
keyProvider
(
rp
.
ctx
)
//
r
eprovide registers all keys given by rp.keyProvider to libp2p content routing
func
(
rp
*
Reprovider
)
reprovide
(
ctx
context
.
Context
)
error
{
keychan
,
err
:=
rp
.
keyProvider
(
ctx
)
if
err
!=
nil
{
return
fmt
.
Errorf
(
"failed to get key chan: %s"
,
err
)
}
...
...
@@ -90,7 +100,7 @@ func (rp *Reprovider) Reprovide() error {
continue
}
op
:=
func
()
error
{
err
:=
rp
.
rsys
.
Provide
(
rp
.
ctx
,
c
,
true
)
err
:=
rp
.
rsys
.
Provide
(
ctx
,
c
,
true
)
if
err
!=
nil
{
log
.
Debugf
(
"Failed to provide key: %s"
,
err
)
}
...
...
@@ -119,10 +129,12 @@ func (rp *Reprovider) Trigger(ctx context.Context) error {
}
select
{
case
<-
rp
.
closing
:
return
errors
.
New
(
"reprovider is closed"
)
case
<-
rp
.
ctx
.
Done
()
:
return
context
.
Canceled
return
rp
.
ctx
.
Err
()
case
<-
ctx
.
Done
()
:
return
c
ontext
.
Canceled
return
c
tx
.
Err
()
case
rp
.
trigger
<-
df
:
<-
progressCtx
.
Done
()
return
err
...
...
reprovide/reprovide_test.go
浏览文件 @
d36b6dbd
package
reprovide
_test
package
reprovide
import
(
"context"
"github.com/ipfs/go-ipfs"
"testing"
blocks
"github.com/ipfs/go-block-format"
...
...
@@ -34,9 +33,9 @@ func TestReprovide(t *testing.T) {
t
.
Fatal
(
err
)
}
keyProvider
:=
ipfs
.
NewBlockstoreProvider
(
bstore
)
reprov
:=
ipfs
.
NewReprovider
(
ctx
,
clA
,
keyProvider
)
err
=
reprov
.
Reprovide
(
)
keyProvider
:=
NewBlockstoreProvider
(
bstore
)
reprov
:=
NewReprovider
(
ctx
,
0
,
clA
,
keyProvider
)
err
=
reprov
.
reprovide
(
ctx
)
if
err
!=
nil
{
t
.
Fatal
(
err
)
}
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论