提交 c419a489 作者: Jeromy 提交者: Juan Batiz-Benet

make ipfs understand the new migration

上级 96a22c5b
...@@ -103,21 +103,16 @@ func daemonFunc(req cmds.Request, res cmds.Response) { ...@@ -103,21 +103,16 @@ func daemonFunc(req cmds.Request, res cmds.Response) {
} }
} }
// To ensure that IPFS has been initialized, fetch the config. Do this // acquire the repo lock _before_ constructing a node. we need to make
// _before_ acquiring the daemon lock so the user gets an appropriate error // sure we are permitted to access the resources (datastore, etc.)
// message. repo, err := fsrepo.Open(req.Context().ConfigRoot)
// NB: It's safe to read the config without the daemon lock, but not safe
// to write.
ctx := req.Context()
cfg, err := ctx.GetConfig()
if err != nil { if err != nil {
res.SetError(err, cmds.ErrNormal) res.SetError(err, cmds.ErrNormal)
return return
} }
// acquire the repo lock _before_ constructing a node. we need to make ctx := req.Context()
// sure we are permitted to access the resources (datastore, etc.) cfg, err := ctx.GetConfig()
repo, err := fsrepo.Open(req.Context().ConfigRoot)
if err != nil { if err != nil {
res.SetError(err, cmds.ErrNormal) res.SetError(err, cmds.ErrNormal)
return return
......
...@@ -4,10 +4,10 @@ import ( ...@@ -4,10 +4,10 @@ import (
"errors" "errors"
"fmt" "fmt"
"io" "io"
"io/ioutil"
"os" "os"
"path" "path"
"strconv" "strconv"
"strings"
"sync" "sync"
ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore"
...@@ -28,8 +28,13 @@ import ( ...@@ -28,8 +28,13 @@ import (
ds2 "github.com/ipfs/go-ipfs/util/datastore2" ds2 "github.com/ipfs/go-ipfs/util/datastore2"
) )
// version number that we are currently expecting to see
var RepoVersion = "2" var RepoVersion = "2"
var incorrectRepoFormat = "Repo has incorrect version: '%s'\nProgram version is: '%s'\nPlease run the appropriate migration tool before continuing"
var ErrNoVersion = errors.New("version check failed, no version file found, please run 0-to-1 migration tool.")
const ( const (
leveldbDirectory = "datastore" leveldbDirectory = "datastore"
flatfsDirectory = "blocks" flatfsDirectory = "blocks"
...@@ -87,13 +92,14 @@ func open(repoPath string) (repo.Repo, error) { ...@@ -87,13 +92,14 @@ func open(repoPath string) (repo.Repo, error) {
packageLock.Lock() packageLock.Lock()
defer packageLock.Unlock() defer packageLock.Unlock()
expPath, err := u.TildeExpansion(path.Clean(repoPath)) r, err := newFSRepo(repoPath)
if err != nil { if err != nil {
return nil, err return nil, err
} }
r := &FSRepo{ // Check if its initialized
path: expPath, if err := checkInitialized(r.path); err != nil {
return nil, err
} }
r.lockfile, err = lockfile.Lock(r.path) r.lockfile, err = lockfile.Lock(r.path)
...@@ -108,30 +114,20 @@ func open(repoPath string) (repo.Repo, error) { ...@@ -108,30 +114,20 @@ func open(repoPath string) (repo.Repo, error) {
} }
}() }()
if !isInitializedUnsynced(r.path) {
return nil, errors.New("ipfs not initialized, please run 'ipfs init'")
}
// Check version, and error out if not matching // Check version, and error out if not matching
ver, err := ioutil.ReadFile(path.Join(expPath, "version")) ver, err := mfsr.RepoPath(r.path).Version()
if err != nil { if err != nil {
if os.IsNotExist(err) { if os.IsNotExist(err) {
return nil, errors.New("version check failed, no version file found, please run 0-to-1 migration tool.") return nil, ErrNoVersion
} }
return nil, err return nil, err
} }
vers := string(ver)[:1] if ver != RepoVersion {
return nil, fmt.Errorf(incorrectRepoFormat, ver, RepoVersion)
if vers != RepoVersion {
return nil, fmt.Errorf("Repo has incorrect version: '%s'\nProgram version is: '%s'\nPlease run the appropriate migration tool before continuing",
vers, RepoVersion)
} }
// check repo path, then check all constituent parts. // check repo path, then check all constituent parts.
// TODO acquire repo lock
// TODO if err := initCheckDir(logpath); err != nil { // }
if err := dir.Writable(r.path); err != nil { if err := dir.Writable(r.path); err != nil {
return nil, err return nil, err
} }
...@@ -144,13 +140,33 @@ func open(repoPath string) (repo.Repo, error) { ...@@ -144,13 +140,33 @@ func open(repoPath string) (repo.Repo, error) {
return nil, err return nil, err
} }
// log.Debugf("writing eventlogs to ...", c.path) // setup eventlogger
configureEventLoggerAtRepoPath(r.config, r.path) configureEventLoggerAtRepoPath(r.config, r.path)
keepLocked = true keepLocked = true
return r, nil return r, nil
} }
func newFSRepo(rpath string) (*FSRepo, error) {
expPath, err := u.TildeExpansion(path.Clean(rpath))
if err != nil {
return nil, err
}
return &FSRepo{path: expPath}, nil
}
func checkInitialized(path string) error {
if !isInitializedUnsynced(path) {
alt := strings.Replace(path, ".ipfs", ".go-ipfs", 1)
if isInitializedUnsynced(alt) {
return debugerror.New("ipfs repo found in old '.go-ipfs' location, please run migration tool")
}
return debugerror.New("ipfs not initialized, please run 'ipfs init'")
}
return nil
}
// ConfigAt returns an error if the FSRepo at the given path is not // ConfigAt returns an error if the FSRepo at the given path is not
// initialized. This function allows callers to read the config file even when // initialized. This function allows callers to read the config file even when
// another process is running and holding the lock. // another process is running and holding the lock.
......
...@@ -124,7 +124,7 @@ func transferBlocksToFlatDB(repopath string) error { ...@@ -124,7 +124,7 @@ func transferBlocksToFlatDB(repopath string) error {
blockspath := path.Join(repopath, "blocks") blockspath := path.Join(repopath, "blocks")
err = os.Mkdir(blockspath, 0777) err = os.Mkdir(blockspath, 0777)
if err != nil { if err != nil && !os.IsExist(err) {
return err return err
} }
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论