singleflight: fix duplicate deleting key when Forget called

When Forget was called, we delete key associated with current call from
map. When that call is done, it does delete key again, causing the same
key set by other call after Forget lost.

To fix it, adding a boolean value to check whether the call is forgotten,
the call only does delete key if Forget is not called.

Fixes golang/go#31420

Change-Id: I9708352ca3ff76c77f659916b37a496fdeb480d2
Reviewed-on: https://go-review.googlesource.com/c/sync/+/171897
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
2 files changed
tree: 06fcca271037d34aa2338d69647c8dd2c233e20e
  1. errgroup/
  2. semaphore/
  3. singleflight/
  4. syncmap/
  5. AUTHORS
  6. codereview.cfg
  7. CONTRIBUTING.md
  8. CONTRIBUTORS
  9. go.mod
  10. LICENSE
  11. PATENTS
  12. README.md
README.md

Go Sync

This repository provides Go concurrency primitives in addition to the ones provided by the language and “sync” and “sync/atomic” packages.

Download/Install

The easiest way to install is to run go get -u golang.org/x/sync. You can also manually git clone the repository to $GOPATH/src/golang.org/x/sync.

Report Issues / Send Patches

This repository uses Gerrit for code changes. To learn how to submit changes to this repository, see https://golang.org/doc/contribute.html.

The main issue tracker for the sync repository is located at https://github.com/golang/go/issues. Prefix your issue with “x/sync:” in the subject line, so it is easy to find.