Skip to content

Commit ac77b18

Browse files
committed
Responding to code review comments
1 parent 6f3b218 commit ac77b18

5 files changed

Lines changed: 30 additions & 27 deletions

File tree

testservice/flag_change_listener.go

Lines changed: 26 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -18,27 +18,36 @@ type listenerEntry struct {
1818
// listenerRegistry manages all active flag change listener registrations for a single
1919
// SDK client entity. It is safe to use from multiple goroutines.
2020
type listenerRegistry struct {
21-
mu sync.Mutex
22-
entries map[string]*listenerEntry // keyed by listenerId
23-
tracker interfaces.FlagTracker
21+
mu sync.Mutex
22+
listeners map[string]*listenerEntry // keyed by listenerId
23+
tracker interfaces.FlagTracker
2424
}
2525

2626
func newListenerRegistry(tracker interfaces.FlagTracker) *listenerRegistry {
2727
return &listenerRegistry{
28-
entries: make(map[string]*listenerEntry),
29-
tracker: tracker,
28+
listeners: make(map[string]*listenerEntry),
29+
tracker: tracker,
3030
}
3131
}
3232

33-
// registerFlagChangeListener subscribes to general flag configuration changes. If flagKey
34-
// is non-empty, only events for that specific flag are forwarded to the callback URI.
35-
func (r *listenerRegistry) registerFlagChangeListener(listenerID, flagKey, callbackURI string) {
36-
ch := r.tracker.AddFlagChangeListener()
33+
// storeListener registers a new listener entry under listenerID, cancelling any
34+
// previously registered listener with the same ID. Returns the new entry's context.
35+
func (r *listenerRegistry) storeListener(listenerID string) context.Context {
3736
ctx, cancel := context.WithCancel(context.Background())
38-
3937
r.mu.Lock()
40-
r.entries[listenerID] = &listenerEntry{cancel: cancel}
38+
if old, exists := r.listeners[listenerID]; exists {
39+
old.cancel()
40+
}
41+
r.listeners[listenerID] = &listenerEntry{cancel: cancel}
4142
r.mu.Unlock()
43+
return ctx
44+
}
45+
46+
// registerFlagChangeListener subscribes to general flag configuration changes.
47+
// All flag change events are forwarded to the callback URI.
48+
func (r *listenerRegistry) registerFlagChangeListener(listenerID, callbackURI string) {
49+
ch := r.tracker.AddFlagChangeListener()
50+
ctx := r.storeListener(listenerID)
4251

4352
svc := callbackService{baseURL: callbackURI}
4453
go func() {
@@ -51,9 +60,6 @@ func (r *listenerRegistry) registerFlagChangeListener(listenerID, flagKey, callb
5160
if !ok {
5261
return
5362
}
54-
if flagKey != "" && event.Key != flagKey {
55-
continue
56-
}
5763
_ = svc.post("", servicedef.ListenerNotification{
5864
ListenerID: listenerID,
5965
FlagKey: event.Key,
@@ -73,11 +79,7 @@ func (r *listenerRegistry) registerFlagValueChangeListener(
7379
callbackURI string,
7480
) {
7581
ch := r.tracker.AddFlagValueChangeListener(flagKey, evalCtx, defaultValue)
76-
ctx, cancel := context.WithCancel(context.Background())
77-
78-
r.mu.Lock()
79-
r.entries[listenerID] = &listenerEntry{cancel: cancel}
80-
r.mu.Unlock()
82+
ctx := r.storeListener(listenerID)
8183

8284
svc := callbackService{baseURL: callbackURI}
8385
go func() {
@@ -107,9 +109,9 @@ func (r *listenerRegistry) registerFlagValueChangeListener(
107109
// registry. Returns false if no listener with that ID was found.
108110
func (r *listenerRegistry) unregister(listenerID string) bool {
109111
r.mu.Lock()
110-
entry, ok := r.entries[listenerID]
112+
entry, ok := r.listeners[listenerID]
111113
if ok {
112-
delete(r.entries, listenerID)
114+
delete(r.listeners, listenerID)
113115
}
114116
r.mu.Unlock()
115117

@@ -122,11 +124,11 @@ func (r *listenerRegistry) unregister(listenerID string) bool {
122124
// closeAll stops all active listener goroutines. Called when the SDK client entity closes.
123125
func (r *listenerRegistry) closeAll() {
124126
r.mu.Lock()
125-
entries := r.entries
126-
r.entries = make(map[string]*listenerEntry)
127+
listeners := r.listeners
128+
r.listeners = make(map[string]*listenerEntry)
127129
r.mu.Unlock()
128130

129-
for _, entry := range entries {
131+
for _, entry := range listeners {
130132
entry.cancel()
131133
}
132134
}

testservice/sdk_client_entity.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ func (c *SDKClientEntity) DoCommand(params servicedef.CommandParams) (interface{
135135
return c.migrationOperation(*params.MigrationOperation)
136136
case servicedef.CommandRegisterFlagChangeListener:
137137
p := params.RegisterFlagChangeListener
138-
c.listeners.registerFlagChangeListener(p.ListenerID, p.FlagKey, p.CallbackURI)
138+
c.listeners.registerFlagChangeListener(p.ListenerID, p.CallbackURI)
139139
return nil, nil
140140
case servicedef.CommandRegisterFlagValueChangeListener:
141141
p := params.RegisterFlagValueChangeListener

testservice/service.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ var capabilities = []string{
4949
servicedef.CapabilityPersistentDataStoreConsul,
5050
servicedef.CapabilityPersistentDataStoreDynamoDB,
5151
servicedef.CapabilityFlagChangeListeners,
52+
servicedef.CapabilityFlagValueChangeListeners,
5253
}
5354

5455
// gets the specified environment variable, or the default if not set

testservice/servicedef/command_params.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -190,10 +190,9 @@ type HookExecutionTrackPayload struct {
190190
}
191191

192192
// RegisterFlagChangeListenerParams defines parameters for registering a general flag change listener.
193-
// FlagKey may be empty to listen for changes to any flag, or non-empty to filter to a specific flag.
193+
// The listener will be notified whenever any flag's configuration changes.
194194
type RegisterFlagChangeListenerParams struct {
195195
ListenerID string `json:"listenerId"`
196-
FlagKey string `json:"flagKey"`
197196
CallbackURI string `json:"callbackUri"`
198197
}
199198

testservice/servicedef/service_params.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ const (
3030
CapabilityPersistentDataStoreConsul = "persistent-data-store-consul"
3131
CapabilityPersistentDataStoreDynamoDB = "persistent-data-store-dynamodb"
3232
CapabilityFlagChangeListeners = "flag-change-listeners"
33+
CapabilityFlagValueChangeListeners = "flag-value-change-listeners"
3334
)
3435

3536
type StatusRep struct {

0 commit comments

Comments
 (0)