Skip to content

Commit 0e4cf0a

Browse files
authored
Merge pull request #1155 from ydb-platform/simplify
simplify lastUsage code
2 parents 895d516 + e079f4f commit 0e4cf0a

File tree

4 files changed

+36
-38
lines changed

4 files changed

+36
-38
lines changed

internal/conn/conn.go

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import (
77
"sync/atomic"
88
"time"
99

10-
"github.com/jonboulle/clockwork"
1110
"github.com/ydb-platform/ydb-go-genproto/protos/Ydb"
1211
"google.golang.org/grpc"
1312
"google.golang.org/grpc/connectivity"
@@ -327,7 +326,7 @@ func (c *conn) Invoke(
327326
return c.wrapError(err)
328327
}
329328

330-
defer c.lastUsage.Lock()()
329+
defer c.lastUsage.Touch()()
331330

332331
ctx, traceID, err := meta.TraceID(ctx)
333332
if err != nil {
@@ -412,7 +411,7 @@ func (c *conn) NewStream(
412411
return nil, c.wrapError(err)
413412
}
414413

415-
defer c.lastUsage.Lock()()
414+
defer c.lastUsage.Touch()()
416415

417416
ctx, traceID, err := meta.TraceID(ctx)
418417
if err != nil {
@@ -487,15 +486,11 @@ func withOnTransportError(onTransportError func(ctx context.Context, cc Conn, ca
487486
}
488487

489488
func newConn(e endpoint.Endpoint, config Config, opts ...option) *conn {
490-
clock := clockwork.NewRealClock()
491489
c := &conn{
492-
endpoint: e,
493-
config: config,
494-
done: make(chan struct{}),
495-
lastUsage: &lastUsage{
496-
t: clock.Now(),
497-
clock: clock,
498-
},
490+
endpoint: e,
491+
config: config,
492+
done: make(chan struct{}),
493+
lastUsage: newLastUsage(nil),
499494
}
500495
c.state.Store(uint32(Created))
501496
for _, opt := range opts {

internal/conn/grpc_client_stream.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ func (s *grpcClientStream) CloseSend() (err error) {
3030
onDone(err)
3131
}()
3232

33-
defer s.c.lastUsage.Lock()()
33+
defer s.c.lastUsage.Touch()()
3434

3535
err = s.ClientStream.CloseSend()
3636

@@ -61,7 +61,7 @@ func (s *grpcClientStream) SendMsg(m interface{}) (err error) {
6161
onDone(err)
6262
}()
6363

64-
defer s.c.lastUsage.Lock()()
64+
defer s.c.lastUsage.Touch()()
6565

6666
err = s.ClientStream.SendMsg(m)
6767

@@ -100,7 +100,7 @@ func (s *grpcClientStream) RecvMsg(m interface{}) (err error) {
100100
onDone(err)
101101
}()
102102

103-
defer s.c.lastUsage.Lock()()
103+
defer s.c.lastUsage.Touch()()
104104

105105
defer func() {
106106
if err != nil {

internal/conn/last_usage.go

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -6,40 +6,42 @@ import (
66
"time"
77

88
"github.com/jonboulle/clockwork"
9-
10-
"github.com/ydb-platform/ydb-go-sdk/v3/internal/xsync"
119
)
1210

1311
type lastUsage struct {
1412
locks atomic.Int64
15-
mu xsync.RWMutex
16-
t time.Time
13+
t atomic.Pointer[time.Time]
1714
clock clockwork.Clock
1815
}
1916

20-
func (l *lastUsage) Get() time.Time {
21-
if l.locks.CompareAndSwap(0, 1) {
22-
defer func() {
23-
l.locks.Add(-1)
24-
}()
17+
func newLastUsage(clock clockwork.Clock) *lastUsage {
18+
if clock == nil {
19+
clock = clockwork.NewRealClock()
20+
}
21+
now := clock.Now()
22+
usage := &lastUsage{
23+
clock: clock,
24+
}
25+
usage.t.Store(&now)
2526

26-
l.mu.RLock()
27-
defer l.mu.RUnlock()
27+
return usage
28+
}
2829

29-
return l.t
30+
func (l *lastUsage) Get() time.Time {
31+
if l.locks.Load() == 0 {
32+
return *l.t.Load()
3033
}
3134

3235
return l.clock.Now()
3336
}
3437

35-
func (l *lastUsage) Lock() (releaseFunc func()) {
38+
func (l *lastUsage) Touch() (releaseFunc func()) {
3639
l.locks.Add(1)
3740

3841
return sync.OnceFunc(func() {
3942
if l.locks.Add(-1) == 0 {
40-
l.mu.WithLock(func() {
41-
l.t = l.clock.Now()
42-
})
43+
now := l.clock.Now()
44+
l.t.Store(&now)
4345
}
4446
})
4547
}

internal/conn/last_usage_test.go

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,12 @@ func Test_lastUsage_Lock(t *testing.T) {
1313
start := time.Unix(0, 0)
1414
clock := clockwork.NewFakeClockAt(start)
1515
lu := &lastUsage{
16-
t: start,
1716
clock: clock,
1817
}
18+
lu.t.Store(&start)
1919
t1 := lu.Get()
2020
require.Equal(t, start, t1)
21-
f := lu.Lock()
21+
f := lu.Touch()
2222
clock.Advance(time.Hour)
2323
t2 := lu.Get()
2424
require.Equal(t, start.Add(time.Hour), t2)
@@ -34,19 +34,19 @@ func Test_lastUsage_Lock(t *testing.T) {
3434
start := time.Unix(0, 0)
3535
clock := clockwork.NewFakeClockAt(start)
3636
lu := &lastUsage{
37-
t: start,
3837
clock: clock,
3938
}
39+
lu.t.Store(&start)
4040
t1 := lu.Get()
4141
require.Equal(t, start, t1)
42-
f1 := lu.Lock()
42+
f1 := lu.Touch()
4343
clock.Advance(time.Hour)
4444
t2 := lu.Get()
4545
require.Equal(t, start.Add(time.Hour), t2)
46-
f2 := lu.Lock()
46+
f2 := lu.Touch()
4747
clock.Advance(time.Hour)
4848
f1()
49-
f3 := lu.Lock()
49+
f3 := lu.Touch()
5050
clock.Advance(time.Hour)
5151
t3 := lu.Get()
5252
require.Equal(t, start.Add(3*time.Hour), t3)
@@ -72,17 +72,18 @@ func Test_lastUsage_Lock(t *testing.T) {
7272
start := time.Unix(0, 0)
7373
clock := clockwork.NewFakeClockAt(start)
7474
lu := &lastUsage{
75-
t: start,
7675
clock: clock,
7776
}
77+
lu.t.Store(&start)
78+
7879
func() {
7980
t1 := lu.Get()
8081
require.Equal(t, start, t1)
8182
clock.Advance(time.Hour)
8283
t2 := lu.Get()
8384
require.Equal(t, start, t2)
8485
clock.Advance(time.Hour)
85-
defer lu.Lock()()
86+
defer lu.Touch()()
8687
t3 := lu.Get()
8788
require.Equal(t, start.Add(2*time.Hour), t3)
8889
clock.Advance(time.Hour)

0 commit comments

Comments
 (0)