@@ -11,7 +11,7 @@ import (
11
11
"github.com/sirupsen/logrus"
12
12
)
13
13
14
- type ListenFunc func (cfg config. ListenerConfig ) (l net.Listener , err error )
14
+ type ListenFunc func (cfg * ListenerConfig ) (l net.Listener , err error )
15
15
16
16
type Listeners struct {
17
17
// Source of new connections to Kafka broker.
@@ -25,13 +25,11 @@ type Listeners struct {
25
25
26
26
listenFunc ListenFunc
27
27
28
- deterministicListeners bool
29
28
disableDynamicListeners bool
30
29
dynamicSequentialMinPort int
31
30
32
- brokerToListenerConfig map [string ]config.ListenerConfig
33
- brokerIdToIdListenerConfig map [int32 ]config.IdListenerConfig
34
- lock sync.RWMutex
31
+ brokerToListenerConfig map [string ]* ListenerConfig
32
+ lock sync.RWMutex
35
33
}
36
34
37
35
func NewListeners (cfg * config.Config ) (* Listeners , error ) {
@@ -54,7 +52,7 @@ func NewListeners(cfg *config.Config) (*Listeners, error) {
54
52
}
55
53
}
56
54
57
- listenFunc := func (cfg config. ListenerConfig ) (net.Listener , error ) {
55
+ listenFunc := func (cfg * ListenerConfig ) (net.Listener , error ) {
58
56
if tlsConfig != nil {
59
57
return tls .Listen ("tcp" , cfg .ListenerAddress , tlsConfig )
60
58
}
@@ -66,34 +64,30 @@ func NewListeners(cfg *config.Config) (*Listeners, error) {
66
64
return nil , err
67
65
}
68
66
69
- brokerIdToIdListenerConfig := make (map [int32 ]config.IdListenerConfig )
70
-
71
67
return & Listeners {
72
- defaultListenerIP : defaultListenerIP ,
73
- dynamicAdvertisedListener : dynamicAdvertisedListener ,
74
- connSrc : make (chan Conn , 1 ),
75
- brokerToListenerConfig : brokerToListenerConfig ,
76
- brokerIdToIdListenerConfig : brokerIdToIdListenerConfig ,
77
- tcpConnOptions : tcpConnOptions ,
78
- listenFunc : listenFunc ,
79
- deterministicListeners : cfg .Proxy .DeterministicListeners ,
80
- disableDynamicListeners : cfg .Proxy .DisableDynamicListeners ,
81
- dynamicSequentialMinPort : cfg .Proxy .DynamicSequentialMinPort ,
68
+ defaultListenerIP : defaultListenerIP ,
69
+ dynamicAdvertisedListener : dynamicAdvertisedListener ,
70
+ connSrc : make (chan Conn , 1 ),
71
+ brokerToListenerConfig : brokerToListenerConfig ,
72
+ tcpConnOptions : tcpConnOptions ,
73
+ listenFunc : listenFunc ,
74
+ disableDynamicListeners : cfg .Proxy .DisableDynamicListeners ,
75
+ dynamicSequentialMinPort : cfg .Proxy .DynamicSequentialMinPort ,
82
76
}, nil
83
77
}
84
78
85
- func getBrokerToListenerConfig (cfg * config.Config ) (map [string ]config. ListenerConfig , error ) {
86
- brokerToListenerConfig := make (map [string ]config. ListenerConfig )
79
+ func getBrokerToListenerConfig (cfg * config.Config ) (map [string ]* ListenerConfig , error ) {
80
+ brokerToListenerConfig := make (map [string ]* ListenerConfig )
87
81
88
82
for _ , v := range cfg .Proxy .BootstrapServers {
89
83
if lc , ok := brokerToListenerConfig [v .BrokerAddress ]; ok {
90
84
if lc .ListenerAddress != v .ListenerAddress || lc .AdvertisedAddress != v .AdvertisedAddress {
91
- return nil , fmt .Errorf ("bootstrap server mapping %s configured twice: %v and %v" , v .BrokerAddress , v , lc )
85
+ return nil , fmt .Errorf ("bootstrap server mapping %s configured twice: %v and %v" , v .BrokerAddress , v , lc . ToListenerConfig () )
92
86
}
93
87
continue
94
88
}
95
89
logrus .Infof ("Bootstrap server %s advertised as %s" , v .BrokerAddress , v .AdvertisedAddress )
96
- brokerToListenerConfig [v .BrokerAddress ] = v
90
+ brokerToListenerConfig [v .BrokerAddress ] = FromListenerConfig ( v )
97
91
}
98
92
99
93
externalToListenerConfig := make (map [string ]config.ListenerConfig )
@@ -118,7 +112,7 @@ func getBrokerToListenerConfig(cfg *config.Config) (map[string]config.ListenerCo
118
112
continue
119
113
}
120
114
logrus .Infof ("External server %s advertised as %s" , v .BrokerAddress , v .AdvertisedAddress )
121
- brokerToListenerConfig [v .BrokerAddress ] = v
115
+ brokerToListenerConfig [v .BrokerAddress ] = FromListenerConfig ( v )
122
116
}
123
117
return brokerToListenerConfig , nil
124
118
}
@@ -132,26 +126,13 @@ func (p *Listeners) GetNetAddressMapping(brokerHost string, brokerPort int32, br
132
126
133
127
p .lock .RLock ()
134
128
listenerConfig , ok := p .brokerToListenerConfig [brokerAddress ]
135
- idListenerConfig , brokerIdFound := p .brokerIdToIdListenerConfig [brokerId ]
136
129
p .lock .RUnlock ()
137
130
138
131
if ok {
139
- logrus .Debugf ("Address mappings broker=%s, listener=%s, advertised=%s" , listenerConfig .BrokerAddress , listenerConfig .ListenerAddress , listenerConfig .AdvertisedAddress )
132
+ logrus .Debugf ("Address mappings broker=%s, listener=%s, advertised=%s, brokerId=%d " , listenerConfig .GetBrokerAddress () , listenerConfig .ListenerAddress , listenerConfig .AdvertisedAddress , brokerId )
140
133
return util .SplitHostPort (listenerConfig .AdvertisedAddress )
141
134
}
142
135
if ! p .disableDynamicListeners {
143
- if brokerIdFound {
144
- logrus .Infof ("Broker ID %d has a new advertised listener, closing existing dynamic listener" , brokerId )
145
- // Existing broker ID found, but with a different upstream broker
146
- // Close existing listener, remove two mappings:
147
- // * ID to removed upstream broker
148
- // * removed upstream broker
149
- idListenerConfig .Listener .Close ()
150
- p .lock .Lock ()
151
- delete (p .brokerIdToIdListenerConfig , brokerId )
152
- delete (p .brokerToListenerConfig , idListenerConfig .BrokerAddress )
153
- p .lock .Unlock ()
154
- }
155
136
logrus .Infof ("Starting dynamic listener for broker %s" , brokerAddress )
156
137
return p .ListenDynamicInstance (brokerAddress , brokerId )
157
138
}
@@ -166,18 +147,13 @@ func (p *Listeners) ListenDynamicInstance(brokerAddress string, brokerId int32)
166
147
return util .SplitHostPort (v .AdvertisedAddress )
167
148
}
168
149
169
- var defaultListenerAddress string
170
-
171
- if p .deterministicListeners {
172
- defaultListenerAddress = net .JoinHostPort (p .defaultListenerIP , fmt .Sprint (p .dynamicSequentialMinPort + int (brokerId )))
173
- } else {
174
- defaultListenerAddress = net .JoinHostPort (p .defaultListenerIP , fmt .Sprint (p .dynamicSequentialMinPort ))
175
- if p .dynamicSequentialMinPort != 0 {
176
- p .dynamicSequentialMinPort += 1
177
- }
150
+ defaultListenerAddress := net .JoinHostPort (p .defaultListenerIP , fmt .Sprint (p .dynamicSequentialMinPort ))
151
+ if p .dynamicSequentialMinPort != 0 {
152
+ p .dynamicSequentialMinPort += 1
178
153
}
154
+ //TODO: brokerId >= 0 for deternmisitc listener dynamicSequentialMinPort + brokerId < 65535 (overflow)
179
155
180
- cfg := config. ListenerConfig { ListenerAddress : defaultListenerAddress , BrokerAddress : brokerAddress }
156
+ cfg := NewListenerConfig ( brokerAddress , defaultListenerAddress , "" , brokerId )
181
157
l , err := listenInstance (p .connSrc , cfg , p .tcpConnOptions , p .listenFunc )
182
158
if err != nil {
183
159
return "" , 0 , err
@@ -189,12 +165,11 @@ func (p *Listeners) ListenDynamicInstance(brokerAddress string, brokerId int32)
189
165
if dynamicAdvertisedListener == "" {
190
166
dynamicAdvertisedListener = p .defaultListenerIP
191
167
}
168
+ cfg .AdvertisedAddress = net .JoinHostPort (dynamicAdvertisedListener , fmt .Sprint (port ))
169
+ cfg .ListenerAddress = address
192
170
193
- advertisedAddress := net .JoinHostPort (dynamicAdvertisedListener , fmt .Sprint (port ))
194
- p .brokerToListenerConfig [brokerAddress ] = config.ListenerConfig {BrokerAddress : brokerAddress , ListenerAddress : address , AdvertisedAddress : advertisedAddress }
195
- p .brokerIdToIdListenerConfig [brokerId ] = config.IdListenerConfig {BrokerAddress : brokerAddress , Listener : l }
196
-
197
- logrus .Infof ("Dynamic listener %s for broker %s advertised as %s" , address , brokerAddress , advertisedAddress )
171
+ p .brokerToListenerConfig [brokerAddress ] = cfg
172
+ logrus .Infof ("Dynamic listener %s for broker %s brokerId %d advertised as %s" , cfg .ListenerAddress , cfg .GetBrokerAddress (), cfg .BrokerID , cfg .AdvertisedAddress )
198
173
199
174
return dynamicAdvertisedListener , int32 (port ), nil
200
175
}
@@ -205,15 +180,16 @@ func (p *Listeners) ListenInstances(cfgs []config.ListenerConfig) (<-chan Conn,
205
180
206
181
// allows multiple local addresses to point to the remote
207
182
for _ , v := range cfgs {
208
- _ , err := listenInstance (p .connSrc , v , p .tcpConnOptions , p .listenFunc )
183
+ cfg := FromListenerConfig (v )
184
+ _ , err := listenInstance (p .connSrc , cfg , p .tcpConnOptions , p .listenFunc )
209
185
if err != nil {
210
186
return nil , err
211
187
}
212
188
}
213
189
return p .connSrc , nil
214
190
}
215
191
216
- func listenInstance (dst chan <- Conn , cfg config. ListenerConfig , opts TCPConnOptions , listenFunc ListenFunc ) (net.Listener , error ) {
192
+ func listenInstance (dst chan <- Conn , cfg * ListenerConfig , opts TCPConnOptions , listenFunc ListenFunc ) (net.Listener , error ) {
217
193
l , err := listenFunc (cfg )
218
194
if err != nil {
219
195
return nil , err
@@ -222,20 +198,28 @@ func listenInstance(dst chan<- Conn, cfg config.ListenerConfig, opts TCPConnOpti
222
198
for {
223
199
c , err := l .Accept ()
224
200
if err != nil {
225
- logrus .Infof ("Error in accept for %q on %v: %v" , cfg , cfg .ListenerAddress , err )
201
+ logrus .Infof ("Error in accept for %q on %v: %v" , cfg . ToListenerConfig () , cfg .ListenerAddress , err )
226
202
l .Close ()
227
203
return
228
204
}
229
205
if tcpConn , ok := c .(* net.TCPConn ); ok {
230
206
if err := opts .setTCPConnOptions (tcpConn ); err != nil {
231
- logrus .Infof ("WARNING: Error while setting TCP options for accepted connection %q on %v: %v" , cfg , l .Addr ().String (), err )
207
+ logrus .Infof ("WARNING: Error while setting TCP options for accepted connection %q on %v: %v" , cfg . ToListenerConfig () , l .Addr ().String (), err )
232
208
}
233
209
}
234
- logrus .Infof ("New connection for %s" , cfg .BrokerAddress )
235
- dst <- Conn {BrokerAddress : cfg .BrokerAddress , LocalConnection : c }
210
+ brokerAddress := cfg .GetBrokerAddress ()
211
+ if cfg .BrokerID != UnknownBrokerID {
212
+ logrus .Infof ("New connection for %s brokerId %d" , brokerAddress , cfg .BrokerID )
213
+ } else {
214
+ logrus .Infof ("New connection for %s" , brokerAddress )
215
+ }
216
+ dst <- Conn {BrokerAddress : brokerAddress , LocalConnection : c }
236
217
}
237
218
})
238
-
239
- logrus .Infof ("Listening on %s (%s) for remote %s" , cfg .ListenerAddress , l .Addr ().String (), cfg .BrokerAddress )
219
+ if cfg .BrokerID != UnknownBrokerID {
220
+ logrus .Infof ("Listening on %s (%s) for remote %s broker %d" , cfg .ListenerAddress , l .Addr ().String (), cfg .GetBrokerAddress (), cfg .BrokerID )
221
+ } else {
222
+ logrus .Infof ("Listening on %s (%s) for remote %s" , cfg .ListenerAddress , l .Addr ().String (), cfg .GetBrokerAddress ())
223
+ }
240
224
return l , nil
241
225
}
0 commit comments