diff --git a/app/vmbackup/main.go b/app/vmbackup/main.go index bbf36d3746..cda5f3bd20 100644 --- a/app/vmbackup/main.go +++ b/app/vmbackup/main.go @@ -49,6 +49,11 @@ func main() { logger.Init() pushmetrics.Init() + // Storing snapshot delete function to be able to call it in case + // of error since logger.Fatal will exit the program without + // calling deferred functions. + var deleteSnapshot func() + if len(*snapshotCreateURL) > 0 { // create net/url object createUrl, err := url.Parse(*snapshotCreateURL) @@ -80,12 +85,14 @@ func main() { logger.Fatalf("cannot set snapshotName flag: %v", err) } - defer func() { - err := snapshot.Delete(deleteUrl.String(), name) + deleteSnapshot = func() { + err := snapshot.Delete(deleteURL.String(), name) if err != nil { logger.Fatalf("cannot delete snapshot: %s", err) } - }() + } + + defer deleteSnapshot() } else if len(*snapshotName) == 0 { logger.Fatalf("`-snapshotName` or `-snapshot.createURL` must be provided") } @@ -97,14 +104,17 @@ func main() { srcFS, err := newSrcFS() if err != nil { + deleteSnapshot() logger.Fatalf("%s", err) } dstFS, err := newDstFS() if err != nil { + deleteSnapshot() logger.Fatalf("%s", err) } originFS, err := newOriginFS() if err != nil { + deleteSnapshot() logger.Fatalf("%s", err) } a := &actions.Backup{ @@ -114,6 +124,7 @@ func main() { Origin: originFS, } if err := a.Run(); err != nil { + deleteSnapshot() logger.Fatalf("cannot create backup: %s", err) } srcFS.MustStop() @@ -123,6 +134,7 @@ func main() { startTime := time.Now() logger.Infof("gracefully shutting down http server for metrics at %q", *httpListenAddr) if err := httpserver.Stop(*httpListenAddr); err != nil { + deleteSnapshot() logger.Fatalf("cannot stop http server for metrics: %s", err) } logger.Infof("successfully shut down http server for metrics in %.3f seconds", time.Since(startTime).Seconds()) diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 0f1ec886cb..c393e6a300 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -17,6 +17,7 @@ The following tip changes can be tested by building VictoriaMetrics components f * BUGFIX: prevent from slow [snapshot creating](https://docs.victoriametrics.com/#how-to-work-with-snapshots) under high data ingestion rate. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/3551). * BUGFIX: [vmauth](https://docs.victoriametrics.com/vmauth.html): suppress [proxy protocol](https://www.haproxy.org/download/2.3/doc/proxy-protocol.txt) parsing errors in case of `EOF`. Usually, the error is caused by health checks and is not a sign of an actual error. +* BUGFIX: [vmbackup](https://docs.victoriametrics.com/vmbackup.html): fix snapshot not being deleted in case of error during backup. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/2055). ## [v1.87.3](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.87.3)