From 7389f81b7a6ba8d838fd474c2d21d9fda8ea8b98 Mon Sep 17 00:00:00 2001 From: Julian Kornberger Date: Tue, 14 May 2024 01:45:03 +0200 Subject: [PATCH] Retry when dataset is busy --- zfs/transfer.go | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/zfs/transfer.go b/zfs/transfer.go index b322a57..3d198ef 100644 --- a/zfs/transfer.go +++ b/zfs/transfer.go @@ -8,6 +8,7 @@ import ( "os/exec" "strings" "sync" + "time" pb "gopkg.in/cheggaaa/pb.v1" ) @@ -59,8 +60,26 @@ func (t *Transfer) sendSize() (int64, error) { return parseTransferSize(out) } +func (t *Transfer) RunWithRetry() error { + retries := 0 + var err error + + for { + err = t.run() + if err == nil || retries > 2 || !strings.Contains(err.Error(), "dataset is busy") { + break + } + + retries++ + log.Printf("dataset is busy, retrying in %d seconds", retries) + time.Sleep(time.Second * time.Duration(retries)) + } + + return err +} + // Run performs sync -func (t *Transfer) Run() error { +func (t *Transfer) run() error { var err error var size int64 @@ -168,7 +187,7 @@ func DoSync(from, to *Fs, flags Flags) error { transfer.PreviousSnapshot = previous transfer.CurrentSnapshot = current - if err := transfer.Run(); err != nil { + if err := transfer.RunWithRetry(); err != nil { return err } previous = current