Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
G
go-ipfs
概览
概览
详情
活动
周期分析
版本库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程表
图表
维基
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
jihao
go-ipfs
Commits
332a7967
提交
332a7967
authored
5月 23, 2017
作者:
Kevin Atkinson
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
filestore: add "--file-order" option to "filestore ls" and "verify"
License: MIT Signed-off-by:
Kevin Atkinson
<
k@kevina.org
>
上级
ec43fe47
隐藏空白字符变更
内嵌
并排
正在显示
3 个修改的文件
包含
128 行增加
和
12 行删除
+128
-12
filestore.go
core/commands/filestore.go
+10
-2
util.go
filestore/util.go
+96
-2
t0271-filestore-utils.sh
test/sharness/t0271-filestore-utils.sh
+22
-8
没有找到文件。
core/commands/filestore.go
浏览文件 @
332a7967
...
@@ -40,6 +40,9 @@ The output is:
...
@@ -40,6 +40,9 @@ The output is:
Arguments
:
[]
cmds
.
Argument
{
Arguments
:
[]
cmds
.
Argument
{
cmds
.
StringArg
(
"obj"
,
false
,
true
,
"Cid of objects to list."
),
cmds
.
StringArg
(
"obj"
,
false
,
true
,
"Cid of objects to list."
),
},
},
Options
:
[]
cmds
.
Option
{
cmds
.
BoolOption
(
"file-order"
,
"sort the results based on the path of the backing file"
),
},
Run
:
func
(
req
cmds
.
Request
,
res
cmds
.
Response
)
{
Run
:
func
(
req
cmds
.
Request
,
res
cmds
.
Response
)
{
_
,
fs
,
err
:=
getFilestore
(
req
)
_
,
fs
,
err
:=
getFilestore
(
req
)
if
err
!=
nil
{
if
err
!=
nil
{
...
@@ -53,7 +56,8 @@ The output is:
...
@@ -53,7 +56,8 @@ The output is:
},
req
.
Context
())
},
req
.
Context
())
res
.
SetOutput
(
out
)
res
.
SetOutput
(
out
)
}
else
{
}
else
{
next
,
err
:=
filestore
.
ListAll
(
fs
)
fileOrder
,
_
,
_
:=
req
.
Option
(
"file-order"
)
.
Bool
()
next
,
err
:=
filestore
.
ListAll
(
fs
,
fileOrder
)
if
err
!=
nil
{
if
err
!=
nil
{
res
.
SetError
(
err
,
cmds
.
ErrNormal
)
res
.
SetError
(
err
,
cmds
.
ErrNormal
)
return
return
...
@@ -114,6 +118,9 @@ For ERROR entries the error will also be printed to stderr.
...
@@ -114,6 +118,9 @@ For ERROR entries the error will also be printed to stderr.
Arguments
:
[]
cmds
.
Argument
{
Arguments
:
[]
cmds
.
Argument
{
cmds
.
StringArg
(
"obj"
,
false
,
true
,
"Cid of objects to verify."
),
cmds
.
StringArg
(
"obj"
,
false
,
true
,
"Cid of objects to verify."
),
},
},
Options
:
[]
cmds
.
Option
{
cmds
.
BoolOption
(
"file-order"
,
"verify the objects based on the order of the backing file"
),
},
Run
:
func
(
req
cmds
.
Request
,
res
cmds
.
Response
)
{
Run
:
func
(
req
cmds
.
Request
,
res
cmds
.
Response
)
{
_
,
fs
,
err
:=
getFilestore
(
req
)
_
,
fs
,
err
:=
getFilestore
(
req
)
if
err
!=
nil
{
if
err
!=
nil
{
...
@@ -127,7 +134,8 @@ For ERROR entries the error will also be printed to stderr.
...
@@ -127,7 +134,8 @@ For ERROR entries the error will also be printed to stderr.
},
req
.
Context
())
},
req
.
Context
())
res
.
SetOutput
(
out
)
res
.
SetOutput
(
out
)
}
else
{
}
else
{
next
,
err
:=
filestore
.
VerifyAll
(
fs
)
fileOrder
,
_
,
_
:=
req
.
Option
(
"file-order"
)
.
Bool
()
next
,
err
:=
filestore
.
VerifyAll
(
fs
,
fileOrder
)
if
err
!=
nil
{
if
err
!=
nil
{
res
.
SetError
(
err
,
cmds
.
ErrNormal
)
res
.
SetError
(
err
,
cmds
.
ErrNormal
)
return
return
...
...
filestore/util.go
浏览文件 @
332a7967
...
@@ -2,6 +2,7 @@ package filestore
...
@@ -2,6 +2,7 @@ package filestore
import
(
import
(
"fmt"
"fmt"
"sort"
"github.com/ipfs/go-ipfs/blocks/blockstore"
"github.com/ipfs/go-ipfs/blocks/blockstore"
pb
"github.com/ipfs/go-ipfs/filestore/pb"
pb
"github.com/ipfs/go-ipfs/filestore/pb"
...
@@ -89,7 +90,10 @@ func List(fs *Filestore, key *cid.Cid) *ListRes {
...
@@ -89,7 +90,10 @@ func List(fs *Filestore, key *cid.Cid) *ListRes {
// one by one each block in the Filestore's FileManager.
// one by one each block in the Filestore's FileManager.
// ListAll does not verify that the references are valid or whether
// ListAll does not verify that the references are valid or whether
// the raw data is accessible. See VerifyAll().
// the raw data is accessible. See VerifyAll().
func
ListAll
(
fs
*
Filestore
)
(
func
()
*
ListRes
,
error
)
{
func
ListAll
(
fs
*
Filestore
,
fileOrder
bool
)
(
func
()
*
ListRes
,
error
)
{
if
fileOrder
{
return
listAllFileOrder
(
fs
,
false
)
}
return
listAll
(
fs
,
false
)
return
listAll
(
fs
,
false
)
}
}
...
@@ -105,7 +109,10 @@ func Verify(fs *Filestore, key *cid.Cid) *ListRes {
...
@@ -105,7 +109,10 @@ func Verify(fs *Filestore, key *cid.Cid) *ListRes {
// returns one by one each block in the Filestore's FileManager.
// returns one by one each block in the Filestore's FileManager.
// VerifyAll checks that the reference is valid and that the block data
// VerifyAll checks that the reference is valid and that the block data
// can be read.
// can be read.
func
VerifyAll
(
fs
*
Filestore
)
(
func
()
*
ListRes
,
error
)
{
func
VerifyAll
(
fs
*
Filestore
,
fileOrder
bool
)
(
func
()
*
ListRes
,
error
)
{
if
fileOrder
{
return
listAllFileOrder
(
fs
,
true
)
}
return
listAll
(
fs
,
true
)
return
listAll
(
fs
,
true
)
}
}
...
@@ -158,6 +165,93 @@ func next(qr dsq.Results) (*cid.Cid, *pb.DataObj, error) {
...
@@ -158,6 +165,93 @@ func next(qr dsq.Results) (*cid.Cid, *pb.DataObj, error) {
return
c
,
dobj
,
nil
return
c
,
dobj
,
nil
}
}
func
listAllFileOrder
(
fs
*
Filestore
,
verify
bool
)
(
func
()
*
ListRes
,
error
)
{
q
:=
dsq
.
Query
{}
qr
,
err
:=
fs
.
fm
.
ds
.
Query
(
q
)
if
err
!=
nil
{
return
nil
,
err
}
var
entries
listEntries
for
{
v
,
ok
:=
qr
.
NextSync
()
if
!
ok
{
break
}
dobj
,
err
:=
unmarshalDataObj
(
v
.
Value
)
if
err
!=
nil
{
entries
=
append
(
entries
,
&
listEntry
{
dsKey
:
v
.
Key
,
err
:
err
,
})
}
else
{
entries
=
append
(
entries
,
&
listEntry
{
dsKey
:
v
.
Key
,
filePath
:
dobj
.
GetFilePath
(),
offset
:
dobj
.
GetOffset
(),
size
:
dobj
.
GetSize_
(),
})
}
}
sort
.
Sort
(
entries
)
i
:=
0
return
func
()
*
ListRes
{
if
i
>=
len
(
entries
)
{
return
nil
}
v
:=
entries
[
i
]
i
++
// attempt to convert the datastore key to a CID,
// store the error but don't use it yet
cid
,
keyErr
:=
dshelp
.
DsKeyToCid
(
ds
.
RawKey
(
v
.
dsKey
))
// first if they listRes already had an error return that error
if
v
.
err
!=
nil
{
return
mkListRes
(
cid
,
nil
,
v
.
err
)
}
// now reconstruct the DataObj
dobj
:=
pb
.
DataObj
{
FilePath
:
&
v
.
filePath
,
Offset
:
&
v
.
offset
,
Size_
:
&
v
.
size
,
}
// now if we could not convert the datastore key return that
// error
if
keyErr
!=
nil
{
return
mkListRes
(
cid
,
&
dobj
,
keyErr
)
}
// finally verify the dataobj if requested
var
err
error
if
verify
{
_
,
err
=
fs
.
fm
.
readDataObj
(
cid
,
&
dobj
)
}
return
mkListRes
(
cid
,
&
dobj
,
err
)
},
nil
}
type
listEntry
struct
{
filePath
string
offset
uint64
dsKey
string
size
uint64
err
error
}
type
listEntries
[]
*
listEntry
func
(
l
listEntries
)
Len
()
int
{
return
len
(
l
)
}
func
(
l
listEntries
)
Swap
(
i
,
j
int
)
{
l
[
i
],
l
[
j
]
=
l
[
j
],
l
[
i
]
}
func
(
l
listEntries
)
Less
(
i
,
j
int
)
bool
{
if
l
[
i
]
.
filePath
==
l
[
j
]
.
filePath
{
if
l
[
i
]
.
offset
==
l
[
j
]
.
offset
{
return
l
[
i
]
.
dsKey
<
l
[
j
]
.
dsKey
}
return
l
[
i
]
.
offset
<
l
[
j
]
.
offset
}
return
l
[
i
]
.
filePath
<
l
[
j
]
.
filePath
}
func
mkListRes
(
c
*
cid
.
Cid
,
d
*
pb
.
DataObj
,
err
error
)
*
ListRes
{
func
mkListRes
(
c
*
cid
.
Cid
,
d
*
pb
.
DataObj
,
err
error
)
*
ListRes
{
status
:=
StatusOk
status
:=
StatusOk
errorMsg
:=
""
errorMsg
:=
""
...
...
test/sharness/t0271-filestore-utils.sh
浏览文件 @
332a7967
...
@@ -37,28 +37,32 @@ test_init() {
...
@@ -37,28 +37,32 @@ test_init() {
EXPHASH
=
"QmRueCuPMYYvdxWz1vWncF7wzCScEx4qasZXo5aVBb1R4V"
EXPHASH
=
"QmRueCuPMYYvdxWz1vWncF7wzCScEx4qasZXo5aVBb1R4V"
cat
<<
EOF
> ls_expect
cat
<<
EOF
> ls_expect_file_order
zb2rhaPkR7ZF9BzSC2BfqbcGivi9QMdauermW9YB6NvS7FZMo 10000 somedir/file2 0
zb2rhav4wcdvNXtaKDTWHYAqtUHMEpygT1cxqMsfK7QrDuHxH 262144 somedir/file3 524288
zb2rhbcZ3aUXYcrbhhDH1JyrpDcpdw1KFJ5Xs5covjnvMpxDR 1000 somedir/file1 0
zb2rhbcZ3aUXYcrbhhDH1JyrpDcpdw1KFJ5Xs5covjnvMpxDR 1000 somedir/file1 0
zb2rhaPkR7ZF9BzSC2BfqbcGivi9QMdauermW9YB6NvS7FZMo 10000 somedir/file2 0
zb2rhe28UqCDm7TFib7PRyQYEkvuq8iahcXA2AbgaxCLvNhfk 262144 somedir/file3 0
zb2rhe28UqCDm7TFib7PRyQYEkvuq8iahcXA2AbgaxCLvNhfk 262144 somedir/file3 0
zb2rhebtyTTuHKyTbJPnkDUSruU5Uma4DN8t2EkvYZ6fP36mm 262144 somedir/file3 262144
zb2rhebtyTTuHKyTbJPnkDUSruU5Uma4DN8t2EkvYZ6fP36mm 262144 somedir/file3 262144
zb2rhav4wcdvNXtaKDTWHYAqtUHMEpygT1cxqMsfK7QrDuHxH 262144 somedir/file3 524288
zb2rhm9VTrX2mfatggYUk8mHLz78XBxVUTTzLvM2N3d6frdAU 213568 somedir/file3 786432
zb2rhm9VTrX2mfatggYUk8mHLz78XBxVUTTzLvM2N3d6frdAU 213568 somedir/file3 786432
EOF
EOF
sort < ls_expect_file_order
>
ls_expect_key_order
FILE1_HASH
=
zb2rhbcZ3aUXYcrbhhDH1JyrpDcpdw1KFJ5Xs5covjnvMpxDR
FILE1_HASH
=
zb2rhbcZ3aUXYcrbhhDH1JyrpDcpdw1KFJ5Xs5covjnvMpxDR
FILE2_HASH
=
zb2rhaPkR7ZF9BzSC2BfqbcGivi9QMdauermW9YB6NvS7FZMo
FILE2_HASH
=
zb2rhaPkR7ZF9BzSC2BfqbcGivi9QMdauermW9YB6NvS7FZMo
FILE3_HASH
=
QmfE4SDQazxTD7u8VTYs9AJqQL8rrJPUAorLeJXKSZrVf9
FILE3_HASH
=
QmfE4SDQazxTD7u8VTYs9AJqQL8rrJPUAorLeJXKSZrVf9
cat
<<
EOF
> verify_expect
cat
<<
EOF
> verify_expect_file_order
ok zb2rhaPkR7ZF9BzSC2BfqbcGivi9QMdauermW9YB6NvS7FZMo 10000 somedir/file2 0
ok zb2rhav4wcdvNXtaKDTWHYAqtUHMEpygT1cxqMsfK7QrDuHxH 262144 somedir/file3 524288
ok zb2rhbcZ3aUXYcrbhhDH1JyrpDcpdw1KFJ5Xs5covjnvMpxDR 1000 somedir/file1 0
ok zb2rhbcZ3aUXYcrbhhDH1JyrpDcpdw1KFJ5Xs5covjnvMpxDR 1000 somedir/file1 0
ok zb2rhaPkR7ZF9BzSC2BfqbcGivi9QMdauermW9YB6NvS7FZMo 10000 somedir/file2 0
ok zb2rhe28UqCDm7TFib7PRyQYEkvuq8iahcXA2AbgaxCLvNhfk 262144 somedir/file3 0
ok zb2rhe28UqCDm7TFib7PRyQYEkvuq8iahcXA2AbgaxCLvNhfk 262144 somedir/file3 0
ok zb2rhebtyTTuHKyTbJPnkDUSruU5Uma4DN8t2EkvYZ6fP36mm 262144 somedir/file3 262144
ok zb2rhebtyTTuHKyTbJPnkDUSruU5Uma4DN8t2EkvYZ6fP36mm 262144 somedir/file3 262144
ok zb2rhav4wcdvNXtaKDTWHYAqtUHMEpygT1cxqMsfK7QrDuHxH 262144 somedir/file3 524288
ok zb2rhm9VTrX2mfatggYUk8mHLz78XBxVUTTzLvM2N3d6frdAU 213568 somedir/file3 786432
ok zb2rhm9VTrX2mfatggYUk8mHLz78XBxVUTTzLvM2N3d6frdAU 213568 somedir/file3 786432
EOF
EOF
sort < verify_expect_file_order
>
verify_expect_key_order
test_filestore_adds
()
{
test_filestore_adds
()
{
test_expect_success
"nocopy add succeeds"
'
test_expect_success
"nocopy add succeeds"
'
HASH=$(ipfs add --raw-leaves --nocopy -r -q somedir | tail -n1)
HASH=$(ipfs add --raw-leaves --nocopy -r -q somedir | tail -n1)
...
@@ -70,7 +74,12 @@ test_filestore_adds() {
...
@@ -70,7 +74,12 @@ test_filestore_adds() {
test_expect_success
"'ipfs filestore ls' output looks good'"
'
test_expect_success
"'ipfs filestore ls' output looks good'"
'
ipfs filestore ls | sort > ls_actual &&
ipfs filestore ls | sort > ls_actual &&
test_cmp ls_expect ls_actual
test_cmp ls_expect_key_order ls_actual
'
test_expect_success
"'ipfs filestore ls --file-order' output looks good'"
'
ipfs filestore ls --file-order > ls_actual &&
test_cmp ls_expect_file_order ls_actual
'
'
test_expect_success
"'ipfs filestore ls HASH' works"
'
test_expect_success
"'ipfs filestore ls HASH' works"
'
...
@@ -88,13 +97,18 @@ test_filestore_adds() {
...
@@ -88,13 +97,18 @@ test_filestore_adds() {
test_filestore_state
()
{
test_filestore_state
()
{
test_expect_success
"ipfs filestore verify' output looks good'"
'
test_expect_success
"ipfs filestore verify' output looks good'"
'
ipfs filestore verify | LC_ALL=C sort > verify_actual
ipfs filestore verify | LC_ALL=C sort > verify_actual
test_cmp verify_expect verify_actual
test_cmp verify_expect
_key_order
verify_actual
'
'
}
}
test_filestore_verify
()
{
test_filestore_verify
()
{
test_filestore_state
test_filestore_state
test_expect_success
"ipfs filestore verify --file-order' output looks good'"
'
ipfs filestore verify --file-order > verify_actual
test_cmp verify_expect_file_order verify_actual
'
test_expect_success
"'ipfs filestore verify HASH' works"
'
test_expect_success
"'ipfs filestore verify HASH' works"
'
ipfs filestore verify $FILE1_HASH > verify_actual &&
ipfs filestore verify $FILE1_HASH > verify_actual &&
grep -q somedir/file1 verify_actual
grep -q somedir/file1 verify_actual
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论