Commit 6ad200e8 authored by Jeromy Johnson's avatar Jeromy Johnson

Merge pull request #1951 from ipfs/fix/api-check-timeout

add another error to the isConnRefused check
parents 0b3e0373 a23609fc
...@@ -6,6 +6,8 @@ import ( ...@@ -6,6 +6,8 @@ import (
"fmt" "fmt"
"io" "io"
"math/rand" "math/rand"
"net"
"net/url"
"os" "os"
"os/signal" "os/signal"
"runtime" "runtime"
...@@ -671,6 +673,15 @@ func apiClientForAddr(addr ma.Multiaddr) (cmdsHttp.Client, error) { ...@@ -671,6 +673,15 @@ func apiClientForAddr(addr ma.Multiaddr) (cmdsHttp.Client, error) {
} }
func isConnRefused(err error) bool { func isConnRefused(err error) bool {
return strings.Contains(err.Error(), "connection refused") || // unwrap url errors from http calls
strings.Contains(err.Error(), "target machine actively refused it") if urlerr, ok := err.(*url.Error); ok {
err = urlerr.Err
}
netoperr, ok := err.(*net.OpError)
if !ok {
return false
}
return netoperr.Op == "dial"
} }
...@@ -5,7 +5,7 @@ import ( ...@@ -5,7 +5,7 @@ import (
"fmt" "fmt"
"io" "io"
"os" "os"
"path" "path/filepath"
"strconv" "strconv"
"strings" "strings"
"sync" "sync"
...@@ -26,8 +26,11 @@ import ( ...@@ -26,8 +26,11 @@ import (
u "github.com/ipfs/go-ipfs/util" u "github.com/ipfs/go-ipfs/util"
util "github.com/ipfs/go-ipfs/util" util "github.com/ipfs/go-ipfs/util"
ds2 "github.com/ipfs/go-ipfs/util/datastore2" ds2 "github.com/ipfs/go-ipfs/util/datastore2"
logging "github.com/ipfs/go-ipfs/vendor/QmQg1J6vikuXF9oDvm4wpdeAUvvkVEKW1EYDw9HhTMnP2b/go-log"
) )
var log = logging.Logger("fsrepo")
// version number that we are currently expecting to see // version number that we are currently expecting to see
var RepoVersion = "2" var RepoVersion = "2"
...@@ -163,7 +166,7 @@ func open(repoPath string) (repo.Repo, error) { ...@@ -163,7 +166,7 @@ func open(repoPath string) (repo.Repo, error) {
} }
func newFSRepo(rpath string) (*FSRepo, error) { func newFSRepo(rpath string) (*FSRepo, error) {
expPath, err := u.TildeExpansion(path.Clean(rpath)) expPath, err := u.TildeExpansion(filepath.Clean(rpath))
if err != nil { if err != nil {
return nil, err return nil, err
} }
...@@ -247,17 +250,17 @@ func Init(repoPath string, conf *config.Config) error { ...@@ -247,17 +250,17 @@ func Init(repoPath string, conf *config.Config) error {
// The actual datastore contents are initialized lazily when Opened. // The actual datastore contents are initialized lazily when Opened.
// During Init, we merely check that the directory is writeable. // During Init, we merely check that the directory is writeable.
leveldbPath := path.Join(repoPath, leveldbDirectory) leveldbPath := filepath.Join(repoPath, leveldbDirectory)
if err := dir.Writable(leveldbPath); err != nil { if err := dir.Writable(leveldbPath); err != nil {
return fmt.Errorf("datastore: %s", err) return fmt.Errorf("datastore: %s", err)
} }
flatfsPath := path.Join(repoPath, flatfsDirectory) flatfsPath := filepath.Join(repoPath, flatfsDirectory)
if err := dir.Writable(flatfsPath); err != nil { if err := dir.Writable(flatfsPath); err != nil {
return fmt.Errorf("datastore: %s", err) return fmt.Errorf("datastore: %s", err)
} }
if err := dir.Writable(path.Join(repoPath, "logs")); err != nil { if err := dir.Writable(filepath.Join(repoPath, "logs")); err != nil {
return err return err
} }
...@@ -270,14 +273,14 @@ func Init(repoPath string, conf *config.Config) error { ...@@ -270,14 +273,14 @@ func Init(repoPath string, conf *config.Config) error {
// Remove recursively removes the FSRepo at |path|. // Remove recursively removes the FSRepo at |path|.
func Remove(repoPath string) error { func Remove(repoPath string) error {
repoPath = path.Clean(repoPath) repoPath = filepath.Clean(repoPath)
return os.RemoveAll(repoPath) return os.RemoveAll(repoPath)
} }
// LockedByOtherProcess returns true if the FSRepo is locked by another // LockedByOtherProcess returns true if the FSRepo is locked by another
// process. If true, then the repo cannot be opened by this process. // process. If true, then the repo cannot be opened by this process.
func LockedByOtherProcess(repoPath string) (bool, error) { func LockedByOtherProcess(repoPath string) (bool, error) {
repoPath = path.Clean(repoPath) repoPath = filepath.Clean(repoPath)
// NB: the lock is only held when repos are Open // NB: the lock is only held when repos are Open
return lockfile.Locked(repoPath) return lockfile.Locked(repoPath)
} }
...@@ -287,8 +290,8 @@ func LockedByOtherProcess(repoPath string) (bool, error) { ...@@ -287,8 +290,8 @@ func LockedByOtherProcess(repoPath string) (bool, error) {
// process may read this file. modifying this file, therefore, should // process may read this file. modifying this file, therefore, should
// use "mv" to replace the whole file and avoid interleaved read/writes. // use "mv" to replace the whole file and avoid interleaved read/writes.
func APIAddr(repoPath string) (string, error) { func APIAddr(repoPath string) (string, error) {
repoPath = path.Clean(repoPath) repoPath = filepath.Clean(repoPath)
apiFilePath := path.Join(repoPath, apiFile) apiFilePath := filepath.Join(repoPath, apiFile)
// if there is no file, assume there is no api addr. // if there is no file, assume there is no api addr.
f, err := os.Open(apiFilePath) f, err := os.Open(apiFilePath)
...@@ -315,7 +318,7 @@ func APIAddr(repoPath string) (string, error) { ...@@ -315,7 +318,7 @@ func APIAddr(repoPath string) (string, error) {
// SetAPIAddr writes the API Addr to the /api file. // SetAPIAddr writes the API Addr to the /api file.
func (r *FSRepo) SetAPIAddr(addr string) error { func (r *FSRepo) SetAPIAddr(addr string) error {
f, err := os.Create(path.Join(r.path, apiFile)) f, err := os.Create(filepath.Join(r.path, apiFile))
if err != nil { if err != nil {
return err return err
} }
...@@ -341,7 +344,7 @@ func (r *FSRepo) openConfig() error { ...@@ -341,7 +344,7 @@ func (r *FSRepo) openConfig() error {
// openDatastore returns an error if the config file is not present. // openDatastore returns an error if the config file is not present.
func (r *FSRepo) openDatastore() error { func (r *FSRepo) openDatastore() error {
leveldbPath := path.Join(r.path, leveldbDirectory) leveldbPath := filepath.Join(r.path, leveldbDirectory)
var err error var err error
// save leveldb reference so it can be neatly closed afterward // save leveldb reference so it can be neatly closed afterward
leveldbDS, err := levelds.NewDatastore(leveldbPath, &levelds.Options{ leveldbDS, err := levelds.NewDatastore(leveldbPath, &levelds.Options{
...@@ -359,7 +362,7 @@ func (r *FSRepo) openDatastore() error { ...@@ -359,7 +362,7 @@ func (r *FSRepo) openDatastore() error {
// including "/" from datastore.Key and 2 bytes from multihash. To // including "/" from datastore.Key and 2 bytes from multihash. To
// reach a uniform 256-way split, we need approximately 4 bytes of // reach a uniform 256-way split, we need approximately 4 bytes of
// prefix. // prefix.
blocksDS, err := flatfs.New(path.Join(r.path, flatfsDirectory), 4) blocksDS, err := flatfs.New(filepath.Join(r.path, flatfsDirectory), 4)
if err != nil { if err != nil {
return errors.New("unable to open flatfs datastore") return errors.New("unable to open flatfs datastore")
} }
...@@ -410,6 +413,11 @@ func (r *FSRepo) Close() error { ...@@ -410,6 +413,11 @@ func (r *FSRepo) Close() error {
return err return err
} }
err := os.Remove(filepath.Join(r.path, apiFile))
if err != nil {
log.Warning("error removing api file: ", err)
}
// This code existed in the previous versions, but // This code existed in the previous versions, but
// EventlogComponent.Close was never called. Preserving here // EventlogComponent.Close was never called. Preserving here
// pending further discussion. // pending further discussion.
...@@ -600,7 +608,7 @@ func isInitializedUnsynced(repoPath string) bool { ...@@ -600,7 +608,7 @@ func isInitializedUnsynced(repoPath string) bool {
if !configIsInitialized(repoPath) { if !configIsInitialized(repoPath) {
return false return false
} }
if !util.FileExists(path.Join(repoPath, leveldbDirectory)) { if !util.FileExists(filepath.Join(repoPath, leveldbDirectory)) {
return false return false
} }
return true return true
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment