Changeset 218 in code for trunk/user.go
- Timestamp:
- Apr 4, 2020, 3:33:09 PM (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/user.go
r215 r218 2 2 3 3 import ( 4 "fmt" 4 5 "sync" 5 6 "time" … … 15 16 } 16 17 18 type eventUpstreamConnectionError struct { 19 net *network 20 err error 21 } 22 17 23 type eventUpstreamConnected struct { 18 24 uc *upstreamConn … … 21 27 type eventUpstreamDisconnected struct { 22 28 uc *upstreamConn 29 } 30 31 type eventUpstreamError struct { 32 uc *upstreamConn 33 err error 23 34 } 24 35 … … 42 53 stopped chan struct{} 43 54 44 history map[string]uint64 55 history map[string]uint64 56 lastError error 45 57 46 58 lock sync.Mutex … … 56 68 history: make(map[string]uint64), 57 69 } 70 } 71 72 func (net *network) forEachDownstream(f func(*downstreamConn)) { 73 net.user.forEachDownstream(func(dc *downstreamConn) { 74 if dc.network != nil && dc.network != net { 75 return 76 } 77 f(dc) 78 }) 58 79 } 59 80 … … 78 99 if err != nil { 79 100 net.user.srv.Logger.Printf("failed to connect to upstream server %q: %v", net.Addr, err) 101 net.user.events <- eventUpstreamConnectionError{net, fmt.Errorf("failed to connect: %v", err)} 80 102 continue 81 103 } … … 84 106 if err := uc.runUntilRegistered(); err != nil { 85 107 uc.logger.Printf("failed to register: %v", err) 108 net.user.events <- eventUpstreamConnectionError{net, fmt.Errorf("failed to register: %v", err)} 86 109 uc.Close() 87 110 continue … … 91 114 if err := uc.readMessages(net.user.events); err != nil { 92 115 uc.logger.Printf("failed to handle messages: %v", err) 116 net.user.events <- eventUpstreamError{uc, fmt.Errorf("failed to handle messages: %v", err)} 93 117 } 94 118 uc.Close() … … 201 225 202 226 uc.updateAway() 227 228 uc.forEachDownstream(func(dc *downstreamConn) { 229 sendServiceNOTICE(dc, fmt.Sprintf("connected to %s", uc.network.Name)) 230 }) 231 uc.network.lastError = nil 203 232 case eventUpstreamDisconnected: 204 233 uc := e.uc … … 215 244 216 245 uc.endPendingLISTs(true) 246 247 if uc.network.lastError == nil { 248 uc.forEachDownstream(func(dc *downstreamConn) { 249 sendServiceNOTICE(dc, fmt.Sprintf("disconnected from %s", uc.network.Name)) 250 }) 251 } 252 case eventUpstreamConnectionError: 253 net := e.net 254 255 if net.lastError == nil || net.lastError.Error() != e.err.Error() { 256 net.forEachDownstream(func(dc *downstreamConn) { 257 sendServiceNOTICE(dc, fmt.Sprintf("failed connecting/registering to %s: %v", net.Name, e.err)) 258 }) 259 } 260 net.lastError = e.err 261 case eventUpstreamError: 262 uc := e.uc 263 264 uc.forEachDownstream(func(dc *downstreamConn) { 265 sendServiceNOTICE(dc, fmt.Sprintf("disconnected from %s: %v", uc.network.Name, e.err)) 266 }) 267 uc.network.lastError = e.err 217 268 case eventUpstreamMessage: 218 269 msg, uc := e.msg, e.uc
Note:
See TracChangeset
for help on using the changeset viewer.