only fail interface setup if all addresses fail
License: MIT Signed-off-by: Jeromy <jeromyj@gmail.com>
Jeromy committed
Nov 9, 2015 at 00:14 UTC
94647ed8848ed91b1fce548829660194c8e9b804
2 files changed
+27
-6
p2p/net/swarm/swarm.go
+6
-1
@@ -114,7 +114,12 @@ func NewSwarm(ctx context.Context, listenAddrs []ma.Multiaddr,
114
prom.MustRegisterOrGet(peersTotal)
115
s.Notify((*metricsNotifiee)(s))
116
117
- return s, s.setupInterfaces(listenAddrs)
117
+ err = s.setupInterfaces(listenAddrs)
118
+ if err != nil {
119
+ return nil, err
120
+ }
121
+
122
+ return s, nil
123
}
124
125
func (s *Swarm) teardown() error {
p2p/net/swarm/swarm_listen.go
+21
-5
@@ -16,28 +16,44 @@ import (
16
17
// Open listeners and reuse-dialers for the given addresses
18
func (s *Swarm) setupInterfaces(addrs []ma.Multiaddr) error {
19
- for _, a := range addrs {
19
+ errs := make([]error, len(addrs))
20
+ var succeeded int
21
+ for i, a := range addrs {
22
tpt := s.transportForAddr(a)
23
if tpt == nil {
22
- return fmt.Errorf("no transport for address: %s", a)
24
+ errs[i] = fmt.Errorf("no transport for address: %s", a)
25
+ continue
26
}
27
28
d, err := tpt.Dialer(a, transport.TimeoutOpt(DialTimeout), transport.ReusePorts)
29
if err != nil {
27
- return err
30
+ errs[i] = err
31
+ continue
32
}
33
34
s.dialer.AddDialer(d)
35
36
list, err := tpt.Listen(a)
37
if err != nil {
34
- return err
38
+ errs[i] = err
39
+ continue
40
}
41
42
err = s.addListener(list)
43
if err != nil {
39
- return err
44
+ errs[i] = err
45
+ continue
46
}
47
+ succeeded++
48
+ }
49
+
50
+ for i, e := range errs {
51
+ if e != nil {
52
+ log.Warning("listen on %s failed: %s", addrs[i], errs[i])
53
+ }
54
+ }
55
+ if succeeded == 0 && len(addrs) > 0 {
56
+ return fmt.Errorf("failed to listen on any addresses: %s", errs)
57
}
58
59
return nil