Follow: wait for IPFS to be running
This commit is contained in:
parent
ad7b57aec0
commit
6aef2e8648
|
@ -6,6 +6,7 @@ import (
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strings"
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/ipfs/go-cid"
|
"github.com/ipfs/go-cid"
|
||||||
ipfscluster "github.com/ipfs/ipfs-cluster"
|
ipfscluster "github.com/ipfs/ipfs-cluster"
|
||||||
|
@ -228,6 +229,13 @@ func runCmd(c *cli.Context) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
fmt.Printf("Starting the IPFS Cluster follower peer for \"%s\".\nCTRL-C to stop it.\n", clusterName)
|
fmt.Printf("Starting the IPFS Cluster follower peer for \"%s\".\nCTRL-C to stop it.\n", clusterName)
|
||||||
|
fmt.Println("Checking if IPFS is online (will wait for 2 minutes)...")
|
||||||
|
ctxIpfs, cancelIpfs := context.WithTimeout(context.Background(), 2*time.Minute)
|
||||||
|
defer cancelIpfs()
|
||||||
|
err := cmdutils.WaitForIPFS(ctxIpfs)
|
||||||
|
if err != nil {
|
||||||
|
return cli.Exit("timed out waiting for IPFS to be available", 1)
|
||||||
|
}
|
||||||
|
|
||||||
setLogLevels(logLevel) // set to "info" by default.
|
setLogLevels(logLevel) // set to "info" by default.
|
||||||
// Avoid API logs polluting the screen everytime we
|
// Avoid API logs polluting the screen everytime we
|
||||||
|
|
|
@ -9,11 +9,14 @@ import (
|
||||||
"os"
|
"os"
|
||||||
"os/signal"
|
"os/signal"
|
||||||
"syscall"
|
"syscall"
|
||||||
|
"time"
|
||||||
|
|
||||||
ipfscluster "github.com/ipfs/ipfs-cluster"
|
ipfscluster "github.com/ipfs/ipfs-cluster"
|
||||||
|
ipfshttp "github.com/ipfs/ipfs-cluster/ipfsconn/ipfshttp"
|
||||||
host "github.com/libp2p/go-libp2p-host"
|
host "github.com/libp2p/go-libp2p-host"
|
||||||
dht "github.com/libp2p/go-libp2p-kad-dht"
|
dht "github.com/libp2p/go-libp2p-kad-dht"
|
||||||
ma "github.com/multiformats/go-multiaddr"
|
ma "github.com/multiformats/go-multiaddr"
|
||||||
|
"github.com/pkg/errors"
|
||||||
)
|
)
|
||||||
|
|
||||||
// RandomizePorts replaces TCP and UDP ports with random, but valid port
|
// RandomizePorts replaces TCP and UDP ports with random, but valid port
|
||||||
|
@ -127,3 +130,53 @@ Note that this may corrupt the local cluster state.
|
||||||
func ErrorOut(m string, a ...interface{}) {
|
func ErrorOut(m string, a ...interface{}) {
|
||||||
fmt.Fprintf(os.Stderr, m, a...)
|
fmt.Fprintf(os.Stderr, m, a...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// WaitForIPFS hangs until IPFS API becomes available or the given context is
|
||||||
|
// cancelled. The IPFS API location is determined by the default ipfshttp
|
||||||
|
// component configuration and can be overriden using environment variables
|
||||||
|
// that affect that configuration. Note that we have to do this in the blind,
|
||||||
|
// since we want to wait for IPFS before we even fetch the IPFS component
|
||||||
|
// configuration (because the configuration might be hosted on IPFS itself)
|
||||||
|
func WaitForIPFS(ctx context.Context) error {
|
||||||
|
ipfshttpCfg := ipfshttp.Config{}
|
||||||
|
ipfshttpCfg.Default()
|
||||||
|
ipfshttpCfg.ApplyEnvVars()
|
||||||
|
ipfshttpCfg.ConnectSwarmsDelay = 0
|
||||||
|
ipfshttpCfg.Tracing = false
|
||||||
|
ipfscluster.SetFacilityLogLevel("ipfshttp", "critical")
|
||||||
|
defer ipfscluster.SetFacilityLogLevel("ipfshttp", "info")
|
||||||
|
ipfs, err := ipfshttp.NewConnector(&ipfshttpCfg)
|
||||||
|
if err != nil {
|
||||||
|
return errors.Wrap(err, "error creating an ipfshttp instance to wait for IPFS")
|
||||||
|
}
|
||||||
|
|
||||||
|
signalChan := make(chan os.Signal, 20)
|
||||||
|
signal.Notify(
|
||||||
|
signalChan,
|
||||||
|
syscall.SIGINT,
|
||||||
|
syscall.SIGTERM,
|
||||||
|
syscall.SIGHUP,
|
||||||
|
)
|
||||||
|
|
||||||
|
i := 0
|
||||||
|
for {
|
||||||
|
select {
|
||||||
|
case <-signalChan:
|
||||||
|
return errors.New("interrupted")
|
||||||
|
case <-ctx.Done():
|
||||||
|
return ctx.Err()
|
||||||
|
default:
|
||||||
|
if i%10 == 0 {
|
||||||
|
fmt.Printf("waiting for IPFS to become available on %s...\n", ipfshttpCfg.NodeAddr)
|
||||||
|
}
|
||||||
|
i++
|
||||||
|
time.Sleep(time.Second)
|
||||||
|
_, err := ipfs.ID(ctx)
|
||||||
|
if err == nil {
|
||||||
|
// sleep an extra second and quit
|
||||||
|
time.Sleep(time.Second)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user