Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
G
go-ipfs
概览
概览
详情
活动
周期分析
版本库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程表
图表
维基
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
jihao
go-ipfs
Commits
9aea2c78
提交
9aea2c78
authored
1月 02, 2016
作者:
Jeromy
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix shared node reference issue
License: MIT Signed-off-by:
Jeromy
<
jeromyj@gmail.com
>
上级
871cc6f1
隐藏空白字符变更
内嵌
并排
正在显示
5 个修改的文件
包含
97 行增加
和
13 行删除
+97
-13
dir.go
mfs/dir.go
+3
-3
file.go
mfs/file.go
+6
-3
mfs_test.go
mfs/mfs_test.go
+58
-2
ops.go
mfs/ops.go
+5
-5
t0250-files-api.sh
test/sharness/t0250-files-api.sh
+25
-0
没有找到文件。
mfs/dir.go
浏览文件 @
9aea2c78
...
...
@@ -258,9 +258,9 @@ func (d *Directory) Mkdir(name string) (*Directory, error) {
d
.
lock
.
Lock
()
defer
d
.
lock
.
Unlock
()
_
,
err
:=
d
.
childDir
(
name
)
child
,
err
:=
d
.
childDir
(
name
)
if
err
==
nil
{
return
nil
,
os
.
ErrExist
return
child
,
os
.
ErrExist
}
_
,
err
=
d
.
childFile
(
name
)
if
err
==
nil
{
...
...
@@ -395,7 +395,7 @@ func (d *Directory) GetNode() (*dag.Node, error) {
return
nil
,
err
}
return
d
.
node
,
nil
return
d
.
node
.
Copy
()
,
nil
}
func
(
d
*
Directory
)
Lock
()
{
...
...
mfs/file.go
浏览文件 @
9aea2c78
...
...
@@ -65,6 +65,7 @@ func (fi *File) Close() error {
if
fi
.
hasChanges
{
err
:=
fi
.
mod
.
Sync
()
if
err
!=
nil
{
fi
.
Unlock
()
return
err
}
...
...
@@ -74,6 +75,7 @@ func (fi *File) Close() error {
// it will manage the lock for us
return
fi
.
flushUp
()
}
fi
.
Unlock
()
return
nil
}
...
...
@@ -93,12 +95,13 @@ func (fi *File) flushUp() error {
return
err
}
name
:=
fi
.
name
parent
:=
fi
.
parent
//
name := fi.name
//
parent := fi.parent
// explicit unlock *only* before closeChild call
fi
.
Unlock
()
return
parent
.
closeChild
(
name
,
nd
)
return
nil
//return parent.closeChild(name, nd)
}
// Sync flushes the changes in the file to disk
...
...
mfs/mfs_test.go
浏览文件 @
9aea2c78
...
...
@@ -576,10 +576,56 @@ func actorRemoveFile(d *Directory) error {
return
d
.
Unlink
(
re
.
Name
)
}
func
actorReadFile
(
d
*
Directory
)
error
{
d
,
err
:=
randomWalk
(
d
,
rand
.
Intn
(
6
))
if
err
!=
nil
{
return
err
}
ents
,
err
:=
d
.
List
()
if
err
!=
nil
{
return
err
}
var
files
[]
string
for
_
,
e
:=
range
ents
{
if
e
.
Type
==
int
(
TFile
)
{
files
=
append
(
files
,
e
.
Name
)
}
}
if
len
(
files
)
==
0
{
return
nil
}
fname
:=
files
[
rand
.
Intn
(
len
(
files
))]
fsn
,
err
:=
d
.
Child
(
fname
)
if
err
!=
nil
{
return
err
}
fi
,
ok
:=
fsn
.
(
*
File
)
if
!
ok
{
return
errors
.
New
(
"file wasnt a file, race?"
)
}
_
,
err
=
fi
.
Size
()
if
err
!=
nil
{
return
err
}
_
,
err
=
ioutil
.
ReadAll
(
fi
)
if
err
!=
nil
{
return
err
}
return
fi
.
Close
()
}
func
testActor
(
rt
*
Root
,
iterations
int
,
errs
chan
error
)
{
d
:=
rt
.
GetValue
()
.
(
*
Directory
)
for
i
:=
0
;
i
<
iterations
;
i
++
{
switch
rand
.
Intn
(
4
)
{
switch
rand
.
Intn
(
5
)
{
case
0
:
if
err
:=
actorMkdir
(
d
);
err
!=
nil
{
errs
<-
err
...
...
@@ -591,10 +637,20 @@ func testActor(rt *Root, iterations int, errs chan error) {
return
}
case
3
:
continue
// randomly deleting things
// doesnt really give us any sort of useful test results.
// you will never have this in a real environment where
// you expect anything productive to happen...
if
err
:=
actorRemoveFile
(
d
);
err
!=
nil
{
errs
<-
err
return
}
case
4
:
if
err
:=
actorReadFile
(
d
);
err
!=
nil
{
errs
<-
err
return
}
}
}
errs
<-
nil
...
...
@@ -605,7 +661,7 @@ func TestMfsStress(t *testing.T) {
defer
cancel
()
_
,
rt
:=
setupRoot
(
ctx
,
t
)
numroutines
:=
2
numroutines
:=
10
errs
:=
make
(
chan
error
)
for
i
:=
0
;
i
<
numroutines
;
i
++
{
...
...
mfs/ops.go
浏览文件 @
9aea2c78
...
...
@@ -99,8 +99,8 @@ func PutNode(r *Root, path string, nd *dag.Node) error {
}
// Mkdir creates a directory at 'path' under the directory 'd', creating
// intermediary directories as needed if 'parents' is set to true
func
Mkdir
(
r
*
Root
,
pth
string
,
parents
bool
,
flush
bool
)
error
{
// intermediary directories as needed if '
mk
parents' is set to true
func
Mkdir
(
r
*
Root
,
pth
string
,
mk
parents
bool
,
flush
bool
)
error
{
if
pth
==
""
{
return
nil
}
...
...
@@ -116,7 +116,7 @@ func Mkdir(r *Root, pth string, parents bool, flush bool) error {
if
len
(
parts
)
==
0
{
// this will only happen on 'mkdir /'
if
parents
{
if
mk
parents
{
return
nil
}
return
fmt
.
Errorf
(
"cannot create directory '/': Already exists"
)
...
...
@@ -125,7 +125,7 @@ func Mkdir(r *Root, pth string, parents bool, flush bool) error {
cur
:=
r
.
GetValue
()
.
(
*
Directory
)
for
i
,
d
:=
range
parts
[
:
len
(
parts
)
-
1
]
{
fsn
,
err
:=
cur
.
Child
(
d
)
if
err
==
os
.
ErrNotExist
&&
parents
{
if
err
==
os
.
ErrNotExist
&&
mk
parents
{
mkd
,
err
:=
cur
.
Mkdir
(
d
)
if
err
!=
nil
{
return
err
...
...
@@ -144,7 +144,7 @@ func Mkdir(r *Root, pth string, parents bool, flush bool) error {
final
,
err
:=
cur
.
Mkdir
(
parts
[
len
(
parts
)
-
1
])
if
err
!=
nil
{
if
!
parents
||
err
!=
os
.
ErrExist
{
if
!
mkparents
||
err
!=
os
.
ErrExist
||
final
==
nil
{
return
err
}
}
...
...
test/sharness/t0250-files-api.sh
浏览文件 @
9aea2c78
...
...
@@ -352,6 +352,31 @@ test_files_api() {
test_expect_success
"cleanup looks good"
'
verify_dir_contents /
'
# test flush flags
test_expect_success
"mkdir --flush works"
'
ipfs files mkdir --flush --parents /flushed/deep
'
test_expect_success
"mkdir --flush works a second time"
'
ipfs files mkdir --flush --parents /flushed/deep
'
test_expect_success
"dir looks right"
'
verify_dir_contents / flushed
'
test_expect_success
"child dir looks right"
'
verify_dir_contents /flushed deep
'
test_expect_success
"cleanup"
'
ipfs files rm -r /flushed
'
test_expect_success
"child dir looks right"
'
verify_dir_contents /
'
}
# test offline and online
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论