Skip to content

Commit 6ebfd2b

Browse files
committed
Replace Backend interface with a struct.
Comparisons (like those in DefaultBackendStorage) should be by pointer value.
1 parent 457af6a commit 6ebfd2b

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
@@ -272,7 +262,7 @@ func NewDefaultBackendStorage(idTypes []header.IdentifierType) *DefaultBackendSt
272262
// no agent ever successfully connects.
273263
metrics.Metrics.SetBackendCount(0)
274264
return &DefaultBackendStorage{
275-
backends: make(map[string][]Backend),
265+
backends: make(map[string][]*Backend),
276266
random: rand.New(rand.NewSource(time.Now().UnixNano())),
277267
idTypes: idTypes,
278268
} /* #nosec G404 */
@@ -283,7 +273,7 @@ func containIDType(idTypes []header.IdentifierType, idType header.IdentifierType
283273
}
284274

285275
// addBackend adds a backend.
286-
func (s *DefaultBackendStorage) addBackend(identifier string, idType header.IdentifierType, backend Backend) {
276+
func (s *DefaultBackendStorage) addBackend(identifier string, idType header.IdentifierType, backend *Backend) {
287277
if !containIDType(s.idTypes, idType) {
288278
klog.V(4).InfoS("fail to add backend", "backend", identifier, "error", &ErrWrongIDType{idType, s.idTypes})
289279
return
@@ -302,7 +292,7 @@ func (s *DefaultBackendStorage) addBackend(identifier string, idType header.Iden
302292
s.backends[identifier] = append(s.backends[identifier], backend)
303293
return
304294
}
305-
s.backends[identifier] = []Backend{backend}
295+
s.backends[identifier] = []*Backend{backend}
306296
metrics.Metrics.SetBackendCount(len(s.backends))
307297
s.agentIDs = append(s.agentIDs, identifier)
308298
if idType == header.DefaultRoute {
@@ -311,7 +301,7 @@ func (s *DefaultBackendStorage) addBackend(identifier string, idType header.Iden
311301
}
312302

313303
// removeBackend removes a backend.
314-
func (s *DefaultBackendStorage) removeBackend(identifier string, idType header.IdentifierType, backend Backend) {
304+
func (s *DefaultBackendStorage) removeBackend(identifier string, idType header.IdentifierType, backend *Backend) {
315305
if !containIDType(s.idTypes, idType) {
316306
klog.ErrorS(&ErrWrongIDType{idType, s.idTypes}, "fail to remove backend")
317307
return
@@ -390,7 +380,7 @@ func ignoreNotFound(err error) error {
390380
}
391381

392382
// GetRandomBackend returns a random backend connection from all connected agents.
393-
func (s *DefaultBackendStorage) GetRandomBackend() (Backend, error) {
383+
func (s *DefaultBackendStorage) GetRandomBackend() (*Backend, error) {
394384
s.mu.Lock()
395385
defer s.mu.Unlock()
396386
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
expectedDefaultRouteAgentIDs := []string(nil)
125125
if e, a := expectedBackends, p.backends; !reflect.DeepEqual(e, a) {
@@ -143,7 +143,7 @@ func TestDefaultBackendManager_AddRemoveBackends(t *testing.T) {
143143
p.RemoveBackend(backend22)
144144
p.RemoveBackend(backend2)
145145
p.RemoveBackend(backend1)
146-
expectedBackends = map[string][]Backend{
146+
expectedBackends = map[string][]*Backend{
147147
"agent1": {backend12},
148148
"agent3": {backend3},
149149
}
@@ -174,7 +174,7 @@ func TestDefaultRouteBackendManager_AddRemoveBackends(t *testing.T) {
174174

175175
p.AddBackend(backend1)
176176
p.RemoveBackend(backend1)
177-
expectedBackends := make(map[string][]Backend)
177+
expectedBackends := make(map[string][]*Backend)
178178
expectedAgentIDs := []string{}
179179
expectedDefaultRouteAgentIDs := []string{}
180180
if e, a := expectedBackends, p.backends; !reflect.DeepEqual(e, a) {
@@ -199,7 +199,7 @@ func TestDefaultRouteBackendManager_AddRemoveBackends(t *testing.T) {
199199
p.RemoveBackend(backend2)
200200
p.RemoveBackend(backend1)
201201

202-
expectedBackends = map[string][]Backend{
202+
expectedBackends = map[string][]*Backend{
203203
"agent1": {backend12},
204204
"agent3": {backend3},
205205
}
@@ -231,7 +231,7 @@ func TestDestHostBackendManager_AddRemoveBackends(t *testing.T) {
231231

232232
p.AddBackend(backend1)
233233
p.RemoveBackend(backend1)
234-
expectedBackends := make(map[string][]Backend)
234+
expectedBackends := make(map[string][]*Backend)
235235
expectedAgentIDs := []string{}
236236
expectedDefaultRouteAgentIDs := []string(nil)
237237
if e, a := expectedBackends, p.backends; !reflect.DeepEqual(e, a) {
@@ -247,7 +247,7 @@ func TestDestHostBackendManager_AddRemoveBackends(t *testing.T) {
247247
p = NewDestHostBackendManager()
248248
p.AddBackend(backend1)
249249

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

276-
expectedBackends = map[string][]Backend{
276+
expectedBackends = map[string][]*Backend{
277277
"localhost": {backend1},
278278
"node1.mydomain.com": {backend1},
279279
"node2.mydomain.com": {backend3},
@@ -306,7 +306,7 @@ func TestDestHostBackendManager_AddRemoveBackends(t *testing.T) {
306306
p.RemoveBackend(backend2)
307307
p.RemoveBackend(backend1)
308308

309-
expectedBackends = map[string][]Backend{
309+
expectedBackends = map[string][]*Backend{
310310
"node2.mydomain.com": {backend3},
311311
"5.6.7.8": {backend3},
312312
"::": {backend3},
@@ -328,7 +328,7 @@ func TestDestHostBackendManager_AddRemoveBackends(t *testing.T) {
328328
}
329329

330330
p.RemoveBackend(backend3)
331-
expectedBackends = map[string][]Backend{}
331+
expectedBackends = map[string][]*Backend{}
332332
expectedAgentIDs = []string{}
333333

334334
if e, a := expectedBackends, p.backends; !reflect.DeepEqual(e, a) {
@@ -356,7 +356,7 @@ func TestDestHostBackendManager_WithDuplicateIdents(t *testing.T) {
356356
p.AddBackend(backend2)
357357
p.AddBackend(backend3)
358358

359-
expectedBackends := map[string][]Backend{
359+
expectedBackends := map[string][]*Backend{
360360
"localhost": {backend1, backend2, backend3},
361361
"1.2.3.4": {backend1, backend2},
362362
"5.6.7.8": {backend3},
@@ -389,7 +389,7 @@ func TestDestHostBackendManager_WithDuplicateIdents(t *testing.T) {
389389
p.RemoveBackend(backend1)
390390
p.RemoveBackend(backend3)
391391

392-
expectedBackends = map[string][]Backend{
392+
expectedBackends = map[string][]*Backend{
393393
"localhost": {backend2},
394394
"1.2.3.4": {backend2},
395395
"9878::7675:1292:9183:7562": {backend2},
@@ -413,7 +413,7 @@ func TestDestHostBackendManager_WithDuplicateIdents(t *testing.T) {
413413
}
414414

415415
p.RemoveBackend(backend2)
416-
expectedBackends = map[string][]Backend{}
416+
expectedBackends = map[string][]*Backend{}
417417
expectedAgentIDs = []string{}
418418

419419
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)