Skip to content

Commit c9f3475

Browse files
authored
Merge pull request #4209 from gofiber/fix_session_release_flaky_tests
2 parents 6c19f48 + 99bb57a commit c9f3475

File tree

2 files changed

+30
-45
lines changed

2 files changed

+30
-45
lines changed

middleware/session/data.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,17 @@ func acquireData() *data {
4040
panic("unexpected type in data pool")
4141
}
4242

43+
// releaseData resets the data object and returns it to the pool.
44+
// d must not be used after calling this function.
45+
// If d is nil, releaseData is a no-op.
46+
func releaseData(d *data) {
47+
if d == nil {
48+
return
49+
}
50+
d.Reset()
51+
dataPool.Put(d)
52+
}
53+
4354
// Reset clears the data map and resets the data object.
4455
//
4556
// Usage:

middleware/session/data_test.go

Lines changed: 19 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,7 @@ func TestKeys(t *testing.T) {
1515
t.Run("Empty data", func(t *testing.T) {
1616
t.Parallel()
1717
d := acquireData()
18-
d.Reset() // Ensure clean state from pool
19-
defer dataPool.Put(d)
20-
defer d.Reset()
18+
defer releaseData(d)
2119
keys := d.Keys()
2220
require.Empty(t, keys, "Expected no keys in empty data")
2321
})
@@ -26,9 +24,7 @@ func TestKeys(t *testing.T) {
2624
t.Run("Single key", func(t *testing.T) {
2725
t.Parallel()
2826
d := acquireData()
29-
d.Reset() // Ensure clean state from pool
30-
defer dataPool.Put(d)
31-
defer d.Reset()
27+
defer releaseData(d)
3228
d.Set("key1", "value1")
3329
keys := d.Keys()
3430
require.Len(t, keys, 1, "Expected one key")
@@ -39,9 +35,7 @@ func TestKeys(t *testing.T) {
3935
t.Run("Multiple keys", func(t *testing.T) {
4036
t.Parallel()
4137
d := acquireData()
42-
d.Reset() // Ensure clean state from pool
43-
defer dataPool.Put(d)
44-
defer d.Reset()
38+
defer releaseData(d)
4539
d.Set("key1", "value1")
4640
d.Set("key2", "value2")
4741
d.Set("key3", "value3")
@@ -56,9 +50,7 @@ func TestKeys(t *testing.T) {
5650
t.Run("Concurrent access", func(t *testing.T) {
5751
t.Parallel()
5852
d := acquireData()
59-
d.Reset() // Ensure clean state from pool
60-
defer dataPool.Put(d)
61-
defer d.Reset()
53+
defer releaseData(d)
6254
d.Set("key1", "value1")
6355
d.Set("key2", "value2")
6456
d.Set("key3", "value3")
@@ -86,9 +78,7 @@ func TestData_Len(t *testing.T) {
8678
t.Run("Empty data", func(t *testing.T) {
8779
t.Parallel()
8880
d := acquireData()
89-
d.Reset() // Ensure clean state from pool
90-
defer dataPool.Put(d)
91-
defer d.Reset()
81+
defer releaseData(d)
9282
length := d.Len()
9383
require.Equal(t, 0, length, "Expected length to be 0 for empty data")
9484
})
@@ -97,9 +87,7 @@ func TestData_Len(t *testing.T) {
9787
t.Run("Single key", func(t *testing.T) {
9888
t.Parallel()
9989
d := acquireData()
100-
d.Reset() // Ensure clean state from pool
101-
defer dataPool.Put(d)
102-
defer d.Reset()
90+
defer releaseData(d)
10391
d.Set("key1", "value1")
10492
length := d.Len()
10593
require.Equal(t, 1, length, "Expected length to be 1 when one key is set")
@@ -109,9 +97,7 @@ func TestData_Len(t *testing.T) {
10997
t.Run("Multiple keys", func(t *testing.T) {
11098
t.Parallel()
11199
d := acquireData()
112-
d.Reset() // Ensure clean state from pool
113-
defer dataPool.Put(d)
114-
defer d.Reset()
100+
defer releaseData(d)
115101
d.Set("key1", "value1")
116102
d.Set("key2", "value2")
117103
d.Set("key3", "value3")
@@ -123,9 +109,7 @@ func TestData_Len(t *testing.T) {
123109
t.Run("Concurrent access", func(t *testing.T) {
124110
t.Parallel()
125111
d := acquireData()
126-
d.Reset() // Ensure clean state from pool
127-
defer dataPool.Put(d)
128-
defer d.Reset()
112+
defer releaseData(d)
129113
d.Set("key1", "value1")
130114
d.Set("key2", "value2")
131115
d.Set("key3", "value3")
@@ -153,9 +137,7 @@ func TestData_Get(t *testing.T) {
153137
t.Run("Nonexistent key", func(t *testing.T) {
154138
t.Parallel()
155139
d := acquireData()
156-
d.Reset() // Ensure clean state from pool
157-
defer dataPool.Put(d)
158-
defer d.Reset()
140+
defer releaseData(d)
159141
value := d.Get("nonexistent-key")
160142
require.Nil(t, value, "Expected nil for nonexistent key")
161143
})
@@ -164,9 +146,7 @@ func TestData_Get(t *testing.T) {
164146
t.Run("Existing key", func(t *testing.T) {
165147
t.Parallel()
166148
d := acquireData()
167-
d.Reset() // Ensure clean state from pool
168-
defer dataPool.Put(d)
169-
defer d.Reset()
149+
defer releaseData(d)
170150
d.Set("key1", "value1")
171151
value := d.Get("key1")
172152
require.Equal(t, "value1", value, "Expected value1 for key1")
@@ -180,8 +160,7 @@ func TestData_Reset(t *testing.T) {
180160
t.Run("Reset data", func(t *testing.T) {
181161
t.Parallel()
182162
d := acquireData()
183-
d.Reset() // Ensure clean state from pool
184-
defer dataPool.Put(d)
163+
defer releaseData(d)
185164
d.Set("key1", "value1")
186165
d.Set("key2", "value2")
187166
d.Reset()
@@ -210,10 +189,8 @@ func TestData_ResetPreservesAllocation(t *testing.T) {
210189
t.Parallel()
211190

212191
d := acquireData()
213-
d.Reset() // Ensure clean state from pool
214192
t.Cleanup(func() {
215-
d.Reset()
216-
dataPool.Put(d)
193+
releaseData(d)
217194
})
218195

219196
originalPtr := lockedMapPointer(d)
@@ -237,8 +214,7 @@ func TestData_PoolReuseDoesNotLeakEntries(t *testing.T) {
237214
acquired := make([]*data, 0, 6)
238215
t.Cleanup(func() {
239216
for _, item := range acquired {
240-
item.Reset()
241-
dataPool.Put(item)
217+
releaseData(item)
242218
}
243219
})
244220

@@ -248,13 +224,15 @@ func TestData_PoolReuseDoesNotLeakEntries(t *testing.T) {
248224
return d
249225
}
250226

251-
first := acquireWithCleanup()
227+
// Acquire first outside acquireWithCleanup to avoid double-put:
228+
// it is explicitly released via releaseData below.
229+
first := acquireData()
252230
first.Set("key1", "value1")
253231
first.Set("key2", "value2")
254232
first.Reset()
255233

256234
originalPtr := lockedMapPointer(first)
257-
dataPool.Put(first)
235+
releaseData(first)
258236

259237
var reused *data
260238
for i := 0; i < 5; i++ {
@@ -287,9 +265,7 @@ func TestData_Delete(t *testing.T) {
287265
t.Run("Delete existing key", func(t *testing.T) {
288266
t.Parallel()
289267
d := acquireData()
290-
d.Reset() // Ensure clean state from pool
291-
defer dataPool.Put(d)
292-
defer d.Reset()
268+
defer releaseData(d)
293269
d.Set("key1", "value1")
294270
d.Delete("key1")
295271
value := d.Get("key1")
@@ -300,9 +276,7 @@ func TestData_Delete(t *testing.T) {
300276
t.Run("Delete nonexistent key", func(t *testing.T) {
301277
t.Parallel()
302278
d := acquireData()
303-
d.Reset() // Ensure clean state from pool
304-
defer dataPool.Put(d)
305-
defer d.Reset()
279+
defer releaseData(d)
306280
d.Delete("nonexistent-key")
307281
// No assertion needed, just ensure no panic or error
308282
})

0 commit comments

Comments
 (0)