extract and assign routable assign earlier on and add timeout

unspecified address should be calculated before use.
add a new timeout flag and add a timeout to TCP dial
This commit is contained in:
ognots 2020-07-23 15:29:23 -04:00 committed by Łukasz Magiera
parent 6fda21d717
commit ebe197b0a8

View File

@ -94,7 +94,7 @@ var runCmd = &cli.Command{
Flags: []cli.Flag{ Flags: []cli.Flag{
&cli.StringFlag{ &cli.StringFlag{
Name: "address", Name: "address",
Usage: "Locally reachable address", Usage: "locally reachable address",
Value: "0.0.0.0", Value: "0.0.0.0",
}, },
&cli.BoolFlag{ &cli.BoolFlag{
@ -116,6 +116,11 @@ var runCmd = &cli.Command{
Usage: "enable commit (32G sectors: all cores or GPUs, 128GiB Memory + 64GiB swap)", Usage: "enable commit (32G sectors: all cores or GPUs, 128GiB Memory + 64GiB swap)",
Value: true, Value: true,
}, },
&cli.StringFlag{
Name: "timeout",
Usage: "used when address is unspecified. must be a valid duration recognized by golang's time.ParseDuration function",
Value: "30m",
},
}, },
Action: func(cctx *cli.Context) error { Action: func(cctx *cli.Context) error {
if !cctx.Bool("enable-gpu-proving") { if !cctx.Bool("enable-gpu-proving") {
@ -257,7 +262,22 @@ var runCmd = &cli.Command{
} }
log.Info("Opening local storage; connecting to master") log.Info("Opening local storage; connecting to master")
const unspecifiedAddress = "0.0.0.0"
address := cctx.String("address") address := cctx.String("address")
addressSlice := strings.Split(address, ":")
if ip := net.ParseIP(addressSlice[0]); ip != nil {
if ip.String() == unspecifiedAddress {
timeout, err := time.ParseDuration(cctx.String("timeout"))
if err != nil {
return err
}
rip, err := extractRoutableIP(timeout)
if err != nil {
return err
}
address = rip + ":" + addressSlice[1]
}
}
localStore, err := stores.NewLocal(ctx, lr, nodeApi, []string{"http://" + address + "/remote"}) localStore, err := stores.NewLocal(ctx, lr, nodeApi, []string{"http://" + address + "/remote"})
if err != nil { if err != nil {
@ -326,18 +346,6 @@ var runCmd = &cli.Command{
log.Info("Waiting for tasks") log.Info("Waiting for tasks")
go func() { go func() {
const unspecifiedAddress = "0.0.0.0"
addressSlice := strings.Split(address, ":")
if ip := net.ParseIP(addressSlice[0]); ip != nil {
if ip.String() == unspecifiedAddress {
rip, err := extractRoutableIP()
if err != nil {
log.Error(err)
return
}
address = rip + ":" + addressSlice[1]
}
}
if err := nodeApi.WorkerConnect(ctx, "ws://"+address+"/rpc/v0"); err != nil { if err := nodeApi.WorkerConnect(ctx, "ws://"+address+"/rpc/v0"); err != nil {
log.Errorf("Registering worker failed: %+v", err) log.Errorf("Registering worker failed: %+v", err)
cancel() cancel()
@ -388,7 +396,7 @@ func watchMinerConn(ctx context.Context, cctx *cli.Context, nodeApi api.StorageM
}() }()
} }
func extractRoutableIP() (string, error) { func extractRoutableIP(timeout time.Duration) (string, error) {
minerMultiAddrKey := "MINER_API_INFO" minerMultiAddrKey := "MINER_API_INFO"
deprecatedMinerMultiAddrKey := "STORAGE_API_INFO" deprecatedMinerMultiAddrKey := "STORAGE_API_INFO"
env, ok := os.LookupEnv(minerMultiAddrKey) env, ok := os.LookupEnv(minerMultiAddrKey)
@ -396,12 +404,12 @@ func extractRoutableIP() (string, error) {
// TODO remove after deprecation period // TODO remove after deprecation period
env, ok = os.LookupEnv(deprecatedMinerMultiAddrKey) env, ok = os.LookupEnv(deprecatedMinerMultiAddrKey)
if ok { if ok {
log.Warnf("Use deprecation env(%s) value, please use env(%s) instead.", deprecatedMinerMultiAddrKey, minerMultiAddrKey) log.Warnf("Using a deprecated env(%s) value, please use env(%s) instead.", deprecatedMinerMultiAddrKey, minerMultiAddrKey)
} }
return "", xerrors.New("MINER_API_INFO environment variable required to extract IP") return "", xerrors.New("MINER_API_INFO environment variable required to extract IP")
} }
minerAddr := strings.Split(env, "/") minerAddr := strings.Split(env, "/")
conn, err := net.Dial("tcp", minerAddr[2]+":"+minerAddr[4]) conn, err := net.DialTimeout("tcp", minerAddr[2]+":"+minerAddr[4], timeout)
if err != nil { if err != nil {
return "", err return "", err
} }