Browse Source

Attempt to delete and reopen datastore file to recover from file system/data errors

Rod Hynes 10 years ago
parent
commit
7f921bbc44
1 changed files with 9 additions and 0 deletions
  1. 9 0
      psiphon/dataStore.go

+ 9 - 0
psiphon/dataStore.go

@@ -25,6 +25,7 @@ import (
 	"errors"
 	"fmt"
 	"math/rand"
+	"os"
 	"path/filepath"
 	"strings"
 	"sync"
@@ -78,6 +79,14 @@ func InitDataStore(config *Config) (err error) {
 		filename := filepath.Join(config.DataStoreDirectory, DATA_STORE_FILENAME)
 		var db *bolt.DB
 		db, err = bolt.Open(filename, 0600, &bolt.Options{Timeout: 1 * time.Second})
+
+		// The datastore file may be corrupt, so attempt to delete and try again
+		if err != nil {
+			NoticeAlert("retry on initDataStore error: %s", err)
+			os.Remove(filename)
+			db, err = bolt.Open(filename, 0600, &bolt.Options{Timeout: 1 * time.Second})
+		}
+
 		if err != nil {
 			// Note: intending to set the err return value for InitDataStore
 			err = fmt.Errorf("initDataStore failed to open database: %s", err)