This commit is contained in:
Sergey Cherepanov 2023-01-24 16:23:35 +03:00 committed by Mikhail Iudin
parent 2d2f24b3e3
commit cc89d5919e
No known key found for this signature in database
GPG Key ID: FAAAA8BAABDFF1C0
9 changed files with 51 additions and 8 deletions

View File

@ -67,7 +67,7 @@ func (s *messagePool) SendSync(ctx context.Context, peerId string, msg *spacesyn
s.waiters[msg.ReplyId] = waiter
s.waitersMx.Unlock()
err = s.SendPeer(ctx, peerId, msg)
err = s.SendPeer(context.Background(), peerId, msg)
if err != nil {
return
}
@ -87,15 +87,30 @@ func (s *messagePool) SendSync(ctx context.Context, peerId string, msg *spacesyn
func (s *messagePool) SendPeer(ctx context.Context, peerId string, msg *spacesyncproto.ObjectSyncMessage) (err error) {
s.updateLastUsage()
select {
case <-ctx.Done():
log.Warn("ctx.Done")
default:
}
return s.StreamManager.SendPeer(ctx, peerId, msg)
}
func (s *messagePool) SendResponsible(ctx context.Context, msg *spacesyncproto.ObjectSyncMessage) (err error) {
s.updateLastUsage()
select {
case <-ctx.Done():
log.Warn("ctx.Done")
default:
}
return s.StreamManager.SendResponsible(ctx, msg)
}
func (s *messagePool) Broadcast(ctx context.Context, msg *spacesyncproto.ObjectSyncMessage) (err error) {
s.updateLastUsage()
select {
case <-ctx.Done():
log.Warn("ctx.Done")
default:
}
return s.StreamManager.Broadcast(ctx, msg)
}

View File

@ -97,7 +97,7 @@ func (s *spaceService) DeriveSpace(ctx context.Context, payload SpaceDerivePaylo
}
func (s *spaceService) NewSpace(ctx context.Context, id string) (Space, error) {
st, err := s.storageProvider.SpaceStorage(id)
st, err := s.storageProvider.WaitSpaceStorage(ctx, id)
if err != nil {
if err != spacestorage.ErrSpaceStorageMissing {
return nil, err

View File

@ -2,6 +2,7 @@
package spacestorage
import (
"context"
"errors"
"github.com/anytypeio/any-sync/app"
"github.com/anytypeio/any-sync/commonspace/object/acl/aclrecordproto"
@ -51,7 +52,7 @@ type SpaceStorageCreatePayload struct {
type SpaceStorageProvider interface {
app.Component
SpaceStorage(id string) (SpaceStorage, error)
WaitSpaceStorage(ctx context.Context, id string) (SpaceStorage, error)
SpaceExists(id string) bool
CreateSpaceStorage(payload SpaceStorageCreatePayload) (SpaceStorage, error)
}

View File

@ -65,6 +65,7 @@ func (d *dialer) UpdateAddrs(addrs map[string][]string) {
func (d *dialer) Dial(ctx context.Context, peerId string) (p peer.Peer, err error) {
d.mu.RLock()
defer d.mu.RUnlock()
addrs, ok := d.peerAddrs[peerId]
if !ok || len(addrs) == 0 {
return nil, ErrArrdsNotFound
@ -73,6 +74,7 @@ func (d *dialer) Dial(ctx context.Context, peerId string) (p peer.Peer, err erro
conn drpc.Conn
sc sec.SecureConn
)
log.Warn("dial", zap.String("peerId", peerId), zap.Strings("addrs", addrs))
for _, addr := range addrs {
conn, sc, err = d.handshake(ctx, addr)
if err != nil {

View File

@ -2,12 +2,16 @@ package peer
import (
"context"
"github.com/anytypeio/any-sync/app/logger"
"github.com/libp2p/go-libp2p/core/sec"
"go.uber.org/zap"
"storj.io/drpc"
"sync/atomic"
"time"
)
var log = logger.NewNamed("peer")
func NewPeer(sc sec.SecureConn, conn drpc.Conn) Peer {
return &peer{
id: sc.RemotePeer().String(),
@ -71,3 +75,8 @@ func (p *peer) Write(b []byte) (n int, err error) {
func (p *peer) UpdateLastUsage() {
atomic.StoreInt64(&p.lastUsage, time.Now().Unix())
}
func (p *peer) Close() (err error) {
log.Warn("peer close", zap.String("peerId", p.id))
return p.Conn.Close()
}

View File

@ -28,6 +28,7 @@ type Service interface {
}
type poolService struct {
// default pool
*pool
dialer dialer.Dialer
metricReg *prometheus.Registry

View File

@ -27,6 +27,7 @@ func (sr *stream) readLoop() error {
defer func() {
sr.streamClose()
}()
sr.l.Debug("stream read started")
for {
msg := sr.pool.handler.NewReadMessage()
if err := sr.stream.MsgRecv(msg, EncodingProto); err != nil {

View File

@ -142,7 +142,7 @@ func (s *streamPool) sendOne(ctx context.Context, p peer.Peer, msg drpc.Message)
}
for _, st := range streams {
if err = st.write(msg); err != nil {
st.l.Info("sendOne write error", zap.Error(err))
st.l.Info("sendOne write error", zap.Error(err), zap.Int("streams", len(streams)))
// continue with next stream
continue
} else {
@ -279,7 +279,7 @@ func (s *streamPool) handleMessageLoop() {
if err != nil {
return
}
if err = s.handler.HandleMessage(hm.ctx, hm.peerId, hm.msg); err != nil {
if err = s.handler.HandleMessage(context.Background(), hm.peerId, hm.msg); err != nil {
log.Warn("handle message error", zap.Error(err))
}
}

View File

@ -2,11 +2,15 @@ package timeoutconn
import (
"errors"
"github.com/anytypeio/any-sync/app/logger"
"go.uber.org/zap"
"net"
"os"
"time"
)
var log = logger.NewNamed("net.timeoutconn")
type Conn struct {
net.Conn
timeout time.Duration
@ -17,22 +21,32 @@ func NewConn(conn net.Conn, timeout time.Duration) *Conn {
}
func (c *Conn) Write(p []byte) (n int, err error) {
return c.Conn.Write(p)
for {
if c.timeout != 0 {
c.Conn.SetWriteDeadline(time.Now().Add(c.timeout))
if e := c.Conn.SetWriteDeadline(time.Now().Add(c.timeout)); e != nil {
log.Warn("can't set write deadline", zap.String("remoteAddr", c.RemoteAddr().String()))
}
}
nn, err := c.Conn.Write(p[n:])
n += nn
if n < len(p) && nn > 0 && errors.Is(err, os.ErrDeadlineExceeded) {
// Keep extending the deadline so long as we're making progress.
log.Debug("keep extending the deadline so long as we're making progress", zap.String("remoteAddr", c.RemoteAddr().String()))
continue
}
if c.timeout != 0 {
c.Conn.SetWriteDeadline(time.Time{})
if e := c.Conn.SetWriteDeadline(time.Time{}); e != nil {
log.Warn("can't set write deadline", zap.String("remoteAddr", c.RemoteAddr().String()))
}
}
if err != nil {
// if the connection is timed out and we should close it
c.Conn.Close()
if e := c.Conn.Close(); e != nil {
log.Warn("connection close error", zap.String("remoteAddr", c.RemoteAddr().String()))
}
log.Debug("connection timed out", zap.String("remoteAddr", c.RemoteAddr().String()))
}
return n, err
}