@cryptotaxi247 / kubo / commits / b76dd79fa

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 {