106 lines
3.0 KiB
Go
106 lines
3.0 KiB
Go
package syncservice
|
|
|
|
import (
|
|
"context"
|
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger"
|
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/objectgetter"
|
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto"
|
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice/synchandler"
|
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf"
|
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/ocache"
|
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/periodicsync"
|
|
"go.uber.org/zap"
|
|
"time"
|
|
)
|
|
|
|
var log = logger.NewNamed("syncservice").Sugar()
|
|
|
|
type SyncService interface {
|
|
ocache.ObjectLastUsage
|
|
synchandler.SyncHandler
|
|
StreamPool() StreamPool
|
|
StreamChecker() StreamChecker
|
|
|
|
Init(getter objectgetter.ObjectGetter)
|
|
Close() (err error)
|
|
}
|
|
|
|
const respPeersStreamCheckInterval = 3000
|
|
|
|
type syncService struct {
|
|
spaceId string
|
|
|
|
streamPool StreamPool
|
|
checker StreamChecker
|
|
periodicSync periodicsync.PeriodicSync
|
|
objectGetter objectgetter.ObjectGetter
|
|
}
|
|
|
|
func NewSyncService(
|
|
spaceId string,
|
|
confConnector nodeconf.ConfConnector) (syncService SyncService) {
|
|
streamPool := newStreamPool(func(ctx context.Context, senderId string, message *spacesyncproto.ObjectSyncMessage) (err error) {
|
|
return syncService.HandleMessage(ctx, senderId, message)
|
|
})
|
|
clientFactory := spacesyncproto.ClientFactoryFunc(spacesyncproto.NewDRPCSpaceClient)
|
|
syncLog := log.Desugar().With(zap.String("id", spaceId))
|
|
checker := NewStreamChecker(
|
|
spaceId,
|
|
confConnector,
|
|
streamPool,
|
|
clientFactory,
|
|
syncLog)
|
|
periodicSync := periodicsync.NewPeriodicSync(respPeersStreamCheckInterval, checker.CheckResponsiblePeers, syncLog)
|
|
syncService = newSyncService(
|
|
spaceId,
|
|
streamPool,
|
|
periodicSync,
|
|
checker)
|
|
return
|
|
}
|
|
|
|
func newSyncService(
|
|
spaceId string,
|
|
streamPool StreamPool,
|
|
periodicSync periodicsync.PeriodicSync,
|
|
checker StreamChecker,
|
|
) *syncService {
|
|
return &syncService{
|
|
periodicSync: periodicSync,
|
|
streamPool: streamPool,
|
|
spaceId: spaceId,
|
|
checker: checker,
|
|
}
|
|
}
|
|
|
|
func (s *syncService) Init(objectGetter objectgetter.ObjectGetter) {
|
|
s.objectGetter = objectGetter
|
|
s.periodicSync.Run()
|
|
}
|
|
|
|
func (s *syncService) Close() (err error) {
|
|
s.periodicSync.Close()
|
|
return s.streamPool.Close()
|
|
}
|
|
|
|
func (s *syncService) LastUsage() time.Time {
|
|
return s.streamPool.LastUsage()
|
|
}
|
|
|
|
func (s *syncService) HandleMessage(ctx context.Context, senderId string, message *spacesyncproto.ObjectSyncMessage) (err error) {
|
|
log.With(zap.String("peerId", senderId), zap.String("objectId", message.ObjectId)).Debug("handling message")
|
|
obj, err := s.objectGetter.GetObject(ctx, message.ObjectId)
|
|
if err != nil {
|
|
return
|
|
}
|
|
return obj.HandleMessage(ctx, senderId, message)
|
|
}
|
|
|
|
func (s *syncService) StreamPool() StreamPool {
|
|
return s.streamPool
|
|
}
|
|
|
|
func (s *syncService) StreamChecker() StreamChecker {
|
|
return s.checker
|
|
}
|