Skip to content

Commit e10915f

Browse files
committed
dynacache: Fix potential deadlocks on panics in GetOrCreate
1 parent ec3890a commit e10915f

File tree

3 files changed

+28
-1
lines changed

3 files changed

+28
-1
lines changed

cache/dynacache/dynacache_test.go

+25
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,10 @@
1414
package dynacache
1515

1616
import (
17+
"fmt"
1718
"path/filepath"
1819
"testing"
20+
"time"
1921

2022
qt "github.com/frankban/quicktest"
2123
"github.com/gohugoio/hugo/common/loggers"
@@ -165,6 +167,29 @@ func TestClear(t *testing.T) {
165167
cache.adjustCurrentMaxSize()
166168
}
167169

170+
func TestPanicInCreate(t *testing.T) {
171+
t.Parallel()
172+
c := qt.New(t)
173+
cache := newTestCache(t)
174+
175+
p1 := GetOrCreatePartition[string, testItem](cache, "/aaaa/bbbb", OptionsPartition{Weight: 30, ClearWhen: ClearOnRebuild})
176+
177+
for i := 0; i < 3; i++ {
178+
for j := 0; j < 3; j++ {
179+
_, err := p1.GetOrCreate(fmt.Sprintf("panic1-%d", i), func(string) (testItem, error) {
180+
panic("failed")
181+
})
182+
183+
c.Assert(err, qt.Not(qt.IsNil))
184+
185+
_, err = p1.GetOrCreateWitTimeout(fmt.Sprintf("panic2-%d", i), 10*time.Second, func(string) (testItem, error) {
186+
panic("failed")
187+
})
188+
c.Assert(err, qt.Not(qt.IsNil))
189+
}
190+
}
191+
}
192+
168193
func TestAdjustCurrentMaxSize(t *testing.T) {
169194
t.Parallel()
170195
c := qt.New(t)

go.mod

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ require (
1616
github.com/bep/gowebp v0.3.0
1717
github.com/bep/helpers v0.5.0
1818
github.com/bep/imagemeta v0.8.1
19-
github.com/bep/lazycache v0.4.0
19+
github.com/bep/lazycache v0.6.0
2020
github.com/bep/logg v0.4.0
2121
github.com/bep/mclib v1.20400.20402
2222
github.com/bep/overlayfs v0.9.2

go.sum

+2
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,8 @@ github.com/bep/imagemeta v0.8.1 h1:tjZLPRftjxU7PTI87o5e5WKOFQ4S9S0engiP1OTpJTI=
143143
github.com/bep/imagemeta v0.8.1/go.mod h1:5piPAq5Qomh07m/dPPCLN3mDJyFusvUG7VwdRD/vX0s=
144144
github.com/bep/lazycache v0.4.0 h1:X8yVyWNVupPd4e1jV7efi3zb7ZV/qcjKQgIQ5aPbkYI=
145145
github.com/bep/lazycache v0.4.0/go.mod h1:NmRm7Dexh3pmR1EignYR8PjO2cWybFQ68+QgY3VMCSc=
146+
github.com/bep/lazycache v0.6.0 h1:0vCgFo7TBtMQpSx64jnH1sagmw0ZougIFRpsqPHTa5U=
147+
github.com/bep/lazycache v0.6.0/go.mod h1:NmRm7Dexh3pmR1EignYR8PjO2cWybFQ68+QgY3VMCSc=
146148
github.com/bep/logg v0.4.0 h1:luAo5mO4ZkhA5M1iDVDqDqnBBnlHjmtZF6VAyTp+nCQ=
147149
github.com/bep/logg v0.4.0/go.mod h1:Ccp9yP3wbR1mm++Kpxet91hAZBEQgmWgFgnXX3GkIV0=
148150
github.com/bep/mclib v1.20400.20402 h1:olpCE2WSPpOAbFE1R4hnftSEmQ34+xzy2HRzd0m69rA=

0 commit comments

Comments
 (0)