Skip to content

Commit 6fc46d4

Browse files
committed
Fix for potential userCount race in changeWaiter
Previously calls to waiter.CurrentUserCount() were going straight through to the listener (i.e. the global user count), instead of using the last known user count for the waiter. This has the potential for missed user updates in changes.go, when user changes happen between changes waking up, and changes calling CurrentUserCount().
1 parent 8030409 commit 6fc46d4

File tree

1 file changed

+8
-4
lines changed

1 file changed

+8
-4
lines changed

db/change_listener.go

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,7 @@ type changeWaiter struct {
183183
userKeys []string
184184
lastCounter uint64
185185
lastTerminateCheckCounter uint64
186+
lastUserCount uint64
186187
}
187188

188189
// Creates a new changeWaiter that will wait for changes for the given document keys.
@@ -210,6 +211,9 @@ func (listener *changeListener) NewWaiterWithChannels(chans base.Set, user auth.
210211
}
211212
waiter := listener.NewWaiter(waitKeys)
212213
waiter.userKeys = userKeys
214+
if userKeys != nil {
215+
waiter.lastUserCount = listener.CurrentCount(userKeys)
216+
}
213217
return waiter
214218
}
215219

@@ -219,6 +223,9 @@ func (waiter *changeWaiter) Wait() uint32 {
219223
lastTerminateCheckCounter := waiter.lastTerminateCheckCounter
220224
lastCounter := waiter.lastCounter
221225
waiter.lastCounter, waiter.lastTerminateCheckCounter = waiter.listener.Wait(waiter.keys, waiter.lastCounter, waiter.lastTerminateCheckCounter)
226+
if waiter.userKeys != nil {
227+
waiter.lastUserCount = waiter.listener.CurrentCount(waiter.userKeys)
228+
}
222229
countChanged := waiter.lastCounter > lastCounter
223230

224231
//Uses != to compare as value can cycle back through 0
@@ -236,10 +243,7 @@ func (waiter *changeWaiter) Wait() uint32 {
236243
// Returns the current counter value for the waiter's user (and roles).
237244
// If this value changes, it means the user or roles have been updated.
238245
func (waiter *changeWaiter) CurrentUserCount() uint64 {
239-
if waiter.userKeys == nil {
240-
return 0
241-
}
242-
return waiter.listener.CurrentCount(waiter.userKeys)
246+
return waiter.lastUserCount
243247
}
244248

245249
// Updates the set of channel keys in the ChangeWaiter (maintains the existing set of user keys)

0 commit comments

Comments
 (0)