diff --git a/Makefile b/Makefile index aa0fa75f..94227398 100644 --- a/Makefile +++ b/Makefile @@ -25,6 +25,7 @@ deps: go mod download 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/golang/mock/mockgen test: go test ./... --cover diff --git a/net/peer/peer.go b/net/peer/peer.go index 4e584f2c..c8a54a43 100644 --- a/net/peer/peer.go +++ b/net/peer/peer.go @@ -35,6 +35,7 @@ func NewPeer(mc transport.MultiConn, ctrl connCtrl) (p Peer, err error) { active: map[*subConn]struct{}{}, MultiConn: mc, ctrl: ctrl, + created: time.Now(), } if pr.id, err = CtxPeerId(ctx); err != nil { return @@ -74,6 +75,8 @@ type peer struct { mu sync.Mutex + created time.Time + 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) { - p.gc(objectTTL) - if time.Now().Sub(p.LastUsage()) < objectTTL { - return false, nil + aliveCount := p.gc(objectTTL) + if aliveCount == 0 && p.created.Add(time.Minute).Before(time.Now()) { + 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() defer p.mu.Unlock() minLastUsage := time.Now().Add(-ttl) @@ -238,6 +241,7 @@ func (p *peer) gc(ttl time.Duration) { continue } } + return len(p.active) + len(p.inactive) } func (p *peer) Close() (err error) { diff --git a/net/peer/peer_test.go b/net/peer/peer_test.go index 67d0f65d..ac06f8d6 100644 --- a/net/peer/peer_test.go +++ b/net/peer/peer_test.go @@ -64,11 +64,9 @@ func TestPeerAccept(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") defer fx.finish() - lu := time.Now() - fx.mc.EXPECT().LastUsage().Return(lu) res, err := fx.TryClose(time.Second) require.NoError(t, err) assert.False(t, res) @@ -76,8 +74,7 @@ func TestPeer_TryClose(t *testing.T) { t.Run("close", func(t *testing.T) { fx := newFixture(t, "p1") defer fx.finish() - lu := time.Now().Add(-time.Second * 2) - fx.mc.EXPECT().LastUsage().Return(lu) + fx.peer.created = fx.peer.created.Add(-time.Minute * 2) res, err := fx.TryClose(time.Second) require.NoError(t, err) assert.True(t, res) @@ -85,8 +82,7 @@ func TestPeer_TryClose(t *testing.T) { t.Run("gc", func(t *testing.T) { fx := newFixture(t, "p1") defer fx.finish() - now := time.Now() - fx.mc.EXPECT().LastUsage().Return(now.Add(time.Millisecond * 100)) + //now := time.Now() // make one inactive in, out := net.Pipe() diff --git a/net/transport/mock_transport/mock_transport.go b/net/transport/mock_transport/mock_transport.go index 43f5572c..e0428014 100644 --- a/net/transport/mock_transport/mock_transport.go +++ b/net/transport/mock_transport/mock_transport.go @@ -8,7 +8,6 @@ import ( context "context" net "net" reflect "reflect" - time "time" transport "github.com/anyproto/any-sync/net/transport" 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)) } -// 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. func (m *MockMultiConn) Open(arg0 context.Context) (net.Conn, error) { m.ctrl.T.Helper() diff --git a/net/transport/transport.go b/net/transport/transport.go index 2dab5348..9d36435a 100644 --- a/net/transport/transport.go +++ b/net/transport/transport.go @@ -5,7 +5,6 @@ import ( "context" "errors" "net" - "time" ) var ( @@ -29,8 +28,6 @@ type MultiConn interface { Accept() (conn net.Conn, err error) // Open opens new sub connection 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() string // IsClosed returns true when connection is closed