Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
G
go-ipfs
概览
概览
详情
活动
周期分析
版本库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程表
图表
维基
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
jihao
go-ipfs
Commits
082393db
提交
082393db
authored
6月 01, 2016
作者:
Jeromy Johnson
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #2792 from ipfs-filestore/kevina/filestore-bits
Stable bits from Pull Request #2634
上级
a38ab167
9360f5ca
隐藏空白字符变更
内嵌
并排
正在显示
4 个修改的文件
包含
62 行增加
和
55 行删除
+62
-55
blocks.go
blocks/blocks.go
+10
-10
add.go
core/commands/add.go
+3
-1
add.go
core/coreunix/add.go
+47
-43
add_test.go
core/coreunix/add_test.go
+2
-1
没有找到文件。
blocks/blocks.go
浏览文件 @
082393db
...
...
@@ -20,47 +20,47 @@ type Block interface {
}
// Block is a singular block of data in ipfs
type
Raw
Block
struct
{
type
Basic
Block
struct
{
multihash
mh
.
Multihash
data
[]
byte
}
// NewBlock creates a Block object from opaque data. It will hash the data.
func
NewBlock
(
data
[]
byte
)
*
Raw
Block
{
return
&
Raw
Block
{
data
:
data
,
multihash
:
u
.
Hash
(
data
)}
func
NewBlock
(
data
[]
byte
)
*
Basic
Block
{
return
&
Basic
Block
{
data
:
data
,
multihash
:
u
.
Hash
(
data
)}
}
// NewBlockWithHash creates a new block when the hash of the data
// is already known, this is used to save time in situations where
// we are able to be confident that the data is correct
func
NewBlockWithHash
(
data
[]
byte
,
h
mh
.
Multihash
)
(
*
Raw
Block
,
error
)
{
func
NewBlockWithHash
(
data
[]
byte
,
h
mh
.
Multihash
)
(
*
Basic
Block
,
error
)
{
if
u
.
Debug
{
chk
:=
u
.
Hash
(
data
)
if
string
(
chk
)
!=
string
(
h
)
{
return
nil
,
errors
.
New
(
"Data did not match given hash!"
)
}
}
return
&
Raw
Block
{
data
:
data
,
multihash
:
h
},
nil
return
&
Basic
Block
{
data
:
data
,
multihash
:
h
},
nil
}
func
(
b
*
Raw
Block
)
Multihash
()
mh
.
Multihash
{
func
(
b
*
Basic
Block
)
Multihash
()
mh
.
Multihash
{
return
b
.
multihash
}
func
(
b
*
Raw
Block
)
Data
()
[]
byte
{
func
(
b
*
Basic
Block
)
Data
()
[]
byte
{
return
b
.
data
}
// Key returns the block's Multihash as a Key value.
func
(
b
*
Raw
Block
)
Key
()
key
.
Key
{
func
(
b
*
Basic
Block
)
Key
()
key
.
Key
{
return
key
.
Key
(
b
.
multihash
)
}
func
(
b
*
Raw
Block
)
String
()
string
{
func
(
b
*
Basic
Block
)
String
()
string
{
return
fmt
.
Sprintf
(
"[Block %s]"
,
b
.
Key
())
}
func
(
b
*
Raw
Block
)
Loggable
()
map
[
string
]
interface
{}
{
func
(
b
*
Basic
Block
)
Loggable
()
map
[
string
]
interface
{}
{
return
map
[
string
]
interface
{}{
"block"
:
b
.
Key
()
.
String
(),
}
...
...
core/commands/add.go
浏览文件 @
082393db
...
...
@@ -141,11 +141,13 @@ You can now refer to the added file in a gateway, like so:
outChan
:=
make
(
chan
interface
{},
8
)
res
.
SetOutput
((
<-
chan
interface
{})(
outChan
))
fileAdder
,
err
:=
coreunix
.
NewAdder
(
req
.
Context
(),
n
,
outChan
)
fileAdder
,
err
:=
coreunix
.
NewAdder
(
req
.
Context
(),
n
.
Pinning
,
n
.
Blockstore
,
n
.
DAG
)
if
err
!=
nil
{
res
.
SetError
(
err
,
cmds
.
ErrNormal
)
return
}
fileAdder
.
Out
=
outChan
fileAdder
.
Chunker
=
chunker
fileAdder
.
Progress
=
progress
fileAdder
.
Hidden
=
hidden
...
...
core/coreunix/add.go
浏览文件 @
082393db
...
...
@@ -67,42 +67,46 @@ type AddedObject struct {
Bytes
int64
`json:",omitempty"`
}
func
NewAdder
(
ctx
context
.
Context
,
n
*
core
.
IpfsNode
,
out
chan
interface
{}
)
(
*
Adder
,
error
)
{
mr
,
err
:=
mfs
.
NewRoot
(
ctx
,
n
.
DAG
,
newDirNode
(),
nil
)
func
NewAdder
(
ctx
context
.
Context
,
p
pin
.
Pinner
,
bs
bstore
.
GCBlockstore
,
ds
dag
.
DAGService
)
(
*
Adder
,
error
)
{
mr
,
err
:=
mfs
.
NewRoot
(
ctx
,
ds
,
newDirNode
(),
nil
)
if
err
!=
nil
{
return
nil
,
err
}
return
&
Adder
{
mr
:
mr
,
ctx
:
ctx
,
node
:
n
,
out
:
out
,
Progress
:
false
,
Hidden
:
true
,
Pin
:
true
,
Trickle
:
false
,
Wrap
:
false
,
Chunker
:
""
,
mr
:
mr
,
ctx
:
ctx
,
pinning
:
p
,
blockstore
:
bs
,
dagService
:
ds
,
Progress
:
false
,
Hidden
:
true
,
Pin
:
true
,
Trickle
:
false
,
Wrap
:
false
,
Chunker
:
""
,
},
nil
}
// Internal structure for holding the switches passed to the `add` call
type
Adder
struct
{
ctx
context
.
Context
node
*
core
.
IpfsNode
out
chan
interface
{}
Progress
bool
Hidden
bool
Pin
bool
Trickle
bool
Silent
bool
Wrap
bool
Chunker
string
root
*
dag
.
Node
mr
*
mfs
.
Root
unlocker
bs
.
Unlocker
tempRoot
key
.
Key
ctx
context
.
Context
pinning
pin
.
Pinner
blockstore
bstore
.
GCBlockstore
dagService
dag
.
DAGService
Out
chan
interface
{}
Progress
bool
Hidden
bool
Pin
bool
Trickle
bool
Silent
bool
Wrap
bool
Chunker
string
root
*
dag
.
Node
mr
*
mfs
.
Root
unlocker
bs
.
Unlocker
tempRoot
key
.
Key
}
// Perform the actual add & pin locally, outputting results to reader
...
...
@@ -114,12 +118,12 @@ func (adder Adder) add(reader io.Reader) (*dag.Node, error) {
if
adder
.
Trickle
{
return
importer
.
BuildTrickleDagFromReader
(
adder
.
node
.
DAG
,
adder
.
dagService
,
chnk
,
)
}
return
importer
.
BuildDagFromReader
(
adder
.
node
.
DAG
,
adder
.
dagService
,
chnk
,
)
}
...
...
@@ -137,7 +141,7 @@ func (adder *Adder) RootNode() (*dag.Node, error) {
// if not wrapping, AND one root file, use that hash as root.
if
!
adder
.
Wrap
&&
len
(
root
.
Links
)
==
1
{
root
,
err
=
root
.
Links
[
0
]
.
GetNode
(
adder
.
ctx
,
adder
.
node
.
DAG
)
root
,
err
=
root
.
Links
[
0
]
.
GetNode
(
adder
.
ctx
,
adder
.
dagService
)
if
err
!=
nil
{
return
nil
,
err
}
...
...
@@ -156,21 +160,21 @@ func (adder *Adder) PinRoot() error {
return
nil
}
rnk
,
err
:=
adder
.
node
.
DAG
.
Add
(
root
)
rnk
,
err
:=
adder
.
dagService
.
Add
(
root
)
if
err
!=
nil
{
return
err
}
if
adder
.
tempRoot
!=
""
{
err
:=
adder
.
node
.
P
inning
.
Unpin
(
adder
.
ctx
,
adder
.
tempRoot
,
true
)
err
:=
adder
.
p
inning
.
Unpin
(
adder
.
ctx
,
adder
.
tempRoot
,
true
)
if
err
!=
nil
{
return
err
}
adder
.
tempRoot
=
rnk
}
adder
.
node
.
P
inning
.
PinWithMode
(
rnk
,
pin
.
Recursive
)
return
adder
.
node
.
P
inning
.
Flush
()
adder
.
p
inning
.
PinWithMode
(
rnk
,
pin
.
Recursive
)
return
adder
.
p
inning
.
Flush
()
}
func
(
adder
*
Adder
)
Finalize
()
(
*
dag
.
Node
,
error
)
{
...
...
@@ -237,7 +241,7 @@ func (adder *Adder) outputDirs(path string, fs mfs.FSNode) error {
}
}
return
outputDagnode
(
adder
.
o
ut
,
path
,
nd
)
return
outputDagnode
(
adder
.
O
ut
,
path
,
nd
)
}
// Add builds a merkledag from the a reader, pinning all objects to the local
...
...
@@ -245,7 +249,7 @@ func (adder *Adder) outputDirs(path string, fs mfs.FSNode) error {
func
Add
(
n
*
core
.
IpfsNode
,
r
io
.
Reader
)
(
string
,
error
)
{
defer
n
.
Blockstore
.
PinLock
()
.
Unlock
()
fileAdder
,
err
:=
NewAdder
(
n
.
Context
(),
n
,
nil
)
fileAdder
,
err
:=
NewAdder
(
n
.
Context
(),
n
.
Pinning
,
n
.
Blockstore
,
n
.
DAG
)
if
err
!=
nil
{
return
""
,
err
}
...
...
@@ -277,7 +281,7 @@ func AddR(n *core.IpfsNode, root string) (key string, err error) {
}
defer
f
.
Close
()
fileAdder
,
err
:=
NewAdder
(
n
.
Context
(),
n
,
nil
)
fileAdder
,
err
:=
NewAdder
(
n
.
Context
(),
n
.
Pinning
,
n
.
Blockstore
,
n
.
DAG
)
if
err
!=
nil
{
return
""
,
err
}
...
...
@@ -306,7 +310,7 @@ func AddR(n *core.IpfsNode, root string) (key string, err error) {
// the directory, and and error if any.
func
AddWrapped
(
n
*
core
.
IpfsNode
,
r
io
.
Reader
,
filename
string
)
(
string
,
*
dag
.
Node
,
error
)
{
file
:=
files
.
NewReaderFile
(
filename
,
filename
,
ioutil
.
NopCloser
(
r
),
nil
)
fileAdder
,
err
:=
NewAdder
(
n
.
Context
(),
n
,
nil
)
fileAdder
,
err
:=
NewAdder
(
n
.
Context
(),
n
.
Pinning
,
n
.
Blockstore
,
n
.
DAG
)
if
err
!=
nil
{
return
""
,
nil
,
err
}
...
...
@@ -355,14 +359,14 @@ func (adder *Adder) addNode(node *dag.Node, path string) error {
}
if
!
adder
.
Silent
{
return
outputDagnode
(
adder
.
o
ut
,
path
,
node
)
return
outputDagnode
(
adder
.
O
ut
,
path
,
node
)
}
return
nil
}
// Add the given file while respecting the adder.
func
(
adder
*
Adder
)
AddFile
(
file
files
.
File
)
error
{
adder
.
unlocker
=
adder
.
node
.
B
lockstore
.
PinLock
()
adder
.
unlocker
=
adder
.
b
lockstore
.
PinLock
()
defer
func
()
{
adder
.
unlocker
.
Unlock
()
}()
...
...
@@ -388,7 +392,7 @@ func (adder *Adder) addFile(file files.File) error {
}
dagnode
:=
&
dag
.
Node
{
Data
:
sdata
}
_
,
err
=
adder
.
node
.
DAG
.
Add
(
dagnode
)
_
,
err
=
adder
.
dagService
.
Add
(
dagnode
)
if
err
!=
nil
{
return
err
}
...
...
@@ -401,7 +405,7 @@ func (adder *Adder) addFile(file files.File) error {
// progress updates to the client (over the output channel)
var
reader
io
.
Reader
=
file
if
adder
.
Progress
{
reader
=
&
progressReader
{
file
:
file
,
out
:
adder
.
o
ut
}
reader
=
&
progressReader
{
file
:
file
,
out
:
adder
.
O
ut
}
}
dagnode
,
err
:=
adder
.
add
(
reader
)
...
...
@@ -445,14 +449,14 @@ func (adder *Adder) addDir(dir files.File) error {
}
func
(
adder
*
Adder
)
maybePauseForGC
()
error
{
if
adder
.
node
.
B
lockstore
.
GCRequested
()
{
if
adder
.
b
lockstore
.
GCRequested
()
{
err
:=
adder
.
PinRoot
()
if
err
!=
nil
{
return
err
}
adder
.
unlocker
.
Unlock
()
adder
.
unlocker
=
adder
.
node
.
B
lockstore
.
PinLock
()
adder
.
unlocker
=
adder
.
b
lockstore
.
PinLock
()
}
return
nil
}
...
...
core/coreunix/add_test.go
浏览文件 @
082393db
...
...
@@ -54,10 +54,11 @@ func TestAddGCLive(t *testing.T) {
errs
:=
make
(
chan
error
)
out
:=
make
(
chan
interface
{})
adder
,
err
:=
NewAdder
(
context
.
Background
(),
node
,
out
)
adder
,
err
:=
NewAdder
(
context
.
Background
(),
node
.
Pinning
,
node
.
Blockstore
,
node
.
DAG
)
if
err
!=
nil
{
t
.
Fatal
(
err
)
}
adder
.
Out
=
out
dataa
:=
ioutil
.
NopCloser
(
bytes
.
NewBufferString
(
"testfileA"
))
rfa
:=
files
.
NewReaderFile
(
"a"
,
"a"
,
dataa
,
nil
)
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论