From c81b122374f1e0db6c996aa091be482bfbc0096d Mon Sep 17 00:00:00 2001 From: Michael Eischer Date: Sat, 1 Aug 2020 12:06:30 +0200 Subject: [PATCH] rclone: Don't panic after unexpected subprocess exit As the connection to the rclone child process is now closed after an unexpected subprocess exit, later requests will cause the http2 transport to try to reestablish a new connection. As previously this never should have happened, the connection called panic in that case. This panic is now replaced with a simple error message, as it no longer indicates an internal problem. --- internal/backend/rclone/backend.go | 3 ++- internal/backend/rclone/internal_test.go | 12 +++++++----- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/internal/backend/rclone/backend.go b/internal/backend/rclone/backend.go index fe371f6a0..c87a2f1b0 100644 --- a/internal/backend/rclone/backend.go +++ b/internal/backend/rclone/backend.go @@ -173,7 +173,8 @@ func newBackend(cfg Config, lim limiter.Limiter) (*Backend, error) { DialTLS: func(network, address string, cfg *tls.Config) (net.Conn, error) { debug.Log("new connection requested, %v %v", network, address) if dialCount > 0 { - panic("dial count > 0") + // the connection to the child process is already closed + return nil, errors.New("rclone stdio connection already closed") } dialCount++ return conn, nil diff --git a/internal/backend/rclone/internal_test.go b/internal/backend/rclone/internal_test.go index 435428870..da958f281 100644 --- a/internal/backend/rclone/internal_test.go +++ b/internal/backend/rclone/internal_test.go @@ -29,9 +29,11 @@ func TestRcloneExit(t *testing.T) { rtest.OK(t, err) t.Log("killed rclone") - _, err = be.Stat(context.TODO(), restic.Handle{ - Name: "foo", - Type: restic.DataFile, - }) - rtest.Assert(t, err != nil, "expected an error") + for i := 0; i < 10; i++ { + _, err = be.Stat(context.TODO(), restic.Handle{ + Name: "foo", + Type: restic.DataFile, + }) + rtest.Assert(t, err != nil, "expected an error") + } }