diff --git a/cmd/mount_unix.go b/cmd/mount_unix.go index 8e8a64763dbd..9c51ea08f1d2 100644 --- a/cmd/mount_unix.go +++ b/cmd/mount_unix.go @@ -698,12 +698,21 @@ func launchMount(mp string, conf *vfs.Config) error { cancel() if err == nil { return nil + } else { + var exitError *exec.ExitError + if ok := errors.As(err, &exitError); ok { + if waitStatus, ok := exitError.Sys().(syscall.WaitStatus); ok && waitStatus.ExitStatus() == meta.UmountCode { + logger.Errorf("received umount exit code") + _ = doUmount(mp, true) + return nil + } + } + if fuseFd < 0 { + logger.Info("transfer FUSE session to others") + return nil + } + time.Sleep(time.Second) } - if fuseFd < 0 { - logger.Info("transfer FUSE session to others") - return nil - } - time.Sleep(time.Second) } } diff --git a/pkg/meta/base.go b/pkg/meta/base.go index 7f4c37d602bb..53f641f934ae 100644 --- a/pkg/meta/base.go +++ b/pkg/meta/base.go @@ -550,6 +550,8 @@ func (m *baseMeta) OnReload(fn func(f *Format)) { m.reloadCb = append(m.reloadCb, fn) } +const UmountCode = 11 + func (m *baseMeta) refresh() { for { if m.conf.Heartbeat > 0 { @@ -571,11 +573,17 @@ func (m *baseMeta) refresh() { old := m.getFormat() if format, err := m.Load(false); err != nil { + if strings.HasPrefix(err.Error(), "database is not formatted") { + logger.Errorf("reload setting: %s", err) + os.Exit(UmountCode) + } logger.Warnf("reload setting: %s", err) } else if format.MetaVersion > MaxVersion { - logger.Fatalf("incompatible metadata version %d > max version %d", format.MetaVersion, MaxVersion) + logger.Errorf("incompatible metadata version %d > max version %d", format.MetaVersion, MaxVersion) + os.Exit(UmountCode) } else if format.UUID != old.UUID { - logger.Fatalf("UUID changed from %s to %s", old, format.UUID) + logger.Errorf("UUID changed from %s to %s", old.UUID, format.UUID) + os.Exit(UmountCode) } else if !reflect.DeepEqual(format, old) { m.msgCallbacks.Lock() cbs := m.reloadCb