提交 13de031b 作者: Jeromy

code cleanup and better naming of methods

上级 b9658f0c
......@@ -74,13 +74,23 @@ func verifyFile(t *testing.T, path string, data []byte) {
}
defer fi.Close()
out, err := ioutil.ReadAll(fi)
if err != nil {
t.Fatal(err)
}
buf := make([]byte, 1024)
offset := 0
for {
n, err := fi.Read(buf)
if err != nil {
t.Fatal(err)
}
if !bytes.Equal(buf[:n], data[offset:offset+n]) {
t.Fatal("Data not equal")
}
if !bytes.Equal(out, data) {
t.Fatal("Data not equal")
if n < len(buf) {
break
}
offset += n
}
}
......@@ -130,16 +140,23 @@ func setupIpnsTest(t *testing.T, node *core.IpfsNode) (*core.IpfsNode, *fstest.M
}
func TestIpnsLocalLink(t *testing.T) {
_, mnt := setupIpnsTest(t, nil)
nd, mnt := setupIpnsTest(t, nil)
defer mnt.Close()
name := mnt.Dir + "/local"
finfo, err := os.Stat(name)
_, err := os.Stat(name)
if err != nil {
t.Fatal(err)
}
linksto, err := os.Readlink(name)
if err != nil {
t.Fatal(err)
}
t.Log(finfo.Name())
if linksto != nd.Identity.Pretty() {
t.Fatal("Link invalid")
}
}
// Test writing a file and reading it back
......@@ -189,7 +206,7 @@ func TestFilePersistence(t *testing.T) {
}
}
func TestDeeperDirs(t *testing.T) {
func TestMultipleDirs(t *testing.T) {
node, mnt := setupIpnsTest(t, nil)
t.Log("make a top level dir")
......
......@@ -239,7 +239,9 @@ func (s *Directory) Lookup(ctx context.Context, name string) (fs.Node, error) {
case *nsfs.File:
return &File{fi: child}, nil
default:
panic("system has proven to be insane")
// NB: if this happens, we do not want to continue, unpredictable behaviour
// may occur.
panic("invalid type found under directory. programmer error.")
}
}
......@@ -272,42 +274,83 @@ func (dir *Directory) ReadDirAll(ctx context.Context) ([]fuse.Dirent, error) {
}
func (fi *File) Read(ctx context.Context, req *fuse.ReadRequest, resp *fuse.ReadResponse) error {
_, err := fi.fi.Seek(req.Offset, os.SEEK_SET)
if err != nil {
return err
}
errs := make(chan error, 1)
go func() {
_, err := fi.fi.Seek(req.Offset, os.SEEK_SET)
if err != nil {
errs <- err
return
}
fisize, err := fi.fi.Size()
if err != nil {
fisize, err := fi.fi.Size()
if err != nil {
errs <- err
return
}
readsize := min(req.Size, int(fisize-req.Offset))
n, err := io.ReadFull(fi.fi, resp.Data[:readsize])
resp.Data = resp.Data[:n]
errs <- err
}()
select {
case <-ctx.Done():
return ctx.Err()
case err := <-errs:
return err
}
readsize := min(req.Size, int(fisize-req.Offset))
n, err := io.ReadFull(fi.fi, resp.Data[:readsize])
resp.Data = resp.Data[:n]
return err // may be non-nil / not succeeded
}
func (fi *File) Write(ctx context.Context, req *fuse.WriteRequest, resp *fuse.WriteResponse) error {
wrote, err := fi.fi.WriteAt(req.Data, req.Offset)
if err != nil {
errs := make(chan error, 1)
go func() {
wrote, err := fi.fi.WriteAt(req.Data, req.Offset)
if err != nil {
errs <- err
}
resp.Size = wrote
errs <- nil
}()
select {
case err := <-errs:
return err
case <-ctx.Done():
return ctx.Err()
}
resp.Size = wrote
return nil
}
func (fi *File) Flush(ctx context.Context, req *fuse.FlushRequest) error {
return fi.fi.Close()
errs := make(chan error, 1)
go func() {
errs <- fi.fi.Close()
}()
select {
case err := <-errs:
return err
case <-ctx.Done():
return ctx.Err()
}
}
// Fsync flushes the content in the file to disk, but does not
// update the dag tree internally
func (fi *File) Fsync(ctx context.Context, req *fuse.FsyncRequest) error {
return fi.fi.Flush()
errs := make(chan error, 1)
go func() {
errs <- fi.fi.Sync()
}()
select {
case err := <-errs:
return err
case <-ctx.Done():
return ctx.Err()
}
}
func (fi *File) Forget() {
err := fi.fi.Flush()
err := fi.fi.Sync()
if err != nil {
log.Debug("Forget file error: ", err)
}
......
......@@ -57,7 +57,7 @@ func (fi *File) Close() error {
fi.Lock()
defer fi.Unlock()
if fi.hasChanges {
err := fi.mod.Flush()
err := fi.mod.Sync()
if err != nil {
return err
}
......@@ -80,11 +80,11 @@ func (fi *File) Close() error {
return nil
}
// Flush flushes the changes in the file to disk
func (fi *File) Flush() error {
// Sync flushes the changes in the file to disk
func (fi *File) Sync() error {
fi.Lock()
defer fi.Unlock()
return fi.mod.Flush()
return fi.mod.Sync()
}
// Seek implements io.Seeker
......
......@@ -80,7 +80,7 @@ func (dm *DagModifier) WriteAt(b []byte, offset int64) (int, error) {
}
}
err = dm.Flush()
err = dm.Sync()
if err != nil {
return 0, err
}
......@@ -133,7 +133,7 @@ func (dm *DagModifier) Write(b []byte) (int, error) {
}
dm.curWrOff += uint64(n)
if dm.wrBuf.Len() > writebufferSize {
err := dm.Flush()
err := dm.Sync()
if err != nil {
return n, err
}
......@@ -156,8 +156,8 @@ func (dm *DagModifier) Size() (int64, error) {
return int64(pbn.GetFilesize()), nil
}
// Flush writes changes to this dag to disk
func (dm *DagModifier) Flush() error {
// Sync writes changes to this dag to disk
func (dm *DagModifier) Sync() error {
// No buffer? Nothing to do
if dm.wrBuf == nil {
return nil
......@@ -315,7 +315,7 @@ func (dm *DagModifier) appendData(node *mdag.Node, blks <-chan []byte) (*mdag.No
// Read data from this dag starting at the current offset
func (dm *DagModifier) Read(b []byte) (int, error) {
err := dm.Flush()
err := dm.Sync()
if err != nil {
return 0, err
}
......@@ -347,7 +347,7 @@ func (dm *DagModifier) Read(b []byte) (int, error) {
// GetNode gets the modified DAG Node
func (dm *DagModifier) GetNode() (*mdag.Node, error) {
err := dm.Flush()
err := dm.Sync()
if err != nil {
return nil, err
}
......@@ -360,7 +360,7 @@ func (dm *DagModifier) HasChanges() bool {
}
func (dm *DagModifier) Seek(offset int64, whence int) (int64, error) {
err := dm.Flush()
err := dm.Sync()
if err != nil {
return 0, err
}
......@@ -389,7 +389,7 @@ func (dm *DagModifier) Seek(offset int64, whence int) (int64, error) {
}
func (dm *DagModifier) Truncate(size int64) error {
err := dm.Flush()
err := dm.Sync()
if err != nil {
return err
}
......
......@@ -246,7 +246,7 @@ func TestMultiWriteAndFlush(t *testing.T) {
if n != 1 {
t.Fatal("Somehow wrote the wrong number of bytes! (n != 1)")
}
err = dagmod.Flush()
err = dagmod.Sync()
if err != nil {
t.Fatal(err)
}
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论