func New(dataDir string) (app *App, err error) { err = os.Mkdir(dataDir, 0700) if err != nil && !os.IsExist(err) { return nil, err } lockPath := filepath.Join(dataDir, "lock") lockFile, err := lock(lockPath) if err != nil { return nil, err } defer func() { if err != nil { // if we're reporting an error, also unlock _ = lockFile.Close() } }() kvpath := filepath.Join(dataDir, "chunks") err = kvfiles.Create(kvpath) if err != nil { return nil, err } dbpath := filepath.Join(dataDir, "bazil.bolt") database, err := db.Open(dbpath, 0600, nil) if err != nil { return nil, err } err = database.DB.Update(func(tx *bolt.Tx) error { if _, err := tx.CreateBucketIfNotExists([]byte(tokens.BucketBazil)); err != nil { return err } return nil }) if err != nil { database.Close() return nil, err } keys, err := loadOrGenerateKeys(database.DB) if err != nil { return nil, err } app = &App{ DataDir: dataDir, lockFile: lockFile, DB: database, Keys: keys, } app.volumes.Cond.L = &app.volumes.Mutex app.volumes.open = make(map[db.VolumeID]*VolumeRef) return app, nil }
func New(dataDir string) (app *App, err error) { err = os.Mkdir(dataDir, 0700) if err != nil && !os.IsExist(err) { return nil, err } lockPath := filepath.Join(dataDir, "lock") lockFile, err := lock(lockPath) if err != nil { return nil, err } defer func() { if err != nil { // if we're reporting an error, also unlock _ = lockFile.Close() } }() kvpath := filepath.Join(dataDir, "chunks") err = kvfiles.Create(kvpath) if err != nil { return nil, err } dbpath := filepath.Join(dataDir, "bazil.bolt") db, err := bolt.Open(dbpath, 0600, nil) if err != nil { return nil, err } err = db.Update(func(tx *bolt.Tx) error { if _, err := tx.CreateBucketIfNotExists([]byte(tokens.BucketBazil)); err != nil { return err } if _, err := tx.CreateBucketIfNotExists([]byte(tokens.BucketVolume)); err != nil { return err } if _, err := tx.CreateBucketIfNotExists([]byte(tokens.BucketVolName)); err != nil { return err } return nil }) if err != nil { db.Close() return nil, err } app = &App{ DataDir: dataDir, lockFile: lockFile, DB: db, } app.mounts.open = make(map[fs.VolumeID]*mountState) return app, nil }