@@ -19,9 +19,11 @@ import (
19
19
20
20
// Backend implements a ConcentratorD backend.
21
21
type Backend struct {
22
- eventSock zmq4.Socket
23
- commandSock zmq4.Socket
24
- commandMux sync.Mutex
22
+ eventSockCancel func ()
23
+ commandSockCancel func ()
24
+ eventSock zmq4.Socket
25
+ commandSock zmq4.Socket
26
+ commandMux sync.Mutex
25
27
26
28
downlinkTXAckChan chan gw.DownlinkTXAck
27
29
uplinkFrameChan chan gw.UplinkFrame
@@ -45,9 +47,6 @@ func NewBackend(conf config.Config) (*Backend, error) {
45
47
}).Info ("backend/concentratord: setting up backend" )
46
48
47
49
b := Backend {
48
- eventSock : zmq4 .NewSub (context .Background ()),
49
- commandSock : zmq4 .NewReq (context .Background ()),
50
-
51
50
downlinkTXAckChan : make (chan gw.DownlinkTXAck , 1 ),
52
51
uplinkFrameChan : make (chan gw.UplinkFrame , 1 ),
53
52
gatewayStatsChan : make (chan gw.GatewayStats , 1 ),
@@ -62,6 +61,12 @@ func NewBackend(conf config.Config) (*Backend, error) {
62
61
b .dialEventSockLoop ()
63
62
b .dialCommandSockLoop ()
64
63
64
+ var err error
65
+ b .gatewayID , err = b .getGatewayID ()
66
+ if err != nil {
67
+ return nil , errors .Wrap (err , "get gateway id error" )
68
+ }
69
+
65
70
b .subscribeEventChan <- events.Subscribe {Subscribe : true , GatewayID : b .gatewayID }
66
71
67
72
go b .eventLoop ()
@@ -70,6 +75,10 @@ func NewBackend(conf config.Config) (*Backend, error) {
70
75
}
71
76
72
77
func (b * Backend ) dialEventSock () error {
78
+ ctx := context .Background ()
79
+ ctx , b .eventSockCancel = context .WithCancel (ctx )
80
+
81
+ b .eventSock = zmq4 .NewSub (ctx )
73
82
err := b .eventSock .Dial (b .eventURL )
74
83
if err != nil {
75
84
return errors .Wrap (err , "dial event api url error" )
@@ -80,19 +89,26 @@ func (b *Backend) dialEventSock() error {
80
89
return errors .Wrap (err , "set event option error" )
81
90
}
82
91
92
+ log .WithFields (log.Fields {
93
+ "event_url" : b .eventURL ,
94
+ }).Info ("backend/concentratord: connected to event socket" )
95
+
83
96
return nil
84
97
}
85
98
86
99
func (b * Backend ) dialCommandSock () error {
100
+ ctx := context .Background ()
101
+ ctx , b .commandSockCancel = context .WithCancel (ctx )
102
+
103
+ b .commandSock = zmq4 .NewReq (ctx )
87
104
err := b .commandSock .Dial (b .commandURL )
88
105
if err != nil {
89
106
return errors .Wrap (err , "dial command api url error" )
90
107
}
91
108
92
- b .gatewayID , err = b .getGatewayID ()
93
- if err != nil {
94
- return errors .Wrap (err , "get gateway id error" )
95
- }
109
+ log .WithFields (log.Fields {
110
+ "command_url" : b .eventURL ,
111
+ }).Info ("backend/concentratord: connected to command socket" )
96
112
97
113
return nil
98
114
}
@@ -135,6 +151,11 @@ func (b *Backend) getGatewayID() (lorawan.EUI64, error) {
135
151
// Close closes the backend.
136
152
func (b * Backend ) Close () error {
137
153
b .eventSock .Close ()
154
+ b .commandSock .Close ()
155
+
156
+ b .eventSockCancel ()
157
+ b .commandSockCancel ()
158
+
138
159
return nil
139
160
}
140
161
@@ -223,12 +244,14 @@ func (b *Backend) commandRequest(command string, v proto.Message) ([]byte, error
223
244
224
245
msg := zmq4 .NewMsgFrom ([]byte (command ), bb )
225
246
if err = b .commandSock .SendMulti (msg ); err != nil {
247
+ b .commandSockCancel ()
226
248
b .dialCommandSock ()
227
249
return nil , errors .Wrap (err , "send command request error" )
228
250
}
229
251
230
252
reply , err := b .commandSock .Recv ()
231
253
if err != nil {
254
+ b .commandSockCancel ()
232
255
b .dialCommandSock ()
233
256
return nil , errors .Wrap (err , "receive command request reply error" )
234
257
}
@@ -241,7 +264,17 @@ func (b *Backend) eventLoop() {
241
264
msg , err := b .eventSock .Recv ()
242
265
if err != nil {
243
266
log .WithError (err ).Error ("backend/concentratord: receive event message error" )
244
- b .dialEventSockLoop ()
267
+
268
+ // We need to recover both the event and command sockets.
269
+ func () {
270
+ b .commandMux .Lock ()
271
+ defer b .commandMux .Unlock ()
272
+
273
+ b .eventSockCancel ()
274
+ b .commandSockCancel ()
275
+ b .dialEventSockLoop ()
276
+ b .dialCommandSockLoop ()
277
+ }()
245
278
continue
246
279
}
247
280
0 commit comments