Skip to content

Commit 5069a4f

Browse files
committed
Merge branch 'main' into unreg-async
2 parents 288e465 + ca4cdfe commit 5069a4f

File tree

5 files changed

+25
-23
lines changed

5 files changed

+25
-23
lines changed

CHANGELOG.md

+3
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm
1818

1919
- The deprecated `go.opentelemetry.io/otel/sdk/metric/view` package is removed. (#3520)
2020

21+
### Changed
22+
23+
- Global error handler uses an atomic value instead of a mutex. (#3543)
2124

2225
## [1.11.2/0.34.0] 2022-12-05
2326

handler.go

+12-13
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@ package otel // import "go.opentelemetry.io/otel"
1717
import (
1818
"log"
1919
"os"
20-
"sync"
20+
"sync/atomic"
21+
"unsafe"
2122
)
2223

2324
var (
@@ -34,28 +35,26 @@ var (
3435
)
3536

3637
type delegator struct {
37-
lock *sync.RWMutex
38-
eh ErrorHandler
38+
delegate unsafe.Pointer
3939
}
4040

4141
func (d *delegator) Handle(err error) {
42-
d.lock.RLock()
43-
defer d.lock.RUnlock()
44-
d.eh.Handle(err)
42+
d.getDelegate().Handle(err)
43+
}
44+
45+
func (d *delegator) getDelegate() ErrorHandler {
46+
return *(*ErrorHandler)(atomic.LoadPointer(&d.delegate))
4547
}
4648

4749
// setDelegate sets the ErrorHandler delegate.
4850
func (d *delegator) setDelegate(eh ErrorHandler) {
49-
d.lock.Lock()
50-
defer d.lock.Unlock()
51-
d.eh = eh
51+
atomic.StorePointer(&d.delegate, unsafe.Pointer(&eh))
5252
}
5353

5454
func defaultErrorHandler() *delegator {
55-
return &delegator{
56-
lock: &sync.RWMutex{},
57-
eh: &errLogger{l: log.New(os.Stderr, "", log.LstdFlags)},
58-
}
55+
d := &delegator{}
56+
d.setDelegate(&errLogger{l: log.New(os.Stderr, "", log.LstdFlags)})
57+
return d
5958
}
6059

6160
// errLogger logs errors if no delegate is set, otherwise they are delegated.

handler_test.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ type HandlerTestSuite struct {
5454

5555
func (s *HandlerTestSuite) SetupSuite() {
5656
s.errCatcher = new(testErrCatcher)
57-
s.origHandler = globalErrorHandler.eh
57+
s.origHandler = globalErrorHandler.getDelegate()
5858

5959
globalErrorHandler.setDelegate(&errLogger{l: log.New(s.errCatcher, "", 0)})
6060
}
@@ -111,12 +111,12 @@ func (s *HandlerTestSuite) TestAllowMultipleSets() {
111111
secondary := &errLogger{l: log.New(notUsed, "", 0)}
112112
SetErrorHandler(secondary)
113113
s.Require().Same(GetErrorHandler(), globalErrorHandler, "set changed globalErrorHandler")
114-
s.Require().Same(globalErrorHandler.eh, secondary, "new Handler not set")
114+
s.Require().Same(globalErrorHandler.getDelegate(), secondary, "new Handler not set")
115115

116116
tertiary := &errLogger{l: log.New(notUsed, "", 0)}
117117
SetErrorHandler(tertiary)
118118
s.Require().Same(GetErrorHandler(), globalErrorHandler, "set changed globalErrorHandler")
119-
s.Assert().Same(globalErrorHandler.eh, tertiary, "user Handler not overridden")
119+
s.Assert().Same(globalErrorHandler.getDelegate(), tertiary, "user Handler not overridden")
120120
}
121121

122122
func TestHandlerTestSuite(t *testing.T) {

internal/tools/go.mod

+2-2
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ require (
1313
go.opentelemetry.io/build-tools/dbotconf v0.3.0
1414
go.opentelemetry.io/build-tools/multimod v0.3.0
1515
go.opentelemetry.io/build-tools/semconvgen v0.3.0
16-
golang.org/x/tools v0.3.0
16+
golang.org/x/tools v0.4.0
1717
)
1818

1919
require (
@@ -188,7 +188,7 @@ require (
188188
golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e // indirect
189189
golang.org/x/exp/typeparams v0.0.0-20220827204233-334a2380cb91 // indirect
190190
golang.org/x/mod v0.7.0 // indirect
191-
golang.org/x/net v0.2.0 // indirect
191+
golang.org/x/net v0.3.0 // indirect
192192
golang.org/x/sync v0.1.0 // indirect
193193
golang.org/x/sys v0.3.0 // indirect
194194
golang.org/x/text v0.5.0 // indirect

internal/tools/go.sum

+5-5
Original file line numberDiff line numberDiff line change
@@ -730,8 +730,8 @@ golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qx
730730
golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
731731
golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
732732
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
733-
golang.org/x/net v0.2.0 h1:sZfSu1wtKLGlWI4ZZayP0ck9Y73K1ynO6gqzTdBVdPU=
734-
golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY=
733+
golang.org/x/net v0.3.0 h1:VWL6FNY2bEEmsGVKabSlHu5Irp34xmMRoqb/9lF9lxk=
734+
golang.org/x/net v0.3.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE=
735735
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
736736
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
737737
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@@ -822,7 +822,7 @@ golang.org/x/sys v0.3.0 h1:w8ZOecv6NaNa/zC8944JTU3vz4u6Lagfk4RPQxv92NQ=
822822
golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
823823
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
824824
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
825-
golang.org/x/term v0.2.0 h1:z85xZCsEl7bi/KwbNADeBYoOP0++7W1ipu+aGnpwzRM=
825+
golang.org/x/term v0.3.0 h1:qoo4akIqOcDME5bhc/NgxUdovd6BSS2uMsVjB56q1xI=
826826
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
827827
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
828828
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@@ -917,8 +917,8 @@ golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=
917917
golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E=
918918
golang.org/x/tools v0.1.11/go.mod h1:SgwaegtQh8clINPpECJMqnxLv9I09HLqnW3RMqW0CA4=
919919
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
920-
golang.org/x/tools v0.3.0 h1:SrNbZl6ECOS1qFzgTdQfWXZM9XBkiA6tkFrH9YSTPHM=
921-
golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k=
920+
golang.org/x/tools v0.4.0 h1:7mTAgkunk3fr4GAloyyCasadO6h9zSsQZbwvcaIciV4=
921+
golang.org/x/tools v0.4.0/go.mod h1:UE5sM2OK9E/d67R0ANs2xJizIymRP5gJU295PvKXxjQ=
922922
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
923923
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
924924
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=

0 commit comments

Comments
 (0)