code cleanup and better naming of methods
Jeromy committed
Mar 18, 2015 at 21:48 UTC
13de031b442f6699bafad49d330e05f3004b4ce1
5 files changed
+103
-43
fuse/ipns/ipns_test.go
+27
-10
@@ -74,13 +74,23 @@ func verifyFile(t *testing.T, path string, data []byte) {
74
}
75
defer fi.Close()
76
77
- out, err := ioutil.ReadAll(fi)
78
- if err != nil {
79
- t.Fatal(err)
80
- }
77
+ buf := make([]byte, 1024)
78
+ offset := 0
79
+ for {
80
+ n, err := fi.Read(buf)
81
+ if err != nil {
82
+ t.Fatal(err)
83
+ }
84
+
85
+ if !bytes.Equal(buf[:n], data[offset:offset+n]) {
86
+ t.Fatal("Data not equal")
87
+ }
88
82
- if !bytes.Equal(out, data) {
83
- t.Fatal("Data not equal")
89
+ if n < len(buf) {
90
+ break
91
+ }
92
+
93
+ offset += n
94
}
95
}
96
@@ -130,16 +140,23 @@ func setupIpnsTest(t *testing.T, node *core.IpfsNode) (*core.IpfsNode, *fstest.M
140
}
141
142
func TestIpnsLocalLink(t *testing.T) {
133
- _, mnt := setupIpnsTest(t, nil)
143
+ nd, mnt := setupIpnsTest(t, nil)
144
defer mnt.Close()
145
name := mnt.Dir + "/local"
146
137
- finfo, err := os.Stat(name)
147
+ _, err := os.Stat(name)
148
+ if err != nil {
149
+ t.Fatal(err)
150
+ }
151
+
152
+ linksto, err := os.Readlink(name)
153
if err != nil {
154
t.Fatal(err)
155
}
156
142
- t.Log(finfo.Name())
157
+ if linksto != nd.Identity.Pretty() {
158
+ t.Fatal("Link invalid")
159
+ }
160
}
161
162
// Test writing a file and reading it back
@@ -189,7 +206,7 @@ func TestFilePersistence(t *testing.T) {
206
}
207
}
208
192
-func TestDeeperDirs(t *testing.T) {
209
+func TestMultipleDirs(t *testing.T) {
210
node, mnt := setupIpnsTest(t, nil)
211
212
t.Log("make a top level dir")
fuse/ipns/ipns_unix.go
+63
-20
@@ -239,7 +239,9 @@ func (s *Directory) Lookup(ctx context.Context, name string) (fs.Node, error) {
239
case *nsfs.File:
240
return &File{fi: child}, nil
241
default:
242
- panic("system has proven to be insane")
242
+ // NB: if this happens, we do not want to continue, unpredictable behaviour
243
+ // may occur.
244
+ panic("invalid type found under directory. programmer error.")
245
}
246
}
247
@@ -272,42 +274,83 @@ func (dir *Directory) ReadDirAll(ctx context.Context) ([]fuse.Dirent, error) {
274
}
275
276
func (fi *File) Read(ctx context.Context, req *fuse.ReadRequest, resp *fuse.ReadResponse) error {
275
- _, err := fi.fi.Seek(req.Offset, os.SEEK_SET)
276
- if err != nil {
277
- return err
278
- }
277
+ errs := make(chan error, 1)
278
+ go func() {
279
+ _, err := fi.fi.Seek(req.Offset, os.SEEK_SET)
280
+ if err != nil {
281
+ errs <- err
282
+ return
283
+ }
284
280
- fisize, err := fi.fi.Size()
281
- if err != nil {
285
+ fisize, err := fi.fi.Size()
286
+ if err != nil {
287
+ errs <- err
288
+ return
289
+ }
290
+
291
+ readsize := min(req.Size, int(fisize-req.Offset))
292
+ n, err := io.ReadFull(fi.fi, resp.Data[:readsize])
293
+ resp.Data = resp.Data[:n]
294
+ errs <- err
295
+ }()
296
+
297
+ select {
298
+ case <-ctx.Done():
299
+ return ctx.Err()
300
+ case err := <-errs:
301
return err
302
}
284
-
285
- readsize := min(req.Size, int(fisize-req.Offset))
286
- n, err := io.ReadFull(fi.fi, resp.Data[:readsize])
287
- resp.Data = resp.Data[:n]
288
- return err // may be non-nil / not succeeded
303
}
304
305
func (fi *File) Write(ctx context.Context, req *fuse.WriteRequest, resp *fuse.WriteResponse) error {
292
- wrote, err := fi.fi.WriteAt(req.Data, req.Offset)
293
- if err != nil {
306
+ errs := make(chan error, 1)
307
+ go func() {
308
+ wrote, err := fi.fi.WriteAt(req.Data, req.Offset)
309
+ if err != nil {
310
+ errs <- err
311
+ }
312
+ resp.Size = wrote
313
+ errs <- nil
314
+ }()
315
+
316
+ select {
317
+ case err := <-errs:
318
return err
319
+ case <-ctx.Done():
320
+ return ctx.Err()
321
}
296
- resp.Size = wrote
297
-
298
- return nil
322
}
323
324
func (fi *File) Flush(ctx context.Context, req *fuse.FlushRequest) error {
302
- return fi.fi.Close()
325
+ errs := make(chan error, 1)
326
+ go func() {
327
+ errs <- fi.fi.Close()
328
+ }()
329
+ select {
330
+ case err := <-errs:
331
+ return err
332
+ case <-ctx.Done():
333
+ return ctx.Err()
334
+ }
335
}
336
337
+// Fsync flushes the content in the file to disk, but does not
338
+// update the dag tree internally
339
func (fi *File) Fsync(ctx context.Context, req *fuse.FsyncRequest) error {
306
- return fi.fi.Flush()
340
+ errs := make(chan error, 1)
341
+ go func() {
342
+ errs <- fi.fi.Sync()
343
+ }()
344
+ select {
345
+ case err := <-errs:
346
+ return err
347
+ case <-ctx.Done():
348
+ return ctx.Err()
349
+ }
350
}
351
352
func (fi *File) Forget() {
310
- err := fi.fi.Flush()
353
+ err := fi.fi.Sync()
354
if err != nil {
355
log.Debug("Forget file error: ", err)
356
}
ipnsfs/file.go
+4
-4
@@ -57,7 +57,7 @@ func (fi *File) Close() error {
57
fi.Lock()
58
defer fi.Unlock()
59
if fi.hasChanges {
60
- err := fi.mod.Flush()
60
+ err := fi.mod.Sync()
61
if err != nil {
62
return err
63
}
@@ -80,11 +80,11 @@ func (fi *File) Close() error {
80
return nil
81
}
82
83
-// Flush flushes the changes in the file to disk
84
-func (fi *File) Flush() error {
83
+// Sync flushes the changes in the file to disk
84
+func (fi *File) Sync() error {
85
fi.Lock()
86
defer fi.Unlock()
87
- return fi.mod.Flush()
87
+ return fi.mod.Sync()
88
}
89
90
// Seek implements io.Seeker
unixfs/mod/dagmodifier.go
+8
-8
@@ -80,7 +80,7 @@ func (dm *DagModifier) WriteAt(b []byte, offset int64) (int, error) {
80
}
81
}
82
83
- err = dm.Flush()
83
+ err = dm.Sync()
84
if err != nil {
85
return 0, err
86
}
@@ -133,7 +133,7 @@ func (dm *DagModifier) Write(b []byte) (int, error) {
133
}
134
dm.curWrOff += uint64(n)
135
if dm.wrBuf.Len() > writebufferSize {
136
- err := dm.Flush()
136
+ err := dm.Sync()
137
if err != nil {
138
return n, err
139
}
@@ -156,8 +156,8 @@ func (dm *DagModifier) Size() (int64, error) {
156
return int64(pbn.GetFilesize()), nil
157
}
158
159
-// Flush writes changes to this dag to disk
160
-func (dm *DagModifier) Flush() error {
159
+// Sync writes changes to this dag to disk
160
+func (dm *DagModifier) Sync() error {
161
// No buffer? Nothing to do
162
if dm.wrBuf == nil {
163
return nil
@@ -315,7 +315,7 @@ func (dm *DagModifier) appendData(node *mdag.Node, blks <-chan []byte) (*mdag.No
315
316
// Read data from this dag starting at the current offset
317
func (dm *DagModifier) Read(b []byte) (int, error) {
318
- err := dm.Flush()
318
+ err := dm.Sync()
319
if err != nil {
320
return 0, err
321
}
@@ -347,7 +347,7 @@ func (dm *DagModifier) Read(b []byte) (int, error) {
347
348
// GetNode gets the modified DAG Node
349
func (dm *DagModifier) GetNode() (*mdag.Node, error) {
350
- err := dm.Flush()
350
+ err := dm.Sync()
351
if err != nil {
352
return nil, err
353
}
@@ -360,7 +360,7 @@ func (dm *DagModifier) HasChanges() bool {
360
}
361
362
func (dm *DagModifier) Seek(offset int64, whence int) (int64, error) {
363
- err := dm.Flush()
363
+ err := dm.Sync()
364
if err != nil {
365
return 0, err
366
}
@@ -389,7 +389,7 @@ func (dm *DagModifier) Seek(offset int64, whence int) (int64, error) {
389
}
390
391
func (dm *DagModifier) Truncate(size int64) error {
392
- err := dm.Flush()
392
+ err := dm.Sync()
393
if err != nil {
394
return err
395
}
unixfs/mod/dagmodifier_test.go
+1
-1
@@ -246,7 +246,7 @@ func TestMultiWriteAndFlush(t *testing.T) {
246
if n != 1 {
247
t.Fatal("Somehow wrote the wrong number of bytes! (n != 1)")
248
}
249
- err = dagmod.Flush()
249
+ err = dagmod.Sync()
250
if err != nil {
251
t.Fatal(err)
252
}