Update tryclose with ttl

This commit is contained in:
mcrakhman 2023-03-10 10:17:57 +01:00 committed by Mikhail Iudin
parent 82828cba6f
commit 307b741dc7
No known key found for this signature in database
GPG Key ID: FAAAA8BAABDFF1C0
13 changed files with 33 additions and 32 deletions

View File

@ -67,7 +67,7 @@ func New(loadFunc LoadFunc, opts ...Option) OCache {
type Object interface { type Object interface {
Close() (err error) Close() (err error)
TryClose() (res bool, err error) TryClose(objectTTL time.Duration) (res bool, err error)
} }
type OCache interface { type OCache interface {
@ -127,6 +127,7 @@ Load:
load = true load = true
c.data[id] = e c.data[id] = e
} }
e.lastUsage = time.Now()
c.mu.Unlock() c.mu.Unlock()
reload, err := e.waitClose(ctx, id) reload, err := e.waitClose(ctx, id)
if err != nil { if err != nil {
@ -281,7 +282,7 @@ func (c *oCache) GC() {
if prevState == entryStateClosing || prevState == entryStateClosed { if prevState == entryStateClosing || prevState == entryStateClosed {
continue continue
} }
closed, err := e.value.TryClose() closed, err := e.value.TryClose(c.ttl)
if err != nil { if err != nil {
c.log.With("object_id", e.id).Warnf("GC: object close error: %v", err) c.log.With("object_id", e.id).Warnf("GC: object close error: %v", err)
} }

View File

@ -41,7 +41,7 @@ func (t *testObject) Close() (err error) {
return t.closeErr 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) { if t.closeCalled || (t.tryCloseCalled && t.tryReturn) {
panic("close called twice") panic("close called twice")
} }

View File

@ -51,7 +51,7 @@ func (p pushSpaceRequestMatcher) String() string {
type mockPeer struct{} 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() return true, m.Close()
} }

View File

@ -7,6 +7,7 @@ package mock_objecttree
import ( import (
context "context" context "context"
reflect "reflect" reflect "reflect"
time "time"
list "github.com/anytypeio/any-sync/commonspace/object/acl/list" list "github.com/anytypeio/any-sync/commonspace/object/acl/list"
objecttree "github.com/anytypeio/any-sync/commonspace/object/tree/objecttree" objecttree "github.com/anytypeio/any-sync/commonspace/object/tree/objecttree"
@ -351,18 +352,18 @@ func (mr *MockObjectTreeMockRecorder) Storage() *gomock.Call {
} }
// TryClose mocks base method. // TryClose mocks base method.
func (m *MockObjectTree) TryClose() (bool, error) { func (m *MockObjectTree) TryClose(arg0 time.Duration) (bool, error) {
m.ctrl.T.Helper() m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "TryClose") ret := m.ctrl.Call(m, "TryClose", arg0)
ret0, _ := ret[0].(bool) ret0, _ := ret[0].(bool)
ret1, _ := ret[1].(error) ret1, _ := ret[1].(error)
return ret0, ret1 return ret0, ret1
} }
// TryClose indicates an expected call of TryClose. // 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() 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. // TryLock mocks base method.

View File

@ -5,6 +5,7 @@ import (
"context" "context"
"errors" "errors"
"sync" "sync"
"time"
"github.com/anytypeio/any-sync/commonspace/object/acl/aclrecordproto" "github.com/anytypeio/any-sync/commonspace/object/acl/aclrecordproto"
"github.com/anytypeio/any-sync/commonspace/object/acl/list" "github.com/anytypeio/any-sync/commonspace/object/acl/list"
@ -82,7 +83,7 @@ type ObjectTree interface {
Delete() error Delete() error
Close() error Close() error
TryClose() (bool, error) TryClose(objectTTL time.Duration) (bool, error)
} }
type objectTree struct { type objectTree struct {
@ -561,7 +562,7 @@ func (ot *objectTree) Root() *Change {
return ot.tree.Root() return ot.tree.Root()
} }
func (ot *objectTree) TryClose() (bool, error) { func (ot *objectTree) TryClose(objectTTL time.Duration) (bool, error) {
return true, ot.Close() return true, ot.Close()
} }

View File

@ -7,6 +7,7 @@ package mock_synctree
import ( import (
context "context" context "context"
reflect "reflect" reflect "reflect"
time "time"
list "github.com/anytypeio/any-sync/commonspace/object/acl/list" list "github.com/anytypeio/any-sync/commonspace/object/acl/list"
objecttree "github.com/anytypeio/any-sync/commonspace/object/tree/objecttree" 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. // TryClose mocks base method.
func (m *MockSyncTree) TryClose() (bool, error) { func (m *MockSyncTree) TryClose(arg0 time.Duration) (bool, error) {
m.ctrl.T.Helper() m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "TryClose") ret := m.ctrl.Call(m, "TryClose", arg0)
ret0, _ := ret[0].(bool) ret0, _ := ret[0].(bool)
ret1, _ := ret[1].(error) ret1, _ := ret[1].(error)
return ret0, ret1 return ret0, ret1
} }
// TryClose indicates an expected call of TryClose. // 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() 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. // TryLock mocks base method.

View File

@ -3,6 +3,7 @@ package synctree
import ( import (
"context" "context"
"errors" "errors"
"time"
"github.com/anytypeio/any-sync/app/logger" "github.com/anytypeio/any-sync/app/logger"
"github.com/anytypeio/any-sync/commonspace/object/acl/list" "github.com/anytypeio/any-sync/commonspace/object/acl/list"
@ -209,7 +210,7 @@ func (s *syncTree) Delete() (err error) {
return return
} }
func (s *syncTree) TryClose() (bool, error) { func (s *syncTree) TryClose(objectTTL time.Duration) (bool, error) {
return true, s.Close() return true, s.Close()
} }

View File

@ -106,15 +106,14 @@ type Space interface {
HandleMessage(ctx context.Context, msg HandleMessage) (err error) HandleMessage(ctx context.Context, msg HandleMessage) (err error)
TryClose() (close bool, err error) TryClose(objectTTL time.Duration) (close bool, err error)
Close() error Close() error
} }
type space struct { type space struct {
id string id string
mu sync.RWMutex mu sync.RWMutex
header *spacesyncproto.RawSpaceHeaderWithId header *spacesyncproto.RawSpaceHeaderWithId
spaceTTL time.Duration
objectSync objectsync.ObjectSync objectSync objectsync.ObjectSync
headSync headsync.HeadSync headSync headsync.HeadSync
@ -453,8 +452,8 @@ func (s *space) Close() error {
return mError.Err() return mError.Err()
} }
func (s *space) TryClose() (close bool, err error) { func (s *space) TryClose(objectTTL time.Duration) (close bool, err error) {
if time.Now().Sub(s.objectSync.LastUsage()) < s.spaceTTL { if time.Now().Sub(s.objectSync.LastUsage()) < objectTTL {
return false, nil return false, nil
} }
locked := s.treesUsed.Load() > 1 locked := s.treesUsed.Load() > 1

View File

@ -19,7 +19,6 @@ import (
"github.com/anytypeio/any-sync/net/pool" "github.com/anytypeio/any-sync/net/pool"
"github.com/anytypeio/any-sync/nodeconf" "github.com/anytypeio/any-sync/nodeconf"
"sync/atomic" "sync/atomic"
"time"
) )
const CName = "common.commonspace" const CName = "common.commonspace"
@ -163,7 +162,6 @@ func (s *spaceService) NewSpace(ctx context.Context, id string) (Space, error) {
treesUsed: &atomic.Int32{}, treesUsed: &atomic.Int32{},
isClosed: spaceIsClosed, isClosed: spaceIsClosed,
isDeleted: spaceIsDeleted, isDeleted: spaceIsDeleted,
spaceTTL: time.Duration(s.config.GCTTL) * time.Second,
} }
return sp, nil return sp, nil
} }

View File

@ -100,7 +100,7 @@ func (d *dialer) Dial(ctx context.Context, peerId string) (p peer.Peer, err erro
if err != nil { if err != nil {
return 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) { func (d *dialer) handshake(ctx context.Context, addr string) (conn drpc.Conn, sc sec.SecureConn, err error) {

View File

@ -12,11 +12,10 @@ import (
var log = logger.NewNamed("peer") 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{ return &peer{
id: sc.RemotePeer().String(), id: sc.RemotePeer().String(),
lastUsage: time.Now().Unix(), lastUsage: time.Now().Unix(),
ttl: ttl,
sc: sc, sc: sc,
Conn: conn, Conn: conn,
} }
@ -26,7 +25,7 @@ type Peer interface {
Id() string Id() string
LastUsage() time.Time LastUsage() time.Time
UpdateLastUsage() UpdateLastUsage()
TryClose() (res bool, err error) TryClose(objectTTL time.Duration) (res bool, err error)
drpc.Conn drpc.Conn
} }
@ -79,8 +78,8 @@ func (p *peer) UpdateLastUsage() {
atomic.StoreInt64(&p.lastUsage, time.Now().Unix()) atomic.StoreInt64(&p.lastUsage, time.Now().Unix())
} }
func (p *peer) TryClose() (res bool, err error) { func (p *peer) TryClose(objectTTL time.Duration) (res bool, err error) {
if time.Now().Sub(p.LastUsage()) < p.ttl { if time.Now().Sub(p.LastUsage()) < objectTTL {
return false, nil return false, nil
} }
return true, p.Close() return true, p.Close()

View File

@ -194,7 +194,7 @@ func (t *testPeer) LastUsage() time.Time {
func (t *testPeer) UpdateLastUsage() {} 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() return true, t.Close()
} }

View File

@ -103,7 +103,7 @@ type testPeer struct {
drpc.Conn 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() return true, t.Close()
} }