mirror of
https://github.com/octoleo/syncthing.git
synced 2024-12-22 19:08:58 +00:00
This commit is contained in:
parent
53fd54e308
commit
e11b309379
@ -18,6 +18,7 @@ import (
|
|||||||
"github.com/syncthing/syncthing/lib/db"
|
"github.com/syncthing/syncthing/lib/db"
|
||||||
"github.com/syncthing/syncthing/lib/events"
|
"github.com/syncthing/syncthing/lib/events"
|
||||||
"github.com/syncthing/syncthing/lib/protocol"
|
"github.com/syncthing/syncthing/lib/protocol"
|
||||||
|
"github.com/syncthing/syncthing/lib/util"
|
||||||
)
|
)
|
||||||
|
|
||||||
type indexSender struct {
|
type indexSender struct {
|
||||||
@ -34,11 +35,12 @@ type indexSender struct {
|
|||||||
resumeChan chan *db.FileSet
|
resumeChan chan *db.FileSet
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *indexSender) Serve(ctx context.Context) error {
|
func (s *indexSender) Serve(ctx context.Context) (err error) {
|
||||||
var err error
|
|
||||||
|
|
||||||
l.Debugf("Starting indexSender for %s to %s at %s (slv=%d)", s.folder, s.conn.ID(), s.conn, s.prevSequence)
|
l.Debugf("Starting indexSender for %s to %s at %s (slv=%d)", s.folder, s.conn.ID(), s.conn, s.prevSequence)
|
||||||
defer l.Debugf("Exiting indexSender for %s to %s at %s: %v", s.folder, s.conn.ID(), s.conn, err)
|
defer func() {
|
||||||
|
err = util.NoRestartErr(err)
|
||||||
|
l.Debugf("Exiting indexSender for %s to %s at %s: %v", s.folder, s.conn.ID(), s.conn, err)
|
||||||
|
}()
|
||||||
|
|
||||||
// We need to send one index, regardless of whether there is something to send or not
|
// We need to send one index, regardless of whether there is something to send or not
|
||||||
err = s.sendIndexTo(ctx)
|
err = s.sendIndexTo(ctx)
|
||||||
@ -94,16 +96,9 @@ func (s *indexSender) Serve(ctx context.Context) error {
|
|||||||
time.Sleep(250 * time.Millisecond)
|
time.Sleep(250 * time.Millisecond)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Complete implements the suture.IsCompletable interface. When Serve terminates
|
|
||||||
// before Stop is called, the supervisor will check for this method and if it
|
|
||||||
// returns true removes the service instead of restarting it. Here it always
|
|
||||||
// returns true, as indexSender only terminates when a connection is
|
|
||||||
// closed/has failed, in which case retrying doesn't help.
|
|
||||||
func (s *indexSender) Complete() bool { return true }
|
|
||||||
|
|
||||||
func (s *indexSender) resume(fset *db.FileSet) {
|
func (s *indexSender) resume(fset *db.FileSet) {
|
||||||
select {
|
select {
|
||||||
case <-s.connClosed:
|
case <-s.connClosed:
|
||||||
@ -286,6 +281,8 @@ func (r *indexSenderRegistry) addLocked(folder config.FolderConfiguration, fset
|
|||||||
// them. We'll start with a full index transfer.
|
// them. We'll start with a full index transfer.
|
||||||
l.Infof("Device %v folder %s has mismatching index ID for us (%v != %v)", r.deviceID, folder.Description(), startInfo.local.IndexID, myIndexID)
|
l.Infof("Device %v folder %s has mismatching index ID for us (%v != %v)", r.deviceID, folder.Description(), startInfo.local.IndexID, myIndexID)
|
||||||
startSequence = 0
|
startSequence = 0
|
||||||
|
} else {
|
||||||
|
l.Debugf("Device %v folder %s is not delta index compatible", r.deviceID, folder.Description())
|
||||||
}
|
}
|
||||||
|
|
||||||
// This is the other side's description of themselves. We
|
// This is the other side's description of themselves. We
|
||||||
|
@ -246,6 +246,31 @@ func (e *FatalErr) Is(target error) bool {
|
|||||||
return target == suture.ErrTerminateSupervisorTree
|
return target == suture.ErrTerminateSupervisorTree
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NoRestartErr wraps the given error err (which may be nil) to make sure that
|
||||||
|
// `errors.Is(err, suture.ErrDoNotRestart) == true`.
|
||||||
|
func NoRestartErr(err error) error {
|
||||||
|
if err == nil {
|
||||||
|
return suture.ErrDoNotRestart
|
||||||
|
}
|
||||||
|
return &noRestartErr{err}
|
||||||
|
}
|
||||||
|
|
||||||
|
type noRestartErr struct {
|
||||||
|
err error
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *noRestartErr) Error() string {
|
||||||
|
return e.err.Error()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *noRestartErr) Unwrap() error {
|
||||||
|
return e.err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *noRestartErr) Is(target error) bool {
|
||||||
|
return target == suture.ErrDoNotRestart
|
||||||
|
}
|
||||||
|
|
||||||
type ExitStatus int
|
type ExitStatus int
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
Loading…
Reference in New Issue
Block a user