Skip to content

Commit

Permalink
fix(tracestate): drop right-most member in tracestate (#2592)
Browse files Browse the repository at this point in the history
* todo(tracestate): drop right-most member in tracestate

Signed-off-by: 1046102779 <seachen@tencent.com>

* fix(tracestate): drop right-most member in tracestate

Signed-off-by: 1046102779 <seachen@tencent.com>

* fix(tracestate): drop right-most member in tracestate

Signed-off-by: 1046102779 <seachen@tencent.com>

* fix(tracestate): drop right-most member in tracestate

Signed-off-by: 1046102779 <seachen@tencent.com>

* fix(tracestate): drop right-most member in tracestate

Signed-off-by: 1046102779 <seachen@tencent.com>

* Update trace/tracestate.go

Co-authored-by: Tyler Yahn <MrAlias@users.noreply.github.com>

Co-authored-by: Tyler Yahn <MrAlias@users.noreply.github.com>
  • Loading branch information
1046102779 and MrAlias committed Feb 23, 2022
1 parent d51d1b3 commit 94b1848
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 16 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Expand Up @@ -20,6 +20,7 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm

### Changed

- For tracestate's members, prepend the new element and remove the oldest one, which is over capacity (#2592)
- Add event and link drop counts to the exported data from the `oltptrace` exporter. (#2601)

### Fixed
Expand Down
16 changes: 5 additions & 11 deletions trace/tracestate.go
Expand Up @@ -171,25 +171,19 @@ 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 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 {
return ts, err
}

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{})
// When the number of members exceeds capacity, drop the "right-most".
copy(cTS.list[1:], cTS.list)
cTS.list[0] = m

Expand Down
16 changes: 11 additions & 5 deletions trace/tracestate_test.go
Expand Up @@ -482,14 +482,20 @@ 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 {
// 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]...,
),
}
}(),
}}

for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
Expand Down

0 comments on commit 94b1848

Please sign in to comment.