Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
G
go-ipfs
概览
概览
详情
活动
周期分析
版本库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程表
图表
维基
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
jihao
go-ipfs
Commits
b3e74fab
提交
b3e74fab
authored
2月 01, 2015
作者:
Jeromy
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
implement trickledag for faster unixfs operations
上级
1afb281d
隐藏空白字符变更
内嵌
并排
正在显示
2 个修改的文件
包含
154 行增加
和
0 行删除
+154
-0
importer_test.go
importer/importer_test.go
+63
-0
trickledag.go
importer/trickledag.go
+91
-0
没有找到文件。
importer/importer_test.go
浏览文件 @
b3e74fab
...
...
@@ -96,6 +96,32 @@ func TestBuilderConsistency(t *testing.T) {
}
}
func
TestTrickleBuilderConsistency
(
t
*
testing
.
T
)
{
nbytes
:=
100000
buf
:=
new
(
bytes
.
Buffer
)
io
.
CopyN
(
buf
,
u
.
NewTimeSeededRand
(),
int64
(
nbytes
))
should
:=
dup
(
buf
.
Bytes
())
dagserv
:=
merkledag
.
Mock
(
t
)
nd
,
err
:=
BuildTrickleDagFromReader
(
buf
,
dagserv
,
nil
,
chunk
.
DefaultSplitter
)
if
err
!=
nil
{
t
.
Fatal
(
err
)
}
r
,
err
:=
uio
.
NewDagReader
(
context
.
Background
(),
nd
,
dagserv
)
if
err
!=
nil
{
t
.
Fatal
(
err
)
}
out
,
err
:=
ioutil
.
ReadAll
(
r
)
if
err
!=
nil
{
t
.
Fatal
(
err
)
}
err
=
arrComp
(
out
,
should
)
if
err
!=
nil
{
t
.
Fatal
(
err
)
}
}
func
arrComp
(
a
,
b
[]
byte
)
error
{
if
len
(
a
)
!=
len
(
b
)
{
return
fmt
.
Errorf
(
"Arrays differ in length. %d != %d"
,
len
(
a
),
len
(
b
))
...
...
@@ -220,6 +246,43 @@ func TestSeekingBasic(t *testing.T) {
}
}
func
TestTrickleSeekingBasic
(
t
*
testing
.
T
)
{
nbytes
:=
int64
(
10
*
1024
)
should
:=
make
([]
byte
,
nbytes
)
u
.
NewTimeSeededRand
()
.
Read
(
should
)
read
:=
bytes
.
NewReader
(
should
)
dnp
:=
getDagservAndPinner
(
t
)
nd
,
err
:=
BuildDagFromReader
(
read
,
dnp
.
ds
,
dnp
.
mp
,
&
chunk
.
SizeSplitter
{
500
})
if
err
!=
nil
{
t
.
Fatal
(
err
)
}
rs
,
err
:=
uio
.
NewDagReader
(
context
.
Background
(),
nd
,
dnp
.
ds
)
if
err
!=
nil
{
t
.
Fatal
(
err
)
}
start
:=
int64
(
4000
)
n
,
err
:=
rs
.
Seek
(
start
,
os
.
SEEK_SET
)
if
err
!=
nil
{
t
.
Fatal
(
err
)
}
if
n
!=
start
{
t
.
Fatal
(
"Failed to seek to correct offset"
)
}
out
,
err
:=
ioutil
.
ReadAll
(
rs
)
if
err
!=
nil
{
t
.
Fatal
(
err
)
}
err
=
arrComp
(
out
,
should
[
start
:
])
if
err
!=
nil
{
t
.
Fatal
(
err
)
}
}
func
TestSeekToBegin
(
t
*
testing
.
T
)
{
nbytes
:=
int64
(
10
*
1024
)
should
:=
make
([]
byte
,
nbytes
)
...
...
importer/trickledag.go
0 → 100644
浏览文件 @
b3e74fab
package
importer
import
(
"io"
"github.com/jbenet/go-ipfs/importer/chunk"
dag
"github.com/jbenet/go-ipfs/merkledag"
"github.com/jbenet/go-ipfs/pin"
)
// layerRepeat specifies how many times to append a child tree of a
// given depth. Higher values increase the width of a given node, which
// improves seek speeds.
const
layerRepeat
=
4
func
BuildTrickleDagFromReader
(
r
io
.
Reader
,
ds
dag
.
DAGService
,
mp
pin
.
ManualPinner
,
spl
chunk
.
BlockSplitter
)
(
*
dag
.
Node
,
error
)
{
// Start the splitter
blkch
:=
spl
.
Split
(
r
)
// Create our builder helper
db
:=
&
dagBuilderHelper
{
dserv
:
ds
,
mp
:
mp
,
in
:
blkch
,
maxlinks
:
DefaultLinksPerBlock
,
indrSize
:
defaultIndirectBlockDataSize
(),
}
root
:=
newUnixfsNode
()
err
:=
db
.
fillNodeRec
(
root
,
1
)
if
err
!=
nil
{
return
nil
,
err
}
for
level
:=
1
;
!
db
.
done
();
level
++
{
for
i
:=
0
;
i
<
layerRepeat
&&
!
db
.
done
();
i
++
{
next
:=
newUnixfsNode
()
err
:=
db
.
fillTrickleRec
(
next
,
level
)
if
err
!=
nil
{
return
nil
,
err
}
err
=
root
.
addChild
(
next
,
db
)
if
err
!=
nil
{
return
nil
,
err
}
}
}
rootnode
,
err
:=
root
.
getDagNode
()
if
err
!=
nil
{
return
nil
,
err
}
rootkey
,
err
:=
ds
.
Add
(
rootnode
)
if
err
!=
nil
{
return
nil
,
err
}
if
mp
!=
nil
{
mp
.
PinWithMode
(
rootkey
,
pin
.
Recursive
)
err
:=
mp
.
Flush
()
if
err
!=
nil
{
return
nil
,
err
}
}
return
root
.
getDagNode
()
}
func
(
db
*
dagBuilderHelper
)
fillTrickleRec
(
node
*
unixfsNode
,
depth
int
)
error
{
// Always do this, even in the base case
err
:=
db
.
fillNodeRec
(
node
,
1
)
if
err
!=
nil
{
return
err
}
for
i
:=
1
;
i
<
depth
&&
!
db
.
done
();
i
++
{
for
j
:=
0
;
j
<
layerRepeat
;
j
++
{
next
:=
newUnixfsNode
()
err
:=
db
.
fillTrickleRec
(
next
,
i
)
if
err
!=
nil
{
return
err
}
err
=
node
.
addChild
(
next
,
db
)
if
err
!=
nil
{
return
err
}
}
}
return
nil
}
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论