From 7c4f34de9a5e245412c56d0bebffec3a5662419b Mon Sep 17 00:00:00 2001 From: 1046102779 Date: Wed, 9 Feb 2022 10:05:46 +0800 Subject: [PATCH 1/6] todo(tracestate): drop right-most member in tracestate Signed-off-by: 1046102779 --- trace/tracestate.go | 17 +++++++---------- trace/tracestate_test.go | 17 ++++++++++++----- 2 files changed, 19 insertions(+), 15 deletions(-) diff --git a/trace/tracestate.go b/trace/tracestate.go index 86fc62c1d8f..5056981646b 100644 --- a/trace/tracestate.go +++ b/trace/tracestate.go @@ -179,17 +179,14 @@ func (ts TraceState) Insert(key, value string) (TraceState, error) { } cTS := ts.Delete(key) - if cTS.Len()+1 > maxListMembers { - // TODO (MrAlias): When the second version of the Trace Context - // specification is published this needs to not return an error. - // Instead it should drop the "right-most" member and insert the new - // member at the front. - // - // https://github.com/w3c/trace-context/pull/448 - return ts, fmt.Errorf("failed to insert: %w", errMemberNumber) + if cTS.Len()+1 <= maxListMembers { + cTS.list = append(cTS.list, member{}) } - - cTS.list = append(cTS.list, member{}) + // if tracestate's members > maxListMembers, defaultly + // it should drop the "right-most" member and insert the new + // member at the front. + // + // https://github.com/w3c/trace-context/pull/448 copy(cTS.list[1:], cTS.list) cTS.list[0] = m diff --git a/trace/tracestate_test.go b/trace/tracestate_test.go index edb89073de8..971cd732241 100644 --- a/trace/tracestate_test.go +++ b/trace/tracestate_test.go @@ -443,14 +443,21 @@ func TestTraceStateInsert(t *testing.T) { err: errInvalidKey, }, { - name: "too many entries", + name: "drop the right-most member(oldest) in queue", tracestate: maxMembers, key: "keyx", value: "valx", - expected: maxMembers, - err: errMemberNumber, - }, - } + expected: func() TraceState { + var traceState TraceState + traceState.list = make([]member, 0, len(maxMembers.list)) + traceState.list = append(traceState.list, member{ + Key: "keyx", + Value: "valx", + }) + traceState.list = append(traceState.list, maxMembers.list[:len(maxMembers.list)-1]...) + return traceState + }(), + }} for _, tc := range testCases { actual, err := tc.tracestate.Insert(tc.key, tc.value) From ea182284663da6bc2ab771bf76edfa13168637dd Mon Sep 17 00:00:00 2001 From: 1046102779 Date: Wed, 9 Feb 2022 17:28:36 +0800 Subject: [PATCH 2/6] fix(tracestate): drop right-most member in tracestate Signed-off-by: 1046102779 --- trace/tracestate_test.go | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/trace/tracestate_test.go b/trace/tracestate_test.go index 971cd732241..9223c8e508f 100644 --- a/trace/tracestate_test.go +++ b/trace/tracestate_test.go @@ -448,14 +448,13 @@ func TestTraceStateInsert(t *testing.T) { key: "keyx", value: "valx", expected: func() TraceState { - var traceState TraceState - traceState.list = make([]member, 0, len(maxMembers.list)) - traceState.list = append(traceState.list, member{ - Key: "keyx", - Value: "valx", - }) - traceState.list = append(traceState.list, maxMembers.list[:len(maxMembers.list)-1]...) - return traceState + // Prepend the new element and remove the oldest one, which is over capacity. + return TraceState{ + list: append( + []member{{Key: "keyx", Value: "valx"}}, + maxMembers.list[:len(maxMembers.list)-1]..., + ), + } }(), }} From b8c04b4910ac22a27fddca33e7bdfc4310f7f2cb Mon Sep 17 00:00:00 2001 From: 1046102779 Date: Wed, 9 Feb 2022 17:31:43 +0800 Subject: [PATCH 3/6] fix(tracestate): drop right-most member in tracestate Signed-off-by: 1046102779 --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b65fd81c2de..1b54fe0a7e1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm ### Changed - Jaeger exporter takes into additional 70 bytes overhead into consideration when sending UDP packets (#2489, #2512) +- For tracestate's members, prepend the new element and remove the oldest one, which is over capacity (#2592) ### Deprecated From 1d7b67b051fd24e5ea0bfb940c8f34c8830e4bae Mon Sep 17 00:00:00 2001 From: 1046102779 Date: Thu, 10 Feb 2022 09:09:23 +0800 Subject: [PATCH 4/6] fix(tracestate): drop right-most member in tracestate Signed-off-by: 1046102779 --- trace/tracestate.go | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/trace/tracestate.go b/trace/tracestate.go index 5056981646b..0f5e0a2ac1c 100644 --- a/trace/tracestate.go +++ b/trace/tracestate.go @@ -182,11 +182,7 @@ func (ts TraceState) Insert(key, value string) (TraceState, error) { if cTS.Len()+1 <= maxListMembers { cTS.list = append(cTS.list, member{}) } - // if tracestate's members > maxListMembers, defaultly - // it should drop the "right-most" member and insert the new - // member at the front. - // - // https://github.com/w3c/trace-context/pull/448 + // When the number of members exceeds capacity, drop the "right-most". copy(cTS.list[1:], cTS.list) cTS.list[0] = m From 48271581cca222a070791f6520498facea27cf11 Mon Sep 17 00:00:00 2001 From: 1046102779 Date: Wed, 16 Feb 2022 09:21:14 +0800 Subject: [PATCH 5/6] fix(tracestate): drop right-most member in tracestate Signed-off-by: 1046102779 --- trace/tracestate.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/trace/tracestate.go b/trace/tracestate.go index 0f5e0a2ac1c..c4f7089f8ea 100644 --- a/trace/tracestate.go +++ b/trace/tracestate.go @@ -171,7 +171,7 @@ func (ts TraceState) Get(key string) string { // specification an error is returned with the original TraceState. // // If adding a new list-member means the TraceState would have more members -// than is allowed an error is returned instead with the original TraceState. +// then it will drop the right-most member and return an nil error when capacity is exceeded. func (ts TraceState) Insert(key, value string) (TraceState, error) { m, err := newMember(key, value) if err != nil { From 3d95339cdd65a68db8470e59510abd6dced4e97b Mon Sep 17 00:00:00 2001 From: yellow chicks Date: Fri, 18 Feb 2022 09:32:35 +0800 Subject: [PATCH 6/6] Update trace/tracestate.go Co-authored-by: Tyler Yahn --- trace/tracestate.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/trace/tracestate.go b/trace/tracestate.go index c4f7089f8ea..7b7af6955f9 100644 --- a/trace/tracestate.go +++ b/trace/tracestate.go @@ -171,7 +171,8 @@ func (ts TraceState) Get(key string) string { // specification an error is returned with the original TraceState. // // If adding a new list-member means the TraceState would have more members -// then it will drop the right-most member and return an nil error when capacity is exceeded. +// then is allowed, the new list-member will be inserted and the right-most +// list-member will be dropped in the returned TraceState. func (ts TraceState) Insert(key, value string) (TraceState, error) { m, err := newMember(key, value) if err != nil {