Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
G
go-ipfs
概览
概览
详情
活动
周期分析
版本库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程表
图表
维基
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
jihao
go-ipfs
Commits
4427d7e8
提交
4427d7e8
authored
5月 01, 2019
作者:
Erik Ingenito
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Test and fix GC/pin bug #6252
License: MIT Signed-off-by:
Erik Ingenito
<
erik.ingenito@protocol.ai
>
上级
0f53ad09
隐藏空白字符变更
内嵌
并排
正在显示
2 个修改的文件
包含
110 行增加
和
7 行删除
+110
-7
add.go
core/coreunix/add.go
+0
-7
add_test.go
core/coreunix/add_test.go
+110
-0
没有找到文件。
core/coreunix/add.go
浏览文件 @
4427d7e8
...
...
@@ -71,7 +71,6 @@ type Adder struct {
Silent
bool
NoCopy
bool
Chunker
string
root
ipld
.
Node
mroot
*
mfs
.
Root
unlocker
bstore
.
Unlocker
tempRoot
cid
.
Cid
...
...
@@ -132,11 +131,6 @@ func (adder *Adder) add(reader io.Reader) (ipld.Node, error) {
// RootNode returns the mfs root node
func
(
adder
*
Adder
)
curRootNode
()
(
ipld
.
Node
,
error
)
{
// for memoizing
if
adder
.
root
!=
nil
{
return
adder
.
root
,
nil
}
mr
,
err
:=
adder
.
mfsRoot
()
if
err
!=
nil
{
return
nil
,
err
...
...
@@ -156,7 +150,6 @@ func (adder *Adder) curRootNode() (ipld.Node, error) {
root
=
nd
}
adder
.
root
=
root
return
root
,
err
}
...
...
core/coreunix/add_test.go
浏览文件 @
4427d7e8
...
...
@@ -30,6 +30,116 @@ import (
const
testPeerID
=
"QmTFauExutTsy4XP6JbMFcw2Wa9645HJt2bTqL6qYDCKfe"
func
TestAddMultipleGCLive
(
t
*
testing
.
T
)
{
r
:=
&
repo
.
Mock
{
C
:
config
.
Config
{
Identity
:
config
.
Identity
{
PeerID
:
testPeerID
,
// required by offline node
},
},
D
:
syncds
.
MutexWrap
(
datastore
.
NewMapDatastore
()),
}
node
,
err
:=
core
.
NewNode
(
context
.
Background
(),
&
core
.
BuildCfg
{
Repo
:
r
})
if
err
!=
nil
{
t
.
Fatal
(
err
)
}
out
:=
make
(
chan
interface
{},
10
)
adder
,
err
:=
NewAdder
(
context
.
Background
(),
node
.
Pinning
,
node
.
Blockstore
,
node
.
DAG
)
if
err
!=
nil
{
t
.
Fatal
(
err
)
}
adder
.
Out
=
out
// make two files with pipes so we can 'pause' the add for timing of the test
piper1
,
pipew1
:=
io
.
Pipe
()
hangfile1
:=
files
.
NewReaderFile
(
piper1
)
piper2
,
pipew2
:=
io
.
Pipe
()
hangfile2
:=
files
.
NewReaderFile
(
piper2
)
rfc
:=
files
.
NewBytesFile
([]
byte
(
"testfileA"
))
slf
:=
files
.
NewMapDirectory
(
map
[
string
]
files
.
Node
{
"a"
:
hangfile1
,
"b"
:
hangfile2
,
"c"
:
rfc
,
})
go
func
()
{
defer
close
(
out
)
adder
.
AddAllAndPin
(
slf
)
// Ignore errors for clarity - the real bug would be gc'ing files while adding them, not this resultant error
}()
// Start writing the first file but don't close the stream
if
_
,
err
:=
pipew1
.
Write
([]
byte
(
"some data for file a"
));
err
!=
nil
{
t
.
Fatal
(
err
)
}
var
gc1out
<-
chan
gc
.
Result
gc1started
:=
make
(
chan
struct
{})
go
func
()
{
defer
close
(
gc1started
)
gc1out
=
gc
.
GC
(
context
.
Background
(),
node
.
Blockstore
,
node
.
Repo
.
Datastore
(),
node
.
Pinning
,
nil
)
}()
// GC shouldn't get the lock until after the file is completely added
select
{
case
<-
gc1started
:
t
.
Fatal
(
"gc shouldnt have started yet"
)
default
:
}
// finish write and unblock gc
pipew1
.
Close
()
// Should have gotten the lock at this point
<-
gc1started
removedHashes
:=
make
(
map
[
string
]
struct
{})
for
r
:=
range
gc1out
{
if
r
.
Error
!=
nil
{
t
.
Fatal
(
err
)
}
removedHashes
[
r
.
KeyRemoved
.
String
()]
=
struct
{}{}
}
if
_
,
err
:=
pipew2
.
Write
([]
byte
(
"some data for file b"
));
err
!=
nil
{
t
.
Fatal
(
err
)
}
var
gc2out
<-
chan
gc
.
Result
gc2started
:=
make
(
chan
struct
{})
go
func
()
{
defer
close
(
gc2started
)
gc2out
=
gc
.
GC
(
context
.
Background
(),
node
.
Blockstore
,
node
.
Repo
.
Datastore
(),
node
.
Pinning
,
nil
)
}()
select
{
case
<-
gc2started
:
t
.
Fatal
(
"gc shouldnt have started yet"
)
default
:
}
pipew2
.
Close
()
<-
gc2started
for
r
:=
range
gc2out
{
if
r
.
Error
!=
nil
{
t
.
Fatal
(
err
)
}
removedHashes
[
r
.
KeyRemoved
.
String
()]
=
struct
{}{}
}
for
o
:=
range
out
{
if
_
,
ok
:=
removedHashes
[
o
.
(
*
coreiface
.
AddEvent
)
.
Path
.
Cid
()
.
String
()];
ok
{
t
.
Fatal
(
"gc'ed a hash we just added"
)
}
}
}
func
TestAddGCLive
(
t
*
testing
.
T
)
{
r
:=
&
repo
.
Mock
{
C
:
config
.
Config
{
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论