Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
G
go-ipfs
概览
概览
详情
活动
周期分析
版本库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程表
图表
维基
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
jihao
go-ipfs
Commits
9c06a0ee
提交
9c06a0ee
authored
10月 14, 2017
作者:
Jeromy Johnson
提交者:
GitHub
10月 14, 2017
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #4296 from ipfs/feat/parallel-batch
parallelize batch flushing
上级
e7acb96c
9de031b4
隐藏空白字符变更
内嵌
并排
正在显示
2 个修改的文件
包含
102 行增加
和
28 行删除
+102
-28
batch.go
merkledag/batch.go
+99
-0
merkledag.go
merkledag/merkledag.go
+3
-28
没有找到文件。
merkledag/batch.go
0 → 100644
浏览文件 @
9c06a0ee
package
merkledag
import
(
"runtime"
cid
"gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid"
node
"gx/ipfs/QmPN7cwmpcc4DWXb4KTB9dNAJgjuPY69h3npsMfhRrQL9c/go-ipld-format"
blocks
"gx/ipfs/QmSn9Td7xgxm9EV7iEjTckpUWmWApggzPxu7eFGWkkpwin/go-block-format"
)
// ParallelBatchCommits is the number of batch commits that can be in-flight before blocking.
// TODO(#4299): Experiment with multiple datastores, storage devices, and CPUs to find
// the right value/formula.
var
ParallelBatchCommits
=
runtime
.
NumCPU
()
*
2
// Batch is a buffer for batching adds to a dag.
type
Batch
struct
{
ds
*
dagService
activeCommits
int
commitError
error
commitResults
chan
error
blocks
[]
blocks
.
Block
size
int
MaxSize
int
MaxBlocks
int
}
func
(
t
*
Batch
)
processResults
()
{
for
t
.
activeCommits
>
0
&&
t
.
commitError
==
nil
{
select
{
case
err
:=
<-
t
.
commitResults
:
t
.
activeCommits
--
if
err
!=
nil
{
t
.
commitError
=
err
}
default
:
return
}
}
}
func
(
t
*
Batch
)
asyncCommit
()
{
numBlocks
:=
len
(
t
.
blocks
)
if
numBlocks
==
0
||
t
.
commitError
!=
nil
{
return
}
if
t
.
activeCommits
>=
ParallelBatchCommits
{
err
:=
<-
t
.
commitResults
t
.
activeCommits
--
if
err
!=
nil
{
t
.
commitError
=
err
return
}
}
go
func
(
b
[]
blocks
.
Block
)
{
_
,
err
:=
t
.
ds
.
Blocks
.
AddBlocks
(
b
)
t
.
commitResults
<-
err
}(
t
.
blocks
)
t
.
activeCommits
++
t
.
blocks
=
make
([]
blocks
.
Block
,
0
,
numBlocks
)
t
.
size
=
0
return
}
// Add adds a node to the batch and commits the batch if necessary.
func
(
t
*
Batch
)
Add
(
nd
node
.
Node
)
(
*
cid
.
Cid
,
error
)
{
// Not strictly necessary but allows us to catch errors early.
t
.
processResults
()
if
t
.
commitError
!=
nil
{
return
nil
,
t
.
commitError
}
t
.
blocks
=
append
(
t
.
blocks
,
nd
)
t
.
size
+=
len
(
nd
.
RawData
())
if
t
.
size
>
t
.
MaxSize
||
len
(
t
.
blocks
)
>
t
.
MaxBlocks
{
t
.
asyncCommit
()
}
return
nd
.
Cid
(),
t
.
commitError
}
// Commit commits batched nodes.
func
(
t
*
Batch
)
Commit
()
error
{
t
.
asyncCommit
()
for
t
.
activeCommits
>
0
&&
t
.
commitError
==
nil
{
err
:=
<-
t
.
commitResults
t
.
activeCommits
--
if
err
!=
nil
{
t
.
commitError
=
err
}
}
return
t
.
commitError
}
merkledag/merkledag.go
浏览文件 @
9c06a0ee
...
...
@@ -11,7 +11,6 @@ import (
cid
"gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid"
node
"gx/ipfs/QmPN7cwmpcc4DWXb4KTB9dNAJgjuPY69h3npsMfhRrQL9c/go-ipld-format"
blocks
"gx/ipfs/QmSn9Td7xgxm9EV7iEjTckpUWmWApggzPxu7eFGWkkpwin/go-block-format"
ipldcbor
"gx/ipfs/QmWCs8kMecJwCPK8JThue8TjgM2ieJ2HjTLDu7Cv2NEmZi/go-ipld-cbor"
)
...
...
@@ -75,8 +74,9 @@ func (n *dagService) Add(nd node.Node) (*cid.Cid, error) {
func
(
n
*
dagService
)
Batch
()
*
Batch
{
return
&
Batch
{
ds
:
n
,
MaxSize
:
8
<<
20
,
ds
:
n
,
commitResults
:
make
(
chan
error
,
ParallelBatchCommits
),
MaxSize
:
8
<<
20
,
// By default, only batch up to 128 nodes at a time.
// The current implementation of flatfs opens this many file
...
...
@@ -389,31 +389,6 @@ func (np *nodePromise) Get(ctx context.Context) (node.Node, error) {
}
}
type
Batch
struct
{
ds
*
dagService
blocks
[]
blocks
.
Block
size
int
MaxSize
int
MaxBlocks
int
}
func
(
t
*
Batch
)
Add
(
nd
node
.
Node
)
(
*
cid
.
Cid
,
error
)
{
t
.
blocks
=
append
(
t
.
blocks
,
nd
)
t
.
size
+=
len
(
nd
.
RawData
())
if
t
.
size
>
t
.
MaxSize
||
len
(
t
.
blocks
)
>
t
.
MaxBlocks
{
return
nd
.
Cid
(),
t
.
Commit
()
}
return
nd
.
Cid
(),
nil
}
func
(
t
*
Batch
)
Commit
()
error
{
_
,
err
:=
t
.
ds
.
Blocks
.
AddBlocks
(
t
.
blocks
)
t
.
blocks
=
nil
t
.
size
=
0
return
err
}
type
GetLinks
func
(
context
.
Context
,
*
cid
.
Cid
)
([]
*
node
.
Link
,
error
)
// EnumerateChildren will walk the dag below the given root node and add all
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论