提交 71d72e25 作者: Jeromy Johnson 提交者: GitHub

Merge pull request #4007 from ipfs/feat/badger-ds

[WIP] Badger datastore
...@@ -459,10 +459,10 @@ ...@@ -459,10 +459,10 @@
"version": "1.1.8" "version": "1.1.8"
}, },
{ {
"author": "whyrusleeping", "author": "magik6k",
"hash": "QmWRCn8vruNAzHx8i6SAXinuheRitKEGu8c7m26stKvsYx", "hash": "QmRh9Udeo8qCe4XKCSA2NUunTZbFvbc5d44E5wTZPFf3Fg",
"name": "go-testutil", "name": "go-ds-badger",
"version": "1.1.11" "version": "0.2.1"
} }
], ],
"gxVersion": "0.10.0", "gxVersion": "0.10.0",
......
...@@ -41,4 +41,16 @@ var ConfigProfiles = map[string]func(*Config) error{ ...@@ -41,4 +41,16 @@ var ConfigProfiles = map[string]func(*Config) error{
c.Discovery.MDNS.Enabled = false c.Discovery.MDNS.Enabled = false
return nil return nil
}, },
"badgerds": func(c *Config) error {
c.Datastore.Spec = map[string]interface{}{
"type": "measure",
"prefix": "badger.datastore",
"child": map[string]interface{}{
"type": "badgerds",
"path": "badgerds",
"syncWrites": true,
},
}
return nil
},
} }
...@@ -4,16 +4,20 @@ import ( ...@@ -4,16 +4,20 @@ import (
"bytes" "bytes"
"encoding/json" "encoding/json"
"fmt" "fmt"
"os"
"path/filepath" "path/filepath"
"sort" "sort"
repo "github.com/ipfs/go-ipfs/repo" repo "github.com/ipfs/go-ipfs/repo"
levelds "gx/ipfs/QmPdvXuXWAR6gtxxqZw42RtSADMwz4ijVmYHGS542b6cMz/go-ds-leveldb"
measure "gx/ipfs/QmSb95iHExSSb47zpmyn5CyY5PZidVWSjyKyDqgYQrnKor/go-ds-measure" measure "gx/ipfs/QmSb95iHExSSb47zpmyn5CyY5PZidVWSjyKyDqgYQrnKor/go-ds-measure"
flatfs "gx/ipfs/QmUTshC2PP4ZDqkrFfDU4JGJFMWjYnunxPgkQ6ZCA2hGqh/go-ds-flatfs" flatfs "gx/ipfs/QmUTshC2PP4ZDqkrFfDU4JGJFMWjYnunxPgkQ6ZCA2hGqh/go-ds-flatfs"
ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore"
mount "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/syncmount" mount "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/syncmount"
levelds "gx/ipfs/QmPdvXuXWAR6gtxxqZw42RtSADMwz4ijVmYHGS542b6cMz/go-ds-leveldb"
badgerds "gx/ipfs/QmRh9Udeo8qCe4XKCSA2NUunTZbFvbc5d44E5wTZPFf3Fg/go-ds-badger"
ldbopts "gx/ipfs/QmbBhyDKsY4mbY6xsKt3qu9Y7FPvMJ6qbD8AMjYYvPRw1g/goleveldb/leveldb/opt" ldbopts "gx/ipfs/QmbBhyDKsY4mbY6xsKt3qu9Y7FPvMJ6qbD8AMjYYvPRw1g/goleveldb/leveldb/opt"
) )
...@@ -55,12 +59,13 @@ var datastores map[string]ConfigFromMap ...@@ -55,12 +59,13 @@ var datastores map[string]ConfigFromMap
func init() { func init() {
datastores = map[string]ConfigFromMap{ datastores = map[string]ConfigFromMap{
"mount": MountDatastoreConfig, "mount": MountDatastoreConfig,
"flatfs": FlatfsDatastoreConfig, "flatfs": FlatfsDatastoreConfig,
"levelds": LeveldsDatastoreConfig, "levelds": LeveldsDatastoreConfig,
"mem": MemDatastoreConfig, "badgerds": BadgerdsDatastoreConfig,
"log": LogDatastoreConfig, "mem": MemDatastoreConfig,
"measure": MeasureDatastoreConfig, "log": LogDatastoreConfig,
"measure": MeasureDatastoreConfig,
} }
} }
...@@ -333,3 +338,57 @@ func (c measureDatastoreConfig) Create(path string) (repo.Datastore, error) { ...@@ -333,3 +338,57 @@ func (c measureDatastoreConfig) Create(path string) (repo.Datastore, error) {
} }
return measure.New(c.prefix, child), nil return measure.New(c.prefix, child), nil
} }
type badgerdsDatastoreConfig struct {
path string
syncWrites bool
}
// BadgerdsDatastoreConfig returns a configuration stub for a badger datastore
// from the given parameters
func BadgerdsDatastoreConfig(params map[string]interface{}) (DatastoreConfig, error) {
var c badgerdsDatastoreConfig
var ok bool
c.path, ok = params["path"].(string)
if !ok {
return nil, fmt.Errorf("'path' field is missing or not string")
}
sw, ok := params["syncWrites"]
if !ok {
c.syncWrites = true
} else {
if swb, ok := sw.(bool); ok {
c.syncWrites = swb
} else {
return nil, fmt.Errorf("'syncWrites' field was not a boolean")
}
}
return &c, nil
}
func (c *badgerdsDatastoreConfig) DiskSpec() DiskSpec {
return map[string]interface{}{
"type": "badgerds",
"path": c.path,
}
}
func (c *badgerdsDatastoreConfig) Create(path string) (repo.Datastore, error) {
p := c.path
if !filepath.IsAbs(p) {
p = filepath.Join(path, p)
}
err := os.MkdirAll(p, 0755)
if err != nil {
return nil, err
}
defopts := badgerds.DefaultOptions
defopts.SyncWrites = c.syncWrites
return badgerds.NewDatastore(p, &defopts)
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论