From f9577a38dc91254e6203cc1d0dc2c5cb1c046574 Mon Sep 17 00:00:00 2001 From: Jakob Borg Date: Mon, 23 Feb 2015 08:21:05 +0100 Subject: [PATCH] Attempt recovery of corrupted DB at startup (fixes #987) --- cmd/syncthing/main.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/cmd/syncthing/main.go b/cmd/syncthing/main.go index 8cf7f6956..ed6c5a2be 100644 --- a/cmd/syncthing/main.go +++ b/cmd/syncthing/main.go @@ -47,6 +47,7 @@ import ( "github.com/syncthing/syncthing/internal/upgrade" "github.com/syncthing/syncthing/internal/upnp" "github.com/syndtr/goleveldb/leveldb" + "github.com/syndtr/goleveldb/leveldb/errors" "github.com/syndtr/goleveldb/leveldb/opt" "golang.org/x/crypto/bcrypt" ) @@ -491,7 +492,12 @@ func syncthingMain() { readRateLimit = ratelimit.NewBucketWithRate(float64(1000*opts.MaxRecvKbps), int64(5*1000*opts.MaxRecvKbps)) } - ldb, err := leveldb.OpenFile(filepath.Join(confDir, "index"), &opt.Options{OpenFilesCacheCapacity: 100}) + dbFile := filepath.Join(confDir, "index") + dbOpts := &opt.Options{OpenFilesCacheCapacity: 100} + ldb, err := leveldb.OpenFile(dbFile, dbOpts) + if err != nil && errors.IsCorrupted(err) { + ldb, err = leveldb.RecoverFile(dbFile, dbOpts) + } if err != nil { l.Fatalln("Cannot open database:", err, "- Is another copy of Syncthing already running?") }