From bf7dd0dcc5cf7bb4b1ea033385fb2af12ddc98da Mon Sep 17 00:00:00 2001 From: Mikhail Mazurskiy Date: Wed, 6 Mar 2024 20:38:33 +1100 Subject: [PATCH] Remove Sortable --- attribute/set.go | 36 +++++++++++++++--------------------- 1 file changed, 15 insertions(+), 21 deletions(-) diff --git a/attribute/set.go b/attribute/set.go index 108a4afd1d8f..8eaec8c19036 100644 --- a/attribute/set.go +++ b/attribute/set.go @@ -6,8 +6,8 @@ package attribute // import "go.opentelemetry.io/otel/attribute" import ( "encoding/json" "reflect" + "slices" "sort" - "sync" ) type ( @@ -45,12 +45,6 @@ var ( iface: [0]KeyValue{}, }, } - - // sortables is a pool of Sortables used to create Sets with a user does - // not provide one. - sortables = sync.Pool{ - New: func() interface{} { return new(Sortable) }, - } ) // EmptySet returns a reference to a Set with no elements. @@ -180,9 +174,7 @@ func NewSet(kvs ...KeyValue) Set { if len(kvs) == 0 { return empty() } - srt := sortables.Get().(*Sortable) - s, _ := NewSetWithSortableFiltered(kvs, srt, nil) - sortables.Put(srt) + s, _ := NewSetWithSortableFiltered(kvs, nil, nil) return s } @@ -190,12 +182,12 @@ func NewSet(kvs ...KeyValue) Set { // NewSetWithSortableFiltered for more details. // // This call includes a Sortable option as a memory optimization. -func NewSetWithSortable(kvs []KeyValue, tmp *Sortable) Set { +func NewSetWithSortable(kvs []KeyValue, _ *Sortable) Set { // Check for empty set. if len(kvs) == 0 { return empty() } - s, _ := NewSetWithSortableFiltered(kvs, tmp, nil) + s, _ := NewSetWithSortableFiltered(kvs, nil, nil) return s } @@ -209,9 +201,7 @@ func NewSetWithFiltered(kvs []KeyValue, filter Filter) (Set, []KeyValue) { if len(kvs) == 0 { return empty(), nil } - srt := sortables.Get().(*Sortable) - s, filtered := NewSetWithSortableFiltered(kvs, srt, filter) - sortables.Put(srt) + s, filtered := NewSetWithSortableFiltered(kvs, nil, filter) return s, filtered } @@ -238,19 +228,23 @@ func NewSetWithFiltered(kvs []KeyValue, filter Filter) (Set, []KeyValue) { // // The second []KeyValue return value is a list of attributes that were // excluded by the Filter (if non-nil). -func NewSetWithSortableFiltered(kvs []KeyValue, tmp *Sortable, filter Filter) (Set, []KeyValue) { +func NewSetWithSortableFiltered(kvs []KeyValue, _ *Sortable, filter Filter) (Set, []KeyValue) { // Check for empty set. if len(kvs) == 0 { return empty(), nil } - *tmp = kvs - // Stable sort so the following de-duplication can implement // last-value-wins semantics. - sort.Stable(tmp) - - *tmp = nil + slices.SortStableFunc(kvs, func(a, b KeyValue) int { + if a.Key == b.Key { + return 0 + } + if a.Key < b.Key { + return -1 + } + return 1 + }) position := len(kvs) - 1 offset := position - 1