From 39244350e85345f7ce8bc3a827cc965658cc98a6 Mon Sep 17 00:00:00 2001 From: matst80 Date: Tue, 12 Nov 2024 20:51:39 +0100 Subject: [PATCH] safe truncation --- cart-grain.go | 9 +++++---- grain-pool.go | 15 ++++++++++++--- synced-pool.go | 13 +++++++++---- 3 files changed, 26 insertions(+), 11 deletions(-) diff --git a/cart-grain.go b/cart-grain.go index 0b74014..05bddff 100644 --- a/cart-grain.go +++ b/cart-grain.go @@ -238,7 +238,6 @@ func (c *CartGrain) HandleMessage(message *Message, isReplay bool) (*CallResult, if item.Id == int(msg.Id) { if item.Quantity <= int(msg.Quantity) { c.Items = append(c.Items[:i], c.Items[i+1:]...) - } else { item.Quantity -= int(msg.Quantity) } @@ -253,13 +252,15 @@ func (c *CartGrain) HandleMessage(message *Message, isReplay bool) (*CallResult, if !ok { err = fmt.Errorf("expected RemoveItem") } else { - for i, item := range c.Items { + items := make([]*CartItem, 0, len(c.Items)) + for _, item := range c.Items { if item.Id == int(msg.Id) { c.TotalPrice -= item.Price * int64(item.Quantity) - c.Items = append(c.Items[:i], c.Items[i+1:]...) - break + } else { + items = append(items, item) } } + c.Items = items } case SetDeliveryType: msg, ok := message.Content.(*messages.SetDelivery) diff --git a/grain-pool.go b/grain-pool.go index 081e2e5..ffeb779 100644 --- a/grain-pool.go +++ b/grain-pool.go @@ -87,12 +87,21 @@ func (p *GrainLocalPool) Purge() { if item.Expires.Before(time.Now()) { if item.Grain.GetLastChange() > keepChanged { log.Printf("Expired item %s changed, keeping", item.Grain.GetId()) - p.expiry = append(p.expiry[:i], p.expiry[i+1:]...) - p.expiry = append(p.expiry, item) + if i < len(p.expiry)-1 { + p.expiry = append(p.expiry[:i], p.expiry[i+1:]...) + p.expiry = append(p.expiry, item) + } else { + p.expiry = append(p.expiry[:i], item) + } + } else { log.Printf("Item %s expired", item.Grain.GetId()) delete(p.grains, item.Grain.GetId()) - p.expiry = append(p.expiry[:i], p.expiry[i+1:]...) + if i < len(p.expiry)-1 { + p.expiry = append(p.expiry[:i], p.expiry[i+1:]...) + } else { + p.expiry = p.expiry[:i] + } } } else { break diff --git a/synced-pool.go b/synced-pool.go index e463569..f832c22 100644 --- a/synced-pool.go +++ b/synced-pool.go @@ -255,14 +255,19 @@ func (p *SyncedPool) ExcludeKnown(hosts []string) []string { } func (p *SyncedPool) RemoveHost(host *RemoteHost) { - for i, r := range p.remotes { + toKeep := make([]*RemoteHost, 0, len(p.remotes)) + for _, r := range p.remotes { if r == host { p.RemoveHostMappedCarts(r) - p.remotes = append(p.remotes[:i], p.remotes[i+1:]...) - connectedRemotes.Set(float64(len(p.remotes))) - return + + } else { + toKeep = append(toKeep, r) } } + + p.remotes = toKeep + + connectedRemotes.Set(float64(len(p.remotes))) } func (p *SyncedPool) RemoveHostMappedCarts(host *RemoteHost) {