update to new flatfs code
License: MIT Signed-off-by: Jeromy <jeromyj@gmail.com>
Jeromy committed
Dec 14, 2015 at 10:00 UTC
b76dd79fa2c1614b8a37cccc4b05deb4d5b1b03c
2 files changed
+27
-45
Godeps/Godeps.json
+2
-2
@@ -1,6 +1,6 @@
1
{
2
"ImportPath": "github.com/ipfs/go-ipfs",
3
- "GoVersion": "go1.5.1",
3
+ "GoVersion": "go1.5.2",
4
"Packages": [
5
"./..."
6
],
@@ -166,7 +166,7 @@
166
},
167
{
168
"ImportPath": "github.com/jbenet/go-datastore",
169
- "Rev": "bec407bccea1cfaf56ee946e947642e3ac5a9258"
169
+ "Rev": "19e39c85262aa4c796b26346f3e1937711ffe2bf"
170
},
171
{
172
"ImportPath": "github.com/jbenet/go-detect-race",
Godeps/_workspace/src/github.com/jbenet/go-datastore/flatfs/flatfs.go
+25
-43
@@ -9,6 +9,7 @@ import (
9
"io/ioutil"
10
"os"
11
"path"
12
+ "path/filepath"
13
"strings"
14
"time"
15
@@ -314,52 +315,33 @@ func (fs *Datastore) Query(q query.Query) (query.Results, error) {
315
return nil, errors.New("flatfs only supports listing all keys in random order")
316
}
317
317
- // TODO this dumb implementation gathers all keys into a single slice.
318
- root, err := os.Open(fs.path)
319
- if err != nil {
320
- return nil, err
321
- }
322
- defer root.Close()
318
+ reschan := make(chan query.Result)
319
+ go func() {
320
+ defer close(reschan)
321
+ err := filepath.Walk(fs.path, func(path string, info os.FileInfo, err error) error {
322
324
- var res []query.Entry
325
- prefixes, err := root.Readdir(0)
326
- if err != nil {
327
- return nil, err
328
- }
329
- for _, fi := range prefixes {
330
- var err error
331
- res, err = fs.enumerateKeys(fi, res)
332
- if err != nil {
333
- return nil, err
334
- }
335
- }
336
- return query.ResultsWithEntries(q, res), nil
337
-}
323
+ if !info.Mode().IsRegular() || info.Name()[0] == '.' {
324
+ return nil
325
+ }
326
339
-func (fs *Datastore) enumerateKeys(fi os.FileInfo, res []query.Entry) ([]query.Entry, error) {
340
- if !fi.IsDir() || fi.Name()[0] == '.' {
341
- return res, nil
342
- }
343
- child, err := os.Open(path.Join(fs.path, fi.Name()))
344
- if err != nil {
345
- return nil, err
346
- }
347
- defer child.Close()
348
- objs, err := child.Readdir(0)
349
- if err != nil {
350
- return nil, err
351
- }
352
- for _, fi := range objs {
353
- if !fi.Mode().IsRegular() || fi.Name()[0] == '.' {
354
- return res, nil
355
- }
356
- key, ok := fs.decode(fi.Name())
357
- if !ok {
358
- return res, nil
327
+ key, ok := fs.decode(info.Name())
328
+ if !ok {
329
+ log.Warning("failed to decode entry in flatfs")
330
+ return nil
331
+ }
332
+
333
+ reschan <- query.Result{
334
+ Entry: query.Entry{
335
+ Key: key.String(),
336
+ },
337
+ }
338
+ return nil
339
+ })
340
+ if err != nil {
341
+ log.Warning("walk failed: ", err)
342
}
360
- res = append(res, query.Entry{Key: key.String()})
361
- }
362
- return res, nil
343
+ }()
344
+ return query.ResultsWithChan(q, reschan), nil
345
}
346
347
func (fs *Datastore) Close() error {