Skip to content

Commit

Permalink
fix: prevent buffer reuse in async mode for Put method
Browse files Browse the repository at this point in the history
If the mode is async, we need to copy request Blob to prevent
fasthttp from reusing the buffer since we are going to
use the buffer in a separate goroutine beyond the scope
of the current request.
  • Loading branch information
rhnvrm committed Nov 6, 2024
1 parent a434c18 commit 3329923
Show file tree
Hide file tree
Showing 2 changed files with 11 additions and 1 deletion.
4 changes: 3 additions & 1 deletion fastcache.go
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,9 @@ type Item struct {
ContentType string
Compression string
ETag string
Blob []byte
// If the Blob is used beyond the scope of the request, it should be copied.
// Such as when the cache is written asynchronously.
Blob []byte
}

// Store represents a backend data store where bytes are cached. Individual
Expand Down
8 changes: 8 additions & 0 deletions stores/goredis/redis.go
Original file line number Diff line number Diff line change
Expand Up @@ -169,6 +169,14 @@ type putReq struct {
// Put sets a value to given session but stored only on commit
func (s *Store) Put(namespace, group, uri string, b fastcache.Item, ttl time.Duration) error {
if s.config.Async {
// In async mode, we need to copy b.Blob to prevent fasthttp from reusing
// the buffer, as we will use the buffer in a separate goroutine beyond
// the scope of the current request.
blobCopy := make([]byte, len(b.Blob))
copy(blobCopy, b.Blob)
b.Blob = blobCopy

// Send the put request to the async buffer channel.
s.putBuf <- putReq{namespace, group, uri, b, ttl}
return nil
}
Expand Down

0 comments on commit 3329923

Please sign in to comment.