Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
G
go-ipfs
概览
概览
详情
活动
周期分析
版本库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程表
图表
维基
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
jihao
go-ipfs
Commits
a8bfa947
提交
a8bfa947
authored
1月 29, 2015
作者:
Juan Batiz-Benet
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fuse/ipns: use Read() not ReadAll()
上级
c05b4f06
隐藏空白字符变更
内嵌
并排
正在显示
2 个修改的文件
包含
43 行增加
和
15 行删除
+43
-15
ipns_unix.go
fuse/ipns/ipns_unix.go
+40
-13
readonly_unix.go
fuse/readonly/readonly_unix.go
+3
-2
没有找到文件。
fuse/ipns/ipns_unix.go
浏览文件 @
a8bfa947
...
@@ -4,7 +4,7 @@ package ipns
...
@@ -4,7 +4,7 @@ package ipns
import
(
import
(
"errors"
"errors"
"io
/ioutil
"
"io"
"os"
"os"
"path/filepath"
"path/filepath"
"time"
"time"
...
@@ -13,6 +13,7 @@ import (
...
@@ -13,6 +13,7 @@ import (
fs
"github.com/jbenet/go-ipfs/Godeps/_workspace/src/bazil.org/fuse/fs"
fs
"github.com/jbenet/go-ipfs/Godeps/_workspace/src/bazil.org/fuse/fs"
"github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context"
"github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context"
proto
"github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto"
proto
"github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto"
eventlog
"github.com/jbenet/go-ipfs/thirdparty/eventlog"
core
"github.com/jbenet/go-ipfs/core"
core
"github.com/jbenet/go-ipfs/core"
chunk
"github.com/jbenet/go-ipfs/importer/chunk"
chunk
"github.com/jbenet/go-ipfs/importer/chunk"
...
@@ -24,11 +25,12 @@ import (
...
@@ -24,11 +25,12 @@ import (
uio
"github.com/jbenet/go-ipfs/unixfs/io"
uio
"github.com/jbenet/go-ipfs/unixfs/io"
ftpb
"github.com/jbenet/go-ipfs/unixfs/pb"
ftpb
"github.com/jbenet/go-ipfs/unixfs/pb"
u
"github.com/jbenet/go-ipfs/util"
u
"github.com/jbenet/go-ipfs/util"
lgbl
"github.com/jbenet/go-ipfs/util/eventlog/loggables"
)
)
const
IpnsReadonly
=
true
const
IpnsReadonly
=
true
var
log
=
u
.
Logger
(
"
ipns"
)
var
log
=
eventlog
.
Logger
(
"fuse/
ipns"
)
var
(
var
(
shortRepublishTimeout
=
time
.
Millisecond
*
5
shortRepublishTimeout
=
time
.
Millisecond
*
5
...
@@ -336,21 +338,46 @@ func (s *Node) ReadDir(intr fs.Intr) ([]fuse.Dirent, fuse.Error) {
...
@@ -336,21 +338,46 @@ func (s *Node) ReadDir(intr fs.Intr) ([]fuse.Dirent, fuse.Error) {
return
nil
,
fuse
.
ENOENT
return
nil
,
fuse
.
ENOENT
}
}
// ReadAll reads the object data as file data
func
(
s
*
Node
)
Read
(
req
*
fuse
.
ReadRequest
,
resp
*
fuse
.
ReadResponse
,
intr
fs
.
Intr
)
fuse
.
Error
{
func
(
s
*
Node
)
ReadAll
(
intr
fs
.
Intr
)
([]
byte
,
fuse
.
Error
)
{
// intr will be closed by fuse if the request is cancelled. turn this into a context.
log
.
Debugf
(
"ipns: ReadAll [%s]"
,
s
.
name
)
ctx
,
cancel
:=
context
.
WithCancel
(
context
.
TODO
())
r
,
err
:=
uio
.
NewDagReader
(
context
.
TODO
(),
s
.
Nd
,
s
.
Ipfs
.
DAG
)
defer
cancel
()
// make sure all operations we started close.
// we wait on intr and cancel our context if it closes.
go
func
()
{
select
{
case
<-
intr
:
// closed by fuse
cancel
()
// cancel our context
case
<-
ctx
.
Done
()
:
}
}()
k
,
err
:=
s
.
Nd
.
Key
()
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
err
return
err
}
}
// this is a terrible function... 'ReadAll'?
// what if i have a 6TB file? GG RAM.
// setup our logging event
b
,
err
:=
ioutil
.
ReadAll
(
r
)
lm
:=
make
(
lgbl
.
DeferredMap
)
lm
[
"fs"
]
=
"ipns"
lm
[
"key"
]
=
func
()
interface
{}
{
return
k
.
Pretty
()
}
lm
[
"req_offset"
]
=
req
.
Offset
lm
[
"req_size"
]
=
req
.
Size
defer
log
.
EventBegin
(
ctx
,
"fuseRead"
,
lm
)
.
Done
()
r
,
err
:=
uio
.
NewDagReader
(
ctx
,
s
.
Nd
,
s
.
Ipfs
.
DAG
)
if
err
!=
nil
{
if
err
!=
nil
{
log
.
Errorf
(
"[%s] Readall error: %s"
,
s
.
name
,
err
)
return
err
return
nil
,
err
}
o
,
err
:=
r
.
Seek
(
req
.
Offset
,
os
.
SEEK_SET
)
lm
[
"res_offset"
]
=
o
if
err
!=
nil
{
return
err
}
}
return
b
,
nil
n
,
err
:=
io
.
ReadFull
(
r
,
resp
.
Data
[
:
req
.
Size
])
resp
.
Data
=
resp
.
Data
[
:
n
]
lm
[
"res_size"
]
=
n
return
err
// may be non-nil / not succeeded
}
}
func
(
n
*
Node
)
Write
(
req
*
fuse
.
WriteRequest
,
resp
*
fuse
.
WriteResponse
,
intr
fs
.
Intr
)
fuse
.
Error
{
func
(
n
*
Node
)
Write
(
req
*
fuse
.
WriteRequest
,
resp
*
fuse
.
WriteResponse
,
intr
fs
.
Intr
)
fuse
.
Error
{
...
...
fuse/readonly/readonly_unix.go
浏览文件 @
a8bfa947
...
@@ -166,6 +166,7 @@ func (s *Node) Read(req *fuse.ReadRequest, resp *fuse.ReadResponse, intr fs.Intr
...
@@ -166,6 +166,7 @@ func (s *Node) Read(req *fuse.ReadRequest, resp *fuse.ReadResponse, intr fs.Intr
// setup our logging event
// setup our logging event
lm
:=
make
(
lgbl
.
DeferredMap
)
lm
:=
make
(
lgbl
.
DeferredMap
)
lm
[
"fs"
]
=
"ipfs"
lm
[
"key"
]
=
func
()
interface
{}
{
return
k
.
Pretty
()
}
lm
[
"key"
]
=
func
()
interface
{}
{
return
k
.
Pretty
()
}
lm
[
"req_offset"
]
=
req
.
Offset
lm
[
"req_offset"
]
=
req
.
Offset
lm
[
"req_size"
]
=
req
.
Size
lm
[
"req_size"
]
=
req
.
Size
...
@@ -176,12 +177,12 @@ func (s *Node) Read(req *fuse.ReadRequest, resp *fuse.ReadResponse, intr fs.Intr
...
@@ -176,12 +177,12 @@ func (s *Node) Read(req *fuse.ReadRequest, resp *fuse.ReadResponse, intr fs.Intr
return
err
return
err
}
}
o
,
err
:=
r
.
Seek
(
req
.
Offset
,
os
.
SEEK_SET
)
o
,
err
:=
r
.
Seek
(
req
.
Offset
,
os
.
SEEK_SET
)
lm
[
"re
q
_offset"
]
=
o
lm
[
"re
s
_offset"
]
=
o
if
err
!=
nil
{
if
err
!=
nil
{
return
err
return
err
}
}
n
,
err
:=
io
.
ReadFull
(
r
,
resp
.
Data
[
:
req
.
Size
])
n
,
err
:=
io
.
ReadFull
(
r
,
resp
.
Data
[
:
req
.
Size
])
resp
.
Data
=
resp
.
Data
[
:
n
]
resp
.
Data
=
resp
.
Data
[
:
n
]
lm
[
"re
q
_size"
]
=
n
lm
[
"re
s
_size"
]
=
n
return
err
// may be non-nil / not succeeded
return
err
// may be non-nil / not succeeded
}
}
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论