From cbe0d2fffc7698b5652d0e0786fdc656cbd589de Mon Sep 17 00:00:00 2001 From: Simon Frei Date: Wed, 17 Jun 2020 10:03:39 +0200 Subject: [PATCH] lib/db: Improve error message on meta inconsistency (#6751) --- lib/db/lowlevel.go | 7 ++++++- lib/db/meta.go | 11 ++++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/lib/db/lowlevel.go b/lib/db/lowlevel.go index fe3ec685a..557dc49b4 100644 --- a/lib/db/lowlevel.go +++ b/lib/db/lowlevel.go @@ -811,7 +811,12 @@ func (db *Lowlevel) getMetaAndCheck(folder string) *metadataTracker { func (db *Lowlevel) loadMetadataTracker(folder string) *metadataTracker { meta := newMetadataTracker() if err := meta.fromDB(db, []byte(folder)); err != nil { - l.Infof("No stored folder metadata for %q; recalculating", folder) + if err == errMetaInconsistent { + l.Infof("Stored folder metadata for %q is inconsistent; recalculating", folder) + } else { + l.Infof("No stored folder metadata for %q; recalculating", folder) + + } return db.getMetaAndCheck(folder) } diff --git a/lib/db/meta.go b/lib/db/meta.go index 5f682898f..e7cabb7fa 100644 --- a/lib/db/meta.go +++ b/lib/db/meta.go @@ -8,6 +8,7 @@ package db import ( "bytes" + "errors" "math/bits" "time" @@ -15,6 +16,8 @@ import ( "github.com/syncthing/syncthing/lib/sync" ) +var errMetaInconsistent = errors.New("inconsistent counts detected") + type countsMap struct { counts CountsSet indexes map[metaKey]int // device ID + local flags -> index in counts @@ -104,7 +107,13 @@ func (m *metadataTracker) fromDB(db *Lowlevel, folder []byte) error { if err != nil { return err } - return m.Unmarshal(bs) + if err = m.Unmarshal(bs); err != nil { + return err + } + if m.counts.Created == 0 { + return errMetaInconsistent + } + return nil } // countsPtr returns a pointer to the corresponding Counts struct, if