From 007d25d608ebcb020c1e901df6f803aba7361295 Mon Sep 17 00:00:00 2001 From: Benjamin Pannell Date: Wed, 25 Sep 2019 21:44:30 +0100 Subject: [PATCH 1/3] fix: Correct a potential race condition when serializing breadcrumbs --- breadcrumbs.go | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/breadcrumbs.go b/breadcrumbs.go index b966e5a..e60057f 100644 --- a/breadcrumbs.go +++ b/breadcrumbs.go @@ -66,7 +66,7 @@ type breadcrumbsList struct { Head *breadcrumbListNode Tail *breadcrumbListNode Length int - mutex sync.Mutex + mutex sync.RWMutex } func (l *breadcrumbsList) Class() string { @@ -82,7 +82,7 @@ func (l *breadcrumbsList) WithSize(length int) BreadcrumbsList { for l.Length > l.MaxLength { if l.Head == nil { break - } + } l.Head = l.Head.Next l.Length-- } @@ -157,6 +157,9 @@ func (l *breadcrumbsList) append(b Breadcrumb) { } func (l *breadcrumbsList) list() []Breadcrumb { + l.mutex.RLock() + defer l.mutex.RUnlock() + current := l.Head out := []Breadcrumb{} for current != nil { From 67286c02ba36bb83c6932c233ae9f1174f847976 Mon Sep 17 00:00:00 2001 From: Benjamin Pannell Date: Wed, 25 Sep 2019 21:45:05 +0100 Subject: [PATCH 2/3] fix: Correct an issue with the use of breadcrumbs.WithSize(0) to clear the buffer --- breadcrumbs.go | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/breadcrumbs.go b/breadcrumbs.go index e60057f..bf330f0 100644 --- a/breadcrumbs.go +++ b/breadcrumbs.go @@ -79,10 +79,13 @@ func (l *breadcrumbsList) WithSize(length int) BreadcrumbsList { l.MaxLength = length - for l.Length > l.MaxLength { - if l.Head == nil { - break + if length == 0 { + l.Head = nil + l.Tail = nil + l.Length = 0 } + + for l.Length > l.MaxLength && l.Head != nil { l.Head = l.Head.Next l.Length-- } @@ -147,10 +150,7 @@ func (l *breadcrumbsList) append(b Breadcrumb) { l.Tail = n l.Length++ - for l.Length > l.MaxLength { - if l.Head == nil { - break - } + for l.Length > l.MaxLength && l.Head != nil { l.Head = l.Head.Next l.Length-- } From 7a2d535939376ef0adf311effead922e97ab2175 Mon Sep 17 00:00:00 2001 From: Benjamin Pannell Date: Wed, 25 Sep 2019 21:57:05 +0100 Subject: [PATCH 3/3] test: Add tests to ensure that the new WithSize(0) works --- breadcrumbs_test.go | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/breadcrumbs_test.go b/breadcrumbs_test.go index b5b649c..c453397 100644 --- a/breadcrumbs_test.go +++ b/breadcrumbs_test.go @@ -214,6 +214,21 @@ func TestBreadcrumbs(t *testing.T) { "index": 2, }) }) + + Convey("Should empty the list if the size is set to 0", func() { + var b Breadcrumb + for i := 0; i < 3; i++ { + b = l.NewDefault(map[string]interface{}{ + "index": i, + }) + So(b, ShouldNotBeNil) + } + + l.WithSize(0).WithSize(3) + So(ll.Length, ShouldEqual, 0) + So(ll.Head, ShouldBeNil) + So(ll.Tail, ShouldBeNil) + }) }) Convey("append()", func() {