From 6b2fc1f37fb0ccd80422bf9f7c360dba31c248d9 Mon Sep 17 00:00:00 2001 From: tidwall Date: Thu, 29 Nov 2018 15:15:26 -0800 Subject: [PATCH] Fix multiple matches on different key hooks --- internal/server/aof.go | 3 +++ internal/server/hooks.go | 23 ++++++++++++++++------- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/internal/server/aof.go b/internal/server/aof.go index 73a70845..26c31158 100644 --- a/internal/server/aof.go +++ b/internal/server/aof.go @@ -211,6 +211,9 @@ func (server *Server) getQueueCandidates(d *commandDetails) []*Hook { []float64{rect.Max.X, rect.Max.Y}, func(_, _ []float64, value interface{}) bool { hook := value.(*Hook) + if hook.Key != d.key { + return true + } var found bool for _, candidate := range candidates { if candidate == hook { diff --git a/internal/server/hooks.go b/internal/server/hooks.go index 7b9d22c3..b473fe20 100644 --- a/internal/server/hooks.go +++ b/internal/server/hooks.go @@ -233,11 +233,9 @@ func (c *Server) cmdDelHook(msg *Message, chanCmd bool) ( } if hook, ok := c.hooks[name]; ok && hook.channel == chanCmd { hook.Close() + // remove hook from maps delete(c.hooks, hook.Name) delete(c.hooksOut, hook.Name) - - d.updated = true - // remove hook from spatial index if hook != nil && hook.Fence != nil && hook.Fence.obj != nil { rect := hook.Fence.obj.Rect() @@ -246,6 +244,7 @@ func (c *Server) cmdDelHook(msg *Message, chanCmd bool) ( []float64{rect.Max.X, rect.Max.Y}, hook) } + d.updated = true } d.timestamp = time.Now() @@ -277,16 +276,26 @@ func (c *Server) cmdPDelHook(msg *Message, channel bool) ( } count := 0 - for name, h := range c.hooks { - if h.channel != channel { + for name, hook := range c.hooks { + if hook.channel != channel { continue } match, _ := glob.Match(pattern, name) if !match { continue } - h.Close() - delete(c.hooks, h.Name) + hook.Close() + // remove hook from maps + delete(c.hooks, hook.Name) + delete(c.hooksOut, hook.Name) + // remove hook from spatial index + if hook != nil && hook.Fence != nil && hook.Fence.obj != nil { + rect := hook.Fence.obj.Rect() + c.hookTree.Delete( + []float64{rect.Min.X, rect.Min.Y}, + []float64{rect.Max.X, rect.Max.Y}, + hook) + } d.updated = true count++ }