cache2go
cache2go copied to clipboard
[bug]: delete operation in Foreach causes a deadlock
test code:
package main
import (
"fmt"
"time"
"github.com/muesli/cache2go"
)
func main() {
store := cache2go.Cache("test")
store.AddAboutToDeleteItemCallback(func(v *cache2go.CacheItem) {
fmt.Println("delete:", v)
})
key := "test1"
store.Add(key, time.Second*1800, "asdfasdfasd")
fmt.Println("fitst delete:")
store.Delete(key)
store.Add(key, time.Second*1800, "asdfasdfasd")
go func() {
time.Sleep(time.Second * 2)
fmt.Println("goroutine delete:")
store.Foreach(func(key interface{}, v *cache2go.CacheItem) {
fmt.Println("start")
store.Delete(key)
fmt.Println("end")
})
}()
time.Sleep(time.Second * 10)
}
Foreach polls for all, while Rlock is released only after the Foreach execution completes, resulting in a deadlock when deleted in Foreach
This error should be said that the user's use is not correct or the package design flaw itself?
test code:
package main import ( "fmt" "time" "github.com/muesli/cache2go" ) func main() { store := cache2go.Cache("test") store.AddAboutToDeleteItemCallback(func(v *cache2go.CacheItem) { fmt.Println("delete:", v) }) key := "test1" store.Add(key, time.Second*1800, "asdfasdfasd") fmt.Println("fitst delete:") store.Delete(key) store.Add(key, time.Second*1800, "asdfasdfasd") go func() { time.Sleep(time.Second * 2) fmt.Println("goroutine delete:") store.Foreach(func(key interface{}, v *cache2go.CacheItem) { fmt.Println("start") store.Delete(key) fmt.Println("end") }) }() time.Sleep(time.Second * 10) }Foreach polls for all, while Rlock is released only after the Foreach execution completes, resulting in a deadlock when deleted in Foreach
Yes,I try it and get a deadlock,trans func may not use Lock or RLock
merge PR #48