mirror of
https://github.com/ipfs/kubo.git
synced 2025-09-09 23:42:20 +08:00
make ipfs understand the new migration
This commit is contained in:
@ -103,21 +103,16 @@ func daemonFunc(req cmds.Request, res cmds.Response) {
|
||||
}
|
||||
}
|
||||
|
||||
// To ensure that IPFS has been initialized, fetch the config. Do this
|
||||
// _before_ acquiring the daemon lock so the user gets an appropriate error
|
||||
// message.
|
||||
// NB: It's safe to read the config without the daemon lock, but not safe
|
||||
// to write.
|
||||
ctx := req.Context()
|
||||
cfg, err := ctx.GetConfig()
|
||||
// acquire the repo lock _before_ constructing a node. we need to make
|
||||
// sure we are permitted to access the resources (datastore, etc.)
|
||||
repo, err := fsrepo.Open(req.Context().ConfigRoot)
|
||||
if err != nil {
|
||||
res.SetError(err, cmds.ErrNormal)
|
||||
return
|
||||
}
|
||||
|
||||
// acquire the repo lock _before_ constructing a node. we need to make
|
||||
// sure we are permitted to access the resources (datastore, etc.)
|
||||
repo, err := fsrepo.Open(req.Context().ConfigRoot)
|
||||
ctx := req.Context()
|
||||
cfg, err := ctx.GetConfig()
|
||||
if err != nil {
|
||||
res.SetError(err, cmds.ErrNormal)
|
||||
return
|
||||
|
@ -4,10 +4,10 @@ import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"path"
|
||||
"strconv"
|
||||
"strings"
|
||||
"sync"
|
||||
|
||||
ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore"
|
||||
@ -28,8 +28,13 @@ import (
|
||||
ds2 "github.com/ipfs/go-ipfs/util/datastore2"
|
||||
)
|
||||
|
||||
// version number that we are currently expecting to see
|
||||
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 (
|
||||
leveldbDirectory = "datastore"
|
||||
flatfsDirectory = "blocks"
|
||||
@ -87,13 +92,14 @@ func open(repoPath string) (repo.Repo, error) {
|
||||
packageLock.Lock()
|
||||
defer packageLock.Unlock()
|
||||
|
||||
expPath, err := u.TildeExpansion(path.Clean(repoPath))
|
||||
r, err := newFSRepo(repoPath)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
r := &FSRepo{
|
||||
path: expPath,
|
||||
// Check if its initialized
|
||||
if err := checkInitialized(r.path); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
r.lockfile, err = lockfile.Lock(r.path)
|
||||
@ -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
|
||||
ver, err := ioutil.ReadFile(path.Join(expPath, "version"))
|
||||
ver, err := mfsr.RepoPath(r.path).Version()
|
||||
if err != nil {
|
||||
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
|
||||
}
|
||||
|
||||
vers := string(ver)[:1]
|
||||
|
||||
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)
|
||||
|
||||
if ver != RepoVersion {
|
||||
return nil, fmt.Errorf(incorrectRepoFormat, ver, RepoVersion)
|
||||
}
|
||||
|
||||
// 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 {
|
||||
return nil, err
|
||||
}
|
||||
@ -144,13 +140,33 @@ func open(repoPath string) (repo.Repo, error) {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// log.Debugf("writing eventlogs to ...", c.path)
|
||||
// setup eventlogger
|
||||
configureEventLoggerAtRepoPath(r.config, r.path)
|
||||
|
||||
keepLocked = true
|
||||
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
|
||||
// initialized. This function allows callers to read the config file even when
|
||||
// another process is running and holding the lock.
|
||||
|
@ -124,7 +124,7 @@ func transferBlocksToFlatDB(repopath string) error {
|
||||
|
||||
blockspath := path.Join(repopath, "blocks")
|
||||
err = os.Mkdir(blockspath, 0777)
|
||||
if err != nil {
|
||||
if err != nil && !os.IsExist(err) {
|
||||
return err
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user