From 307b741dc7be99f1e6edebde602085869b731f3b Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Fri, 10 Mar 2023 10:17:57 +0100 Subject: [PATCH] Update tryclose with ttl --- app/ocache/ocache.go | 5 +++-- app/ocache/ocache_test.go | 2 +- commonspace/headsync/diffsyncer_test.go | 2 +- .../objecttree/mock_objecttree/mock_objecttree.go | 9 +++++---- commonspace/object/tree/objecttree/objecttree.go | 5 +++-- .../tree/synctree/mock_synctree/mock_synctree.go | 9 +++++---- commonspace/object/tree/synctree/synctree.go | 3 ++- commonspace/space.go | 13 ++++++------- commonspace/spaceservice.go | 2 -- net/dialer/dialer.go | 2 +- net/peer/peer.go | 9 ++++----- net/pool/pool_test.go | 2 +- net/rpc/rpctest/pool.go | 2 +- 13 files changed, 33 insertions(+), 32 deletions(-) diff --git a/app/ocache/ocache.go b/app/ocache/ocache.go index cf8f6f88..7375c643 100644 --- a/app/ocache/ocache.go +++ b/app/ocache/ocache.go @@ -67,7 +67,7 @@ func New(loadFunc LoadFunc, opts ...Option) OCache { type Object interface { Close() (err error) - TryClose() (res bool, err error) + TryClose(objectTTL time.Duration) (res bool, err error) } type OCache interface { @@ -127,6 +127,7 @@ Load: load = true c.data[id] = e } + e.lastUsage = time.Now() c.mu.Unlock() reload, err := e.waitClose(ctx, id) if err != nil { @@ -281,7 +282,7 @@ func (c *oCache) GC() { if prevState == entryStateClosing || prevState == entryStateClosed { continue } - closed, err := e.value.TryClose() + closed, err := e.value.TryClose(c.ttl) if err != nil { c.log.With("object_id", e.id).Warnf("GC: object close error: %v", err) } diff --git a/app/ocache/ocache_test.go b/app/ocache/ocache_test.go index 9ed130df..14a59b1a 100644 --- a/app/ocache/ocache_test.go +++ b/app/ocache/ocache_test.go @@ -41,7 +41,7 @@ func (t *testObject) Close() (err error) { return t.closeErr } -func (t *testObject) TryClose() (res bool, err error) { +func (t *testObject) TryClose(objectTTL time.Duration) (res bool, err error) { if t.closeCalled || (t.tryCloseCalled && t.tryReturn) { panic("close called twice") } diff --git a/commonspace/headsync/diffsyncer_test.go b/commonspace/headsync/diffsyncer_test.go index 2b163a19..ae40e5a7 100644 --- a/commonspace/headsync/diffsyncer_test.go +++ b/commonspace/headsync/diffsyncer_test.go @@ -51,7 +51,7 @@ func (p pushSpaceRequestMatcher) String() string { type mockPeer struct{} -func (m mockPeer) TryClose() (res bool, err error) { +func (m mockPeer) TryClose(objectTTL time.Duration) (res bool, err error) { return true, m.Close() } diff --git a/commonspace/object/tree/objecttree/mock_objecttree/mock_objecttree.go b/commonspace/object/tree/objecttree/mock_objecttree/mock_objecttree.go index 3298fc03..fb5ea6b1 100644 --- a/commonspace/object/tree/objecttree/mock_objecttree/mock_objecttree.go +++ b/commonspace/object/tree/objecttree/mock_objecttree/mock_objecttree.go @@ -7,6 +7,7 @@ package mock_objecttree import ( context "context" reflect "reflect" + time "time" list "github.com/anytypeio/any-sync/commonspace/object/acl/list" objecttree "github.com/anytypeio/any-sync/commonspace/object/tree/objecttree" @@ -351,18 +352,18 @@ func (mr *MockObjectTreeMockRecorder) Storage() *gomock.Call { } // TryClose mocks base method. -func (m *MockObjectTree) TryClose() (bool, error) { +func (m *MockObjectTree) TryClose(arg0 time.Duration) (bool, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "TryClose") + ret := m.ctrl.Call(m, "TryClose", arg0) ret0, _ := ret[0].(bool) ret1, _ := ret[1].(error) return ret0, ret1 } // TryClose indicates an expected call of TryClose. -func (mr *MockObjectTreeMockRecorder) TryClose() *gomock.Call { +func (mr *MockObjectTreeMockRecorder) TryClose(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "TryClose", reflect.TypeOf((*MockObjectTree)(nil).TryClose)) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "TryClose", reflect.TypeOf((*MockObjectTree)(nil).TryClose), arg0) } // TryLock mocks base method. diff --git a/commonspace/object/tree/objecttree/objecttree.go b/commonspace/object/tree/objecttree/objecttree.go index a345e441..af169ad2 100644 --- a/commonspace/object/tree/objecttree/objecttree.go +++ b/commonspace/object/tree/objecttree/objecttree.go @@ -5,6 +5,7 @@ import ( "context" "errors" "sync" + "time" "github.com/anytypeio/any-sync/commonspace/object/acl/aclrecordproto" "github.com/anytypeio/any-sync/commonspace/object/acl/list" @@ -82,7 +83,7 @@ type ObjectTree interface { Delete() error Close() error - TryClose() (bool, error) + TryClose(objectTTL time.Duration) (bool, error) } type objectTree struct { @@ -561,7 +562,7 @@ func (ot *objectTree) Root() *Change { return ot.tree.Root() } -func (ot *objectTree) TryClose() (bool, error) { +func (ot *objectTree) TryClose(objectTTL time.Duration) (bool, error) { return true, ot.Close() } diff --git a/commonspace/object/tree/synctree/mock_synctree/mock_synctree.go b/commonspace/object/tree/synctree/mock_synctree/mock_synctree.go index 4e38c375..1dee0ce3 100644 --- a/commonspace/object/tree/synctree/mock_synctree/mock_synctree.go +++ b/commonspace/object/tree/synctree/mock_synctree/mock_synctree.go @@ -7,6 +7,7 @@ package mock_synctree import ( context "context" reflect "reflect" + time "time" list "github.com/anytypeio/any-sync/commonspace/object/acl/list" objecttree "github.com/anytypeio/any-sync/commonspace/object/tree/objecttree" @@ -502,18 +503,18 @@ func (mr *MockSyncTreeMockRecorder) SyncWithPeer(arg0, arg1 interface{}) *gomock } // TryClose mocks base method. -func (m *MockSyncTree) TryClose() (bool, error) { +func (m *MockSyncTree) TryClose(arg0 time.Duration) (bool, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "TryClose") + ret := m.ctrl.Call(m, "TryClose", arg0) ret0, _ := ret[0].(bool) ret1, _ := ret[1].(error) return ret0, ret1 } // TryClose indicates an expected call of TryClose. -func (mr *MockSyncTreeMockRecorder) TryClose() *gomock.Call { +func (mr *MockSyncTreeMockRecorder) TryClose(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "TryClose", reflect.TypeOf((*MockSyncTree)(nil).TryClose)) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "TryClose", reflect.TypeOf((*MockSyncTree)(nil).TryClose), arg0) } // TryLock mocks base method. diff --git a/commonspace/object/tree/synctree/synctree.go b/commonspace/object/tree/synctree/synctree.go index fe429768..56d07c1c 100644 --- a/commonspace/object/tree/synctree/synctree.go +++ b/commonspace/object/tree/synctree/synctree.go @@ -3,6 +3,7 @@ package synctree import ( "context" "errors" + "time" "github.com/anytypeio/any-sync/app/logger" "github.com/anytypeio/any-sync/commonspace/object/acl/list" @@ -209,7 +210,7 @@ func (s *syncTree) Delete() (err error) { return } -func (s *syncTree) TryClose() (bool, error) { +func (s *syncTree) TryClose(objectTTL time.Duration) (bool, error) { return true, s.Close() } diff --git a/commonspace/space.go b/commonspace/space.go index f1a25684..ece7437d 100644 --- a/commonspace/space.go +++ b/commonspace/space.go @@ -106,15 +106,14 @@ type Space interface { HandleMessage(ctx context.Context, msg HandleMessage) (err error) - TryClose() (close bool, err error) + TryClose(objectTTL time.Duration) (close bool, err error) Close() error } type space struct { - id string - mu sync.RWMutex - header *spacesyncproto.RawSpaceHeaderWithId - spaceTTL time.Duration + id string + mu sync.RWMutex + header *spacesyncproto.RawSpaceHeaderWithId objectSync objectsync.ObjectSync headSync headsync.HeadSync @@ -453,8 +452,8 @@ func (s *space) Close() error { return mError.Err() } -func (s *space) TryClose() (close bool, err error) { - if time.Now().Sub(s.objectSync.LastUsage()) < s.spaceTTL { +func (s *space) TryClose(objectTTL time.Duration) (close bool, err error) { + if time.Now().Sub(s.objectSync.LastUsage()) < objectTTL { return false, nil } locked := s.treesUsed.Load() > 1 diff --git a/commonspace/spaceservice.go b/commonspace/spaceservice.go index 0e086923..89e9283b 100644 --- a/commonspace/spaceservice.go +++ b/commonspace/spaceservice.go @@ -19,7 +19,6 @@ import ( "github.com/anytypeio/any-sync/net/pool" "github.com/anytypeio/any-sync/nodeconf" "sync/atomic" - "time" ) const CName = "common.commonspace" @@ -163,7 +162,6 @@ func (s *spaceService) NewSpace(ctx context.Context, id string) (Space, error) { treesUsed: &atomic.Int32{}, isClosed: spaceIsClosed, isDeleted: spaceIsDeleted, - spaceTTL: time.Duration(s.config.GCTTL) * time.Second, } return sp, nil } diff --git a/net/dialer/dialer.go b/net/dialer/dialer.go index 64b0c191..7252a4f3 100644 --- a/net/dialer/dialer.go +++ b/net/dialer/dialer.go @@ -100,7 +100,7 @@ func (d *dialer) Dial(ctx context.Context, peerId string) (p peer.Peer, err erro if err != nil { return } - return peer.NewPeer(sc, conn, time.Minute), nil + return peer.NewPeer(sc, conn), nil } func (d *dialer) handshake(ctx context.Context, addr string) (conn drpc.Conn, sc sec.SecureConn, err error) { diff --git a/net/peer/peer.go b/net/peer/peer.go index bc9353d0..c96cd4ba 100644 --- a/net/peer/peer.go +++ b/net/peer/peer.go @@ -12,11 +12,10 @@ import ( var log = logger.NewNamed("peer") -func NewPeer(sc sec.SecureConn, conn drpc.Conn, ttl time.Duration) Peer { +func NewPeer(sc sec.SecureConn, conn drpc.Conn) Peer { return &peer{ id: sc.RemotePeer().String(), lastUsage: time.Now().Unix(), - ttl: ttl, sc: sc, Conn: conn, } @@ -26,7 +25,7 @@ type Peer interface { Id() string LastUsage() time.Time UpdateLastUsage() - TryClose() (res bool, err error) + TryClose(objectTTL time.Duration) (res bool, err error) drpc.Conn } @@ -79,8 +78,8 @@ func (p *peer) UpdateLastUsage() { atomic.StoreInt64(&p.lastUsage, time.Now().Unix()) } -func (p *peer) TryClose() (res bool, err error) { - if time.Now().Sub(p.LastUsage()) < p.ttl { +func (p *peer) TryClose(objectTTL time.Duration) (res bool, err error) { + if time.Now().Sub(p.LastUsage()) < objectTTL { return false, nil } return true, p.Close() diff --git a/net/pool/pool_test.go b/net/pool/pool_test.go index 8ae08e3b..ce3876e0 100644 --- a/net/pool/pool_test.go +++ b/net/pool/pool_test.go @@ -194,7 +194,7 @@ func (t *testPeer) LastUsage() time.Time { func (t *testPeer) UpdateLastUsage() {} -func (t *testPeer) TryClose() (res bool, err error) { +func (t *testPeer) TryClose(objectTTL time.Duration) (res bool, err error) { return true, t.Close() } diff --git a/net/rpc/rpctest/pool.go b/net/rpc/rpctest/pool.go index 40b7bb1d..630cbb6a 100644 --- a/net/rpc/rpctest/pool.go +++ b/net/rpc/rpctest/pool.go @@ -103,7 +103,7 @@ type testPeer struct { drpc.Conn } -func (t testPeer) TryClose() (res bool, err error) { +func (t testPeer) TryClose(objectTTL time.Duration) (res bool, err error) { return true, t.Close() }