@@ -27,6 +27,8 @@ type federatedServiceWatcher struct {
27
27
localEndpoints * watcher.EndpointsWatcher
28
28
29
29
log * logging.Entry
30
+
31
+ sync.RWMutex
30
32
}
31
33
32
34
type remoteDiscoveryID struct {
@@ -109,10 +111,14 @@ func (fsw *federatedServiceWatcher) Subscribe(
109
111
endStream chan struct {},
110
112
) error {
111
113
id := watcher.ServiceID {Namespace : namespace , Name : service }
114
+ fsw .RLock ()
112
115
if federatedService , ok := fsw .services [id ]; ok {
116
+ fsw .RUnlock ()
113
117
fsw .log .Debugf ("Subscribing to federated service %s/%s" , namespace , service )
114
118
federatedService .subscribe (port , nodeName , instanceID , stream , endStream )
115
119
return nil
120
+ } else {
121
+ fsw .RUnlock ()
116
122
}
117
123
return fmt .Errorf ("service %s/%s is not a federated service" , namespace , service )
118
124
}
@@ -123,9 +129,13 @@ func (fsw *federatedServiceWatcher) Unsubscribe(
123
129
stream pb.Destination_GetServer ,
124
130
) {
125
131
id := watcher.ServiceID {Namespace : namespace , Name : service }
132
+ fsw .RLock ()
126
133
if federatedService , ok := fsw .services [id ]; ok {
134
+ fsw .RUnlock ()
127
135
fsw .log .Debugf ("Unsubscribing from federated service %s/%s" , namespace , service )
128
136
federatedService .unsubscribe (stream )
137
+ } else {
138
+ fsw .RUnlock ()
129
139
}
130
140
}
131
141
@@ -137,20 +147,27 @@ func (fsw *federatedServiceWatcher) addService(obj interface{}) {
137
147
}
138
148
139
149
if isFederatedService (service ) {
150
+ fsw .Lock ()
140
151
if federatedService , ok := fsw .services [id ]; ok {
152
+ fsw .Unlock ()
141
153
fsw .log .Debugf ("Updating federated service %s/%s" , service .Namespace , service .Name )
142
154
federatedService .update (service )
143
155
} else {
144
156
fsw .log .Debugf ("Adding federated service %s/%s" , service .Namespace , service .Name )
145
157
federatedService = fsw .newFederatedService (service )
146
158
fsw .services [id ] = federatedService
159
+ fsw .Unlock ()
147
160
federatedService .update (service )
148
161
}
149
162
} else {
163
+ fsw .Lock ()
150
164
if federatedService , ok := fsw .services [id ]; ok {
165
+ delete (fsw .services , id )
166
+ fsw .Unlock ()
151
167
fsw .log .Debugf ("Service %s/%s is no longer a federated service" , service .Namespace , service .Name )
152
168
federatedService .delete ()
153
- delete (fsw .services , id )
169
+ } else {
170
+ fsw .Unlock ()
154
171
}
155
172
}
156
173
}
@@ -178,10 +195,15 @@ func (fsw *federatedServiceWatcher) deleteService(obj interface{}) {
178
195
Namespace : service .Namespace ,
179
196
Name : service .Name ,
180
197
}
198
+ fsw .Lock ()
181
199
if federatedService , ok := fsw .services [id ]; ok {
182
- federatedService .delete ()
183
200
delete (fsw .services , id )
201
+ fsw .Unlock ()
202
+ federatedService .delete ()
203
+ } else {
204
+ fsw .Unlock ()
184
205
}
206
+
185
207
}
186
208
187
209
func (fsw * federatedServiceWatcher ) newFederatedService (service * corev1.Service ) * federatedService {
@@ -268,6 +290,9 @@ func (fs *federatedService) subscribe(
268
290
stream pb.Destination_GetServer ,
269
291
endStream chan struct {},
270
292
) {
293
+ fs .Lock ()
294
+ defer fs .Unlock ()
295
+
271
296
syncStream := newSyncronizedGetStream (stream , fs .log )
272
297
syncStream .Start ()
273
298
@@ -287,8 +312,6 @@ func (fs *federatedService) subscribe(
287
312
fs .localDiscoverySubscribe (& subscriber , fs .localDiscovery )
288
313
}
289
314
290
- fs .Lock ()
291
- defer fs .Unlock ()
292
315
fs .subscribers = append (fs .subscribers , subscriber )
293
316
}
294
317
@@ -322,6 +345,7 @@ func (fs *federatedService) remoteDiscoverySubscribe(
322
345
remoteWatcher , remoteConfig , found := fs .clusterStore .Get (id .cluster )
323
346
if ! found {
324
347
fs .log .Errorf ("Failed to get remote cluster %s" , id .cluster )
348
+ return
325
349
}
326
350
327
351
translator := newEndpointTranslator (
0 commit comments