Skip to content

Commit e4fd5e4

Browse files
committed
make sure nr mycelium have peers or fail to the public peers
1 parent ecfae1a commit e4fd5e4

File tree

3 files changed

+57
-15
lines changed

3 files changed

+57
-15
lines changed

pkg/network/mycelium/config.go

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,19 +15,27 @@ type NodeConfig struct {
1515
privateKey x25519.PrivateKey
1616
}
1717

18-
func (n *NodeConfig) FindPeers(ctx context.Context, filter ...Filter) error {
18+
func FindPeers(ctx context.Context, filter ...Filter) (Peers, error) {
1919
// fetching a peer list goes as this
2020
// - Always include the list of peers from
2121
peers, err := fetchZosMyList()
2222
if err != nil {
23-
return errors.Wrap(err, "failed to get zos public peer list")
23+
return nil, errors.Wrap(err, "failed to get zos public peer list")
2424
}
2525

2626
peers, err = peers.Ups(filter...)
2727
if err != nil {
28-
return errors.Wrap(err, "failed to filter out peer list")
28+
return nil, errors.Wrap(err, "failed to filter out peer list")
2929
}
3030

31+
return peers, nil
32+
}
33+
34+
func (n *NodeConfig) AssignPeers(ctx context.Context, filter ...Filter) error {
35+
peers, err := FindPeers(ctx, filter...)
36+
if err != nil {
37+
return err
38+
}
3139
n.Peers = peers
3240
return nil
3341
}

pkg/network/mycelium/mycelium.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ func EnsureMycelium(ctx context.Context, privateKey ed25519.PrivateKey, ns Mycel
131131
z := zinit.Default()
132132

133133
cfg := GenerateConfig(privateKey)
134-
if err := cfg.FindPeers(ctx, filter); err != nil {
134+
if err := cfg.AssignPeers(ctx, filter); err != nil {
135135
return nil, err
136136
}
137137

pkg/network/nr/net_resource.go

Lines changed: 45 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package nr
22

33
import (
44
"bytes"
5+
"context"
56
"crypto/md5"
67
"encoding/json"
78
"fmt"
@@ -13,9 +14,11 @@ import (
1314
"strings"
1415
"time"
1516

17+
"github.com/cenkalti/backoff/v3"
1618
"github.com/threefoldtech/zosbase/pkg/gridtypes/zos"
1719
"github.com/threefoldtech/zosbase/pkg/network/ifaceutil"
1820
"github.com/threefoldtech/zosbase/pkg/network/macvlan"
21+
"github.com/threefoldtech/zosbase/pkg/network/mycelium"
1922
"github.com/threefoldtech/zosbase/pkg/network/ndmz"
2023
"github.com/threefoldtech/zosbase/pkg/network/options"
2124
"github.com/threefoldtech/zosbase/pkg/network/tuntap"
@@ -309,19 +312,10 @@ func (nr *NetResource) SetMycelium() (err error) {
309312
"--peers",
310313
}
311314

312-
// set mycelium public addresses as the private peers
313-
mycNamespace, mycInterface := ndmz.DmzNamespace, ndmz.DmzPub4
314-
if namespace.Exists(publicNamespaceName) {
315-
mycNamespace = publicNamespaceName
316-
mycInterface = publicInterfaceName
317-
}
318-
319-
ips, err := baseifaceutil.GetIPsForIFace(mycInterface, mycNamespace)
315+
hostPeers, err := getMyceliumPeers()
320316
if err != nil {
321-
return errors.Wrap(err, "failed to get IPs for npub4")
317+
return err
322318
}
323-
324-
hostPeers := baseifaceutil.BuildMyceliumPeerURLs(ips)
325319
args = append(args, hostPeers...)
326320

327321
err = zinit.AddService(name, zinit.InitService{
@@ -334,6 +328,46 @@ func (nr *NetResource) SetMycelium() (err error) {
334328
return init.Monitor(name)
335329
}
336330

331+
// will keep retrying to get the host interface ips for a min, eventually will failback to the public peers
332+
func getMyceliumPeers() ([]string, error) {
333+
// set mycelium public addresses as the private peers
334+
mycNamespace, mycInterface := ndmz.DmzNamespace, ndmz.DmzPub4
335+
if namespace.Exists(publicNamespaceName) {
336+
mycNamespace = publicNamespaceName
337+
mycInterface = publicInterfaceName
338+
}
339+
340+
var ips []net.IPNet
341+
bo := backoff.NewExponentialBackOff()
342+
bo.MaxElapsedTime = time.Minute
343+
bo.MaxInterval = 10 * time.Second
344+
345+
err := backoff.Retry(func() error {
346+
ips, err := baseifaceutil.GetIPsForIFace(mycInterface, mycNamespace)
347+
if err != nil {
348+
return backoff.Permanent(errors.Wrap(err, "failed to get IPs"))
349+
}
350+
if len(ips) == 0 {
351+
return fmt.Errorf("no IPs available yet")
352+
}
353+
return nil
354+
}, bo)
355+
356+
var hostPeers []string
357+
if err != nil {
358+
log.Warn().Msg("failed to get IPs after 1 minute, falling back to public mycelium peers")
359+
peers, err := mycelium.FindPeers(context.Background(), nil)
360+
if err != nil {
361+
return nil, errors.Wrap(err, "failed to find public mycelium peers")
362+
}
363+
hostPeers = peers
364+
} else {
365+
hostPeers = baseifaceutil.BuildMyceliumPeerURLs(ips)
366+
}
367+
368+
return hostPeers, nil
369+
}
370+
337371
func (nr *NetResource) ensureMyceliumNetwork(keyFile string) error {
338372
// applies network configuration for this mycelium instance inside the proper namespace
339373
mycelium, err := nr.inspectMycelium(keyFile)

0 commit comments

Comments
 (0)