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/events"
|
||||
"github.com/syncthing/syncthing/lib/protocol"
|
||||
"github.com/syncthing/syncthing/lib/util"
|
||||
)
|
||||
|
||||
type indexSender struct {
|
||||
@ -34,11 +35,12 @@ type indexSender struct {
|
||||
resumeChan chan *db.FileSet
|
||||
}
|
||||
|
||||
func (s *indexSender) Serve(ctx context.Context) error {
|
||||
var err error
|
||||
|
||||
func (s *indexSender) Serve(ctx context.Context) (err error) {
|
||||
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
|
||||
err = s.sendIndexTo(ctx)
|
||||
@ -94,16 +96,9 @@ func (s *indexSender) Serve(ctx context.Context) error {
|
||||
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) {
|
||||
select {
|
||||
case <-s.connClosed:
|
||||
@ -286,6 +281,8 @@ func (r *indexSenderRegistry) addLocked(folder config.FolderConfiguration, fset
|
||||
// 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)
|
||||
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
|
||||
|
@ -246,6 +246,31 @@ func (e *FatalErr) Is(target error) bool {
|
||||
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
|
||||
|
||||
const (
|
||||
|
Loading…
Reference in New Issue
Block a user