1
0
Fork 0
mirror of https://github.com/anyproto/any-sync.git synced 2025-06-09 17:45:03 +09:00

remove multiconn.LastUsage + fix peer gc

This commit is contained in:
Sergey Cherepanov 2023-06-13 13:40:13 +02:00
parent 05b479e5fa
commit 733027d798
No known key found for this signature in database
GPG key ID: 87F8EDE8FBDF637C
5 changed files with 13 additions and 30 deletions

View file

@ -25,6 +25,7 @@ deps:
go mod download go mod download
go build -o deps storj.io/drpc/cmd/protoc-gen-go-drpc go build -o deps storj.io/drpc/cmd/protoc-gen-go-drpc
go build -o deps github.com/gogo/protobuf/protoc-gen-gogofaster go build -o deps github.com/gogo/protobuf/protoc-gen-gogofaster
go build -o deps github.com/golang/mock/mockgen
test: test:
go test ./... --cover go test ./... --cover

View file

@ -35,6 +35,7 @@ func NewPeer(mc transport.MultiConn, ctrl connCtrl) (p Peer, err error) {
active: map[*subConn]struct{}{}, active: map[*subConn]struct{}{},
MultiConn: mc, MultiConn: mc,
ctrl: ctrl, ctrl: ctrl,
created: time.Now(),
} }
if pr.id, err = CtxPeerId(ctx); err != nil { if pr.id, err = CtxPeerId(ctx); err != nil {
return return
@ -74,6 +75,8 @@ type peer struct {
mu sync.Mutex mu sync.Mutex
created time.Time
transport.MultiConn transport.MultiConn
} }
@ -190,14 +193,14 @@ func (p *peer) serve(conn net.Conn) (err error) {
} }
func (p *peer) TryClose(objectTTL time.Duration) (res bool, err error) { func (p *peer) TryClose(objectTTL time.Duration) (res bool, err error) {
p.gc(objectTTL) aliveCount := p.gc(objectTTL)
if time.Now().Sub(p.LastUsage()) < objectTTL { if aliveCount == 0 && p.created.Add(time.Minute).Before(time.Now()) {
return false, nil
}
return true, p.Close() return true, p.Close()
} }
return false, nil
}
func (p *peer) gc(ttl time.Duration) { func (p *peer) gc(ttl time.Duration) (aliveCount int) {
p.mu.Lock() p.mu.Lock()
defer p.mu.Unlock() defer p.mu.Unlock()
minLastUsage := time.Now().Add(-ttl) minLastUsage := time.Now().Add(-ttl)
@ -238,6 +241,7 @@ func (p *peer) gc(ttl time.Duration) {
continue continue
} }
} }
return len(p.active) + len(p.inactive)
} }
func (p *peer) Close() (err error) { func (p *peer) Close() (err error) {

View file

@ -64,11 +64,9 @@ func TestPeerAccept(t *testing.T) {
} }
func TestPeer_TryClose(t *testing.T) { func TestPeer_TryClose(t *testing.T) {
t.Run("ttl", func(t *testing.T) { t.Run("not close in first minute", func(t *testing.T) {
fx := newFixture(t, "p1") fx := newFixture(t, "p1")
defer fx.finish() defer fx.finish()
lu := time.Now()
fx.mc.EXPECT().LastUsage().Return(lu)
res, err := fx.TryClose(time.Second) res, err := fx.TryClose(time.Second)
require.NoError(t, err) require.NoError(t, err)
assert.False(t, res) assert.False(t, res)
@ -76,8 +74,7 @@ func TestPeer_TryClose(t *testing.T) {
t.Run("close", func(t *testing.T) { t.Run("close", func(t *testing.T) {
fx := newFixture(t, "p1") fx := newFixture(t, "p1")
defer fx.finish() defer fx.finish()
lu := time.Now().Add(-time.Second * 2) fx.peer.created = fx.peer.created.Add(-time.Minute * 2)
fx.mc.EXPECT().LastUsage().Return(lu)
res, err := fx.TryClose(time.Second) res, err := fx.TryClose(time.Second)
require.NoError(t, err) require.NoError(t, err)
assert.True(t, res) assert.True(t, res)
@ -85,8 +82,7 @@ func TestPeer_TryClose(t *testing.T) {
t.Run("gc", func(t *testing.T) { t.Run("gc", func(t *testing.T) {
fx := newFixture(t, "p1") fx := newFixture(t, "p1")
defer fx.finish() defer fx.finish()
now := time.Now() //now := time.Now()
fx.mc.EXPECT().LastUsage().Return(now.Add(time.Millisecond * 100))
// make one inactive // make one inactive
in, out := net.Pipe() in, out := net.Pipe()

View file

@ -8,7 +8,6 @@ import (
context "context" context "context"
net "net" net "net"
reflect "reflect" reflect "reflect"
time "time"
transport "github.com/anyproto/any-sync/net/transport" transport "github.com/anyproto/any-sync/net/transport"
gomock "github.com/golang/mock/gomock" gomock "github.com/golang/mock/gomock"
@ -158,20 +157,6 @@ func (mr *MockMultiConnMockRecorder) IsClosed() *gomock.Call {
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IsClosed", reflect.TypeOf((*MockMultiConn)(nil).IsClosed)) return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IsClosed", reflect.TypeOf((*MockMultiConn)(nil).IsClosed))
} }
// LastUsage mocks base method.
func (m *MockMultiConn) LastUsage() time.Time {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "LastUsage")
ret0, _ := ret[0].(time.Time)
return ret0
}
// LastUsage indicates an expected call of LastUsage.
func (mr *MockMultiConnMockRecorder) LastUsage() *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "LastUsage", reflect.TypeOf((*MockMultiConn)(nil).LastUsage))
}
// Open mocks base method. // Open mocks base method.
func (m *MockMultiConn) Open(arg0 context.Context) (net.Conn, error) { func (m *MockMultiConn) Open(arg0 context.Context) (net.Conn, error) {
m.ctrl.T.Helper() m.ctrl.T.Helper()

View file

@ -5,7 +5,6 @@ import (
"context" "context"
"errors" "errors"
"net" "net"
"time"
) )
var ( var (
@ -29,8 +28,6 @@ type MultiConn interface {
Accept() (conn net.Conn, err error) Accept() (conn net.Conn, err error)
// Open opens new sub connection // Open opens new sub connection
Open(ctx context.Context) (conn net.Conn, err error) Open(ctx context.Context) (conn net.Conn, err error)
// LastUsage returns the time of the last connection activity
LastUsage() time.Time
// Addr returns remote peer address // Addr returns remote peer address
Addr() string Addr() string
// IsClosed returns true when connection is closed // IsClosed returns true when connection is closed