Skip to content

Commit 56bfbb6

Browse files
authored
Merge pull request #608 from jkh52/backend
Replace Backend interface with a struct.
2 parents f8c1a95 + 6ebfd2b commit 56bfbb6

File tree

6 files changed

+57
-67
lines changed

6 files changed

+57
-67
lines changed

pkg/server/backend_manager.go

Lines changed: 22 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -77,17 +77,7 @@ func GenProxyStrategiesFromStr(proxyStrategies string) ([]ProxyStrategy, error)
7777
// In the only currently supported case (gRPC), it wraps an
7878
// agent.AgentService_ConnectServer, provides synchronization and
7979
// emits common stream metrics.
80-
type Backend interface {
81-
Send(p *client.Packet) error
82-
Recv() (*client.Packet, error)
83-
Context() context.Context
84-
GetAgentID() string
85-
GetAgentIdentifiers() header.Identifiers
86-
}
87-
88-
var _ Backend = &backend{}
89-
90-
type backend struct {
80+
type Backend struct {
9181
sendLock sync.Mutex
9282
recvLock sync.Mutex
9383
conn agent.AgentService_ConnectServer
@@ -97,7 +87,7 @@ type backend struct {
9787
idents header.Identifiers
9888
}
9989

100-
func (b *backend) Send(p *client.Packet) error {
90+
func (b *Backend) Send(p *client.Packet) error {
10191
b.sendLock.Lock()
10292
defer b.sendLock.Unlock()
10393

@@ -110,7 +100,7 @@ func (b *backend) Send(p *client.Packet) error {
110100
return err
111101
}
112102

113-
func (b *backend) Recv() (*client.Packet, error) {
103+
func (b *Backend) Recv() (*client.Packet, error) {
114104
b.recvLock.Lock()
115105
defer b.recvLock.Unlock()
116106

@@ -126,16 +116,16 @@ func (b *backend) Recv() (*client.Packet, error) {
126116
return pkt, nil
127117
}
128118

129-
func (b *backend) Context() context.Context {
119+
func (b *Backend) Context() context.Context {
130120
// TODO: does Context require lock protection?
131121
return b.conn.Context()
132122
}
133123

134-
func (b *backend) GetAgentID() string {
124+
func (b *Backend) GetAgentID() string {
135125
return b.id
136126
}
137127

138-
func (b *backend) GetAgentIdentifiers() header.Identifiers {
128+
func (b *Backend) GetAgentIdentifiers() header.Identifiers {
139129
return b.idents
140130
}
141131

@@ -168,7 +158,7 @@ func getAgentIdentifiers(conn agent.AgentService_ConnectServer) (header.Identifi
168158
return header.GenAgentIdentifiers(agentIdent[0])
169159
}
170160

171-
func NewBackend(conn agent.AgentService_ConnectServer) (Backend, error) {
161+
func NewBackend(conn agent.AgentService_ConnectServer) (*Backend, error) {
172162
agentID, err := getAgentID(conn)
173163
if err != nil {
174164
return nil, err
@@ -177,16 +167,16 @@ func NewBackend(conn agent.AgentService_ConnectServer) (Backend, error) {
177167
if err != nil {
178168
return nil, err
179169
}
180-
return &backend{conn: conn, id: agentID, idents: agentIdentifiers}, nil
170+
return &Backend{conn: conn, id: agentID, idents: agentIdentifiers}, nil
181171
}
182172

183173
// BackendStorage is an interface to manage the storage of the backend
184174
// connections, i.e., get, add and remove
185175
type BackendStorage interface {
186176
// addBackend adds a backend.
187-
addBackend(identifier string, idType header.IdentifierType, backend Backend)
177+
addBackend(identifier string, idType header.IdentifierType, backend *Backend)
188178
// removeBackend removes a backend.
189-
removeBackend(identifier string, idType header.IdentifierType, backend Backend)
179+
removeBackend(identifier string, idType header.IdentifierType, backend *Backend)
190180
// NumBackends returns the number of backends.
191181
NumBackends() int
192182
}
@@ -199,11 +189,11 @@ type BackendManager interface {
199189
// context instead of a request-scoped context, as the backend manager will
200190
// pick a backend for every tunnel session and each tunnel session may
201191
// contains multiple requests.
202-
Backend(ctx context.Context) (Backend, error)
192+
Backend(ctx context.Context) (*Backend, error)
203193
// AddBackend adds a backend.
204-
AddBackend(backend Backend)
194+
AddBackend(backend *Backend)
205195
// RemoveBackend adds a backend.
206-
RemoveBackend(backend Backend)
196+
RemoveBackend(backend *Backend)
207197
BackendStorage
208198
ReadinessManager
209199
}
@@ -215,18 +205,18 @@ type DefaultBackendManager struct {
215205
*DefaultBackendStorage
216206
}
217207

218-
func (dbm *DefaultBackendManager) Backend(_ context.Context) (Backend, error) {
208+
func (dbm *DefaultBackendManager) Backend(_ context.Context) (*Backend, error) {
219209
klog.V(5).InfoS("Get a random backend through the DefaultBackendManager")
220210
return dbm.DefaultBackendStorage.GetRandomBackend()
221211
}
222212

223-
func (dbm *DefaultBackendManager) AddBackend(backend Backend) {
213+
func (dbm *DefaultBackendManager) AddBackend(backend *Backend) {
224214
agentID := backend.GetAgentID()
225215
klog.V(5).InfoS("Add the agent to DefaultBackendManager", "agentID", agentID)
226216
dbm.addBackend(agentID, header.UID, backend)
227217
}
228218

229-
func (dbm *DefaultBackendManager) RemoveBackend(backend Backend) {
219+
func (dbm *DefaultBackendManager) RemoveBackend(backend *Backend) {
230220
agentID := backend.GetAgentID()
231221
klog.V(5).InfoS("Remove the agent from the DefaultBackendManager", "agentID", agentID)
232222
dbm.removeBackend(agentID, header.UID, backend)
@@ -242,7 +232,7 @@ type DefaultBackendStorage struct {
242232
//
243233
// TODO: fix documentation. This is not always agentID, e.g. in
244234
// the case of DestHostBackendManager.
245-
backends map[string][]Backend
235+
backends map[string][]*Backend
246236
// agentID is tracked in this slice to enable randomly picking an
247237
// agentID in the Backend() method. There is no reliable way to
248238
// randomly pick a key from a map (in this case, the backends) in
@@ -270,7 +260,7 @@ func NewDefaultBackendStorage(idTypes []header.IdentifierType) *DefaultBackendSt
270260
// no agent ever successfully connects.
271261
metrics.Metrics.SetBackendCount(0)
272262
return &DefaultBackendStorage{
273-
backends: make(map[string][]Backend),
263+
backends: make(map[string][]*Backend),
274264
random: rand.New(rand.NewSource(time.Now().UnixNano())),
275265
idTypes: idTypes,
276266
} /* #nosec G404 */
@@ -281,7 +271,7 @@ func containIDType(idTypes []header.IdentifierType, idType header.IdentifierType
281271
}
282272

283273
// addBackend adds a backend.
284-
func (s *DefaultBackendStorage) addBackend(identifier string, idType header.IdentifierType, backend Backend) {
274+
func (s *DefaultBackendStorage) addBackend(identifier string, idType header.IdentifierType, backend *Backend) {
285275
if !containIDType(s.idTypes, idType) {
286276
klog.V(4).InfoS("fail to add backend", "backend", identifier, "error", &ErrWrongIDType{idType, s.idTypes})
287277
return
@@ -300,13 +290,13 @@ func (s *DefaultBackendStorage) addBackend(identifier string, idType header.Iden
300290
s.backends[identifier] = append(s.backends[identifier], backend)
301291
return
302292
}
303-
s.backends[identifier] = []Backend{backend}
293+
s.backends[identifier] = []*Backend{backend}
304294
metrics.Metrics.SetBackendCount(len(s.backends))
305295
s.agentIDs = append(s.agentIDs, identifier)
306296
}
307297

308298
// removeBackend removes a backend.
309-
func (s *DefaultBackendStorage) removeBackend(identifier string, idType header.IdentifierType, backend Backend) {
299+
func (s *DefaultBackendStorage) removeBackend(identifier string, idType header.IdentifierType, backend *Backend) {
310300
if !containIDType(s.idTypes, idType) {
311301
klog.ErrorS(&ErrWrongIDType{idType, s.idTypes}, "fail to remove backend")
312302
return
@@ -377,7 +367,7 @@ func ignoreNotFound(err error) error {
377367
}
378368

379369
// GetRandomBackend returns a random backend connection from all connected agents.
380-
func (s *DefaultBackendStorage) GetRandomBackend() (Backend, error) {
370+
func (s *DefaultBackendStorage) GetRandomBackend() (*Backend, error) {
381371
s.mu.Lock()
382372
defer s.mu.Unlock()
383373
if len(s.backends) == 0 {

pkg/server/backend_manager_test.go

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ func TestDefaultBackendManager_AddRemoveBackends(t *testing.T) {
119119

120120
p.AddBackend(backend1)
121121
p.RemoveBackend(backend1)
122-
expectedBackends := make(map[string][]Backend)
122+
expectedBackends := make(map[string][]*Backend)
123123
expectedAgentIDs := []string{}
124124
if e, a := expectedBackends, p.backends; !reflect.DeepEqual(e, a) {
125125
t.Errorf("expected %v, got %v", e, a)
@@ -139,7 +139,7 @@ func TestDefaultBackendManager_AddRemoveBackends(t *testing.T) {
139139
p.RemoveBackend(backend22)
140140
p.RemoveBackend(backend2)
141141
p.RemoveBackend(backend1)
142-
expectedBackends = map[string][]Backend{
142+
expectedBackends = map[string][]*Backend{
143143
"agent1": {backend12},
144144
"agent3": {backend3},
145145
}
@@ -166,7 +166,7 @@ func TestDefaultRouteBackendManager_AddRemoveBackends(t *testing.T) {
166166

167167
p.AddBackend(backend1)
168168
p.RemoveBackend(backend1)
169-
expectedBackends := make(map[string][]Backend)
169+
expectedBackends := make(map[string][]*Backend)
170170
expectedAgentIDs := []string{}
171171
if e, a := expectedBackends, p.backends; !reflect.DeepEqual(e, a) {
172172
t.Errorf("expected %v, got %v", e, a)
@@ -187,7 +187,7 @@ func TestDefaultRouteBackendManager_AddRemoveBackends(t *testing.T) {
187187
p.RemoveBackend(backend2)
188188
p.RemoveBackend(backend1)
189189

190-
expectedBackends = map[string][]Backend{
190+
expectedBackends = map[string][]*Backend{
191191
"agent1": {backend12},
192192
"agent3": {backend3},
193193
}
@@ -215,7 +215,7 @@ func TestDestHostBackendManager_AddRemoveBackends(t *testing.T) {
215215

216216
p.AddBackend(backend1)
217217
p.RemoveBackend(backend1)
218-
expectedBackends := make(map[string][]Backend)
218+
expectedBackends := make(map[string][]*Backend)
219219
expectedAgentIDs := []string{}
220220
if e, a := expectedBackends, p.backends; !reflect.DeepEqual(e, a) {
221221
t.Errorf("expected %v, got %v", e, a)
@@ -227,7 +227,7 @@ func TestDestHostBackendManager_AddRemoveBackends(t *testing.T) {
227227
p = NewDestHostBackendManager()
228228
p.AddBackend(backend1)
229229

230-
expectedBackends = map[string][]Backend{
230+
expectedBackends = map[string][]*Backend{
231231
"localhost": {backend1},
232232
"1.2.3.4": {backend1},
233233
"9878::7675:1292:9183:7562": {backend1},
@@ -250,7 +250,7 @@ func TestDestHostBackendManager_AddRemoveBackends(t *testing.T) {
250250
p.AddBackend(backend2)
251251
p.AddBackend(backend3)
252252

253-
expectedBackends = map[string][]Backend{
253+
expectedBackends = map[string][]*Backend{
254254
"localhost": {backend1},
255255
"node1.mydomain.com": {backend1},
256256
"node2.mydomain.com": {backend3},
@@ -279,7 +279,7 @@ func TestDestHostBackendManager_AddRemoveBackends(t *testing.T) {
279279
p.RemoveBackend(backend2)
280280
p.RemoveBackend(backend1)
281281

282-
expectedBackends = map[string][]Backend{
282+
expectedBackends = map[string][]*Backend{
283283
"node2.mydomain.com": {backend3},
284284
"5.6.7.8": {backend3},
285285
"::": {backend3},
@@ -298,7 +298,7 @@ func TestDestHostBackendManager_AddRemoveBackends(t *testing.T) {
298298
}
299299

300300
p.RemoveBackend(backend3)
301-
expectedBackends = map[string][]Backend{}
301+
expectedBackends = map[string][]*Backend{}
302302
expectedAgentIDs = []string{}
303303

304304
if e, a := expectedBackends, p.backends; !reflect.DeepEqual(e, a) {
@@ -323,7 +323,7 @@ func TestDestHostBackendManager_WithDuplicateIdents(t *testing.T) {
323323
p.AddBackend(backend2)
324324
p.AddBackend(backend3)
325325

326-
expectedBackends := map[string][]Backend{
326+
expectedBackends := map[string][]*Backend{
327327
"localhost": {backend1, backend2, backend3},
328328
"1.2.3.4": {backend1, backend2},
329329
"5.6.7.8": {backend3},
@@ -352,7 +352,7 @@ func TestDestHostBackendManager_WithDuplicateIdents(t *testing.T) {
352352
p.RemoveBackend(backend1)
353353
p.RemoveBackend(backend3)
354354

355-
expectedBackends = map[string][]Backend{
355+
expectedBackends = map[string][]*Backend{
356356
"localhost": {backend2},
357357
"1.2.3.4": {backend2},
358358
"9878::7675:1292:9183:7562": {backend2},
@@ -373,7 +373,7 @@ func TestDestHostBackendManager_WithDuplicateIdents(t *testing.T) {
373373
}
374374

375375
p.RemoveBackend(backend2)
376-
expectedBackends = map[string][]Backend{}
376+
expectedBackends = map[string][]*Backend{}
377377
expectedAgentIDs = []string{}
378378

379379
if e, a := expectedBackends, p.backends; !reflect.DeepEqual(e, a) {

pkg/server/default_route_backend_manager.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,11 +36,11 @@ func NewDefaultRouteBackendManager() *DefaultRouteBackendManager {
3636
}
3737

3838
// Backend tries to get a backend that advertises default route, with random selection.
39-
func (dibm *DefaultRouteBackendManager) Backend(_ context.Context) (Backend, error) {
39+
func (dibm *DefaultRouteBackendManager) Backend(_ context.Context) (*Backend, error) {
4040
return dibm.GetRandomBackend()
4141
}
4242

43-
func (dibm *DefaultRouteBackendManager) AddBackend(backend Backend) {
43+
func (dibm *DefaultRouteBackendManager) AddBackend(backend *Backend) {
4444
agentID := backend.GetAgentID()
4545
agentIdentifiers := backend.GetAgentIdentifiers()
4646
if agentIdentifiers.DefaultRoute {
@@ -49,7 +49,7 @@ func (dibm *DefaultRouteBackendManager) AddBackend(backend Backend) {
4949
}
5050
}
5151

52-
func (dibm *DefaultRouteBackendManager) RemoveBackend(backend Backend) {
52+
func (dibm *DefaultRouteBackendManager) RemoveBackend(backend *Backend) {
5353
agentID := backend.GetAgentID()
5454
agentIdentifiers := backend.GetAgentIdentifiers()
5555
if agentIdentifiers.DefaultRoute {

pkg/server/desthost_backend_manager.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ func NewDestHostBackendManager() *DestHostBackendManager {
3535
[]header.IdentifierType{header.IPv4, header.IPv6, header.Host})}
3636
}
3737

38-
func (dibm *DestHostBackendManager) AddBackend(backend Backend) {
38+
func (dibm *DestHostBackendManager) AddBackend(backend *Backend) {
3939
agentIdentifiers := backend.GetAgentIdentifiers()
4040
for _, ipv4 := range agentIdentifiers.IPv4 {
4141
klog.V(5).InfoS("Add the agent to DestHostBackendManager", "agent address", ipv4)
@@ -51,7 +51,7 @@ func (dibm *DestHostBackendManager) AddBackend(backend Backend) {
5151
}
5252
}
5353

54-
func (dibm *DestHostBackendManager) RemoveBackend(backend Backend) {
54+
func (dibm *DestHostBackendManager) RemoveBackend(backend *Backend) {
5555
agentIdentifiers := backend.GetAgentIdentifiers()
5656
for _, ipv4 := range agentIdentifiers.IPv4 {
5757
klog.V(5).InfoS("Remove the agent from the DestHostBackendManager", "agentHost", ipv4)
@@ -68,7 +68,7 @@ func (dibm *DestHostBackendManager) RemoveBackend(backend Backend) {
6868
}
6969

7070
// Backend tries to get a backend associating to the request destination host.
71-
func (dibm *DestHostBackendManager) Backend(ctx context.Context) (Backend, error) {
71+
func (dibm *DestHostBackendManager) Backend(ctx context.Context) (*Backend, error) {
7272
dibm.mu.RLock()
7373
defer dibm.mu.RUnlock()
7474
if len(dibm.backends) == 0 {

0 commit comments

Comments
 (0)