From 6e8002f0657704ed77f1048cfe8b6424d2a9db55 Mon Sep 17 00:00:00 2001 From: 7y-9 Date: Fri, 5 Jun 2026 01:53:23 +0800 Subject: [PATCH] fix: handle meta backup offset errors safely (#9818) * fix: log meta backup offset errors * fix: log meta backup offset errors * fix: exit on meta backup offset errors Exit with a non-zero status when the initial metadata backup offset cannot be persisted. Classify offset-read failures during streaming so the backup process exits instead of retrying forever, allowing supervisors to restart and bootstrap from a missing checkpoint. * meta backup: read offset in the loop, drop offset error type Reading the saved offset inside the retry loop makes an offset read failure a clean exit and a stream error a retry, without a typed error to tell them apart. streamMetadataBackup now takes the start time. --------- Co-authored-by: Chris Lu --- weed/command/filer_meta_backup.go | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/weed/command/filer_meta_backup.go b/weed/command/filer_meta_backup.go index 9276f98e2..33947b3d2 100644 --- a/weed/command/filer_meta_backup.go +++ b/weed/command/filer_meta_backup.go @@ -115,15 +115,19 @@ func runFilerMetaBackup(cmd *Command, args []string) bool { glog.Errorf("traverse meta data: %v", err) return true } - glog.V(0).Infof("metadata copied up to %v", startTime) if err := metaBackup.setOffset(startTime); err != nil { - startTime = time.Now() + glog.Exitf("set metadata backup offset: %v", err) + return true } + glog.V(0).Infof("metadata copied up to %v", startTime) } for { - err := metaBackup.streamMetadataBackup() + startTime, err := metaBackup.getOffset() if err != nil { + glog.Exitf("read metadata backup offset from %s: %v", *metaBackup.filerAddress, err) + } + if err := metaBackup.streamMetadataBackup(startTime); err != nil { glog.Errorf("filer meta backup from %s: %v", *metaBackup.filerAddress, err) time.Sleep(1747 * time.Millisecond) } @@ -177,12 +181,8 @@ var ( MetaBackupKey = []byte("metaBackup") ) -func (metaBackup *FilerMetaBackupOptions) streamMetadataBackup() error { +func (metaBackup *FilerMetaBackupOptions) streamMetadataBackup(startTime time.Time) error { - startTime, err := metaBackup.getOffset() - if err != nil { - startTime = time.Now() - } glog.V(0).Infof("streaming from %v", startTime) store := metaBackup.store