diff options
| author | Dmitry Vyukov <dvyukov@google.com> | 2022-01-20 15:39:18 +0100 |
|---|---|---|
| committer | Dmitry Vyukov <dvyukov@google.com> | 2022-01-24 12:33:27 +0100 |
| commit | 96ff84efe96135909f870cd105d034ff9bf77c05 (patch) | |
| tree | 0f6edee52c2da737e61e27a2d91566a8984cdd74 /pkg/db/db.go | |
| parent | 214351e168def9426c79e1f65a93ddb112cee906 (diff) | |
pkg/db: treat deserialization errors as soft
corpus.db may get corrupted on an unexpected reset, etc.
Commit a254b0f5 ("pkg/db: properly handle errors when loading a DB")
made these errors fatal and manager never recovers on its own.
Restore the previous behavior when we still recovered some records from the db.
But (1) ensure that the file is at least writable and (2) add tests.
Diffstat (limited to 'pkg/db/db.go')
| -rw-r--r-- | pkg/db/db.go | 19 |
1 files changed, 10 insertions, 9 deletions
diff --git a/pkg/db/db.go b/pkg/db/db.go index b62882b60..c2082c0a2 100644 --- a/pkg/db/db.go +++ b/pkg/db/db.go @@ -37,6 +37,9 @@ type Record struct { Seq uint64 } +// Open opens the specified database file. +// If the database is corrupted and reading failed, then it returns an non-nil db +// with whatever records were recovered and a non-nil error at the same time. func Open(filename string) (*DB, error) { db := &DB{ filename: filename, @@ -46,17 +49,15 @@ func Open(filename string) (*DB, error) { return nil, err } defer f.Close() - db.Version, db.Records, db.uncompacted, err = deserializeDB(bufio.NewReader(f)) - if err != nil { + // Deserialization error is considered a "soft" error, + // but compact below ensures that the file is at least writable. + var deserializeErr error + db.Version, db.Records, db.uncompacted, deserializeErr = deserializeDB(bufio.NewReader(f)) + f.Close() // compact will rewrite the file, so close our descriptor + if err := db.compact(); err != nil { return nil, err } - if len(db.Records) == 0 || db.uncompacted/10*9 > len(db.Records) { - f.Close() // compact will rewrite the file, so close our descriptor - if err := db.compact(); err != nil { - return nil, err - } - } - return db, nil + return db, deserializeErr } func (db *DB) Save(key string, val []byte, seq uint64) { |
