func TestDb_CreateReopenDbOnFile(t *testing.T) { dbpath := filepath.Join(os.TempDir(), fmt.Sprintf("goleveldbtestCreateReopenDbOnFile-%d", os.Getuid())) if err := os.RemoveAll(dbpath); err != nil { t.Fatal("cannot remove old db: ", err) } defer os.RemoveAll(dbpath) for i := 0; i < 3; i++ { stor, err := storage.OpenFile(dbpath) if err != nil { t.Fatalf("(%d) cannot open storage: %s", i, err) } db, err := Open(stor, nil) if err != nil { t.Fatalf("(%d) cannot open db: %s", i, err) } if err := db.Put([]byte("foo"), []byte("bar"), nil); err != nil { t.Fatalf("(%d) cannot write to db: %s", i, err) } if err := db.Close(); err != nil { t.Fatalf("(%d) cannot close db: %s", i, err) } if err := stor.Close(); err != nil { t.Fatalf("(%d) cannot close storage: %s", i, err) } } }
func openDBBench(b *testing.B, noCompress bool) *dbBench { _, err := os.Stat(benchDB) if err == nil { err = os.RemoveAll(benchDB) if err != nil { b.Fatal("cannot remove old db: ", err) } } p := &dbBench{ b: b, o: &opt.Options{}, ro: &opt.ReadOptions{}, wo: &opt.WriteOptions{}, } p.stor, err = storage.OpenFile(benchDB) if err != nil { b.Fatal("cannot open stor: ", err) } if noCompress { p.o.Compression = opt.NoCompression } p.db, err = Open(p.stor, p.o) if err != nil { b.Fatal("cannot open db: ", err) } runtime.GOMAXPROCS(runtime.NumCPU()) return p }
func NewStorage() *Storage { var stor storage.Storage var closeFn func() error if storageUseFS { for { storageMu.Lock() num := storageNum storageNum++ storageMu.Unlock() path := filepath.Join(os.TempDir(), fmt.Sprintf("goleveldb-test%d0%d0%d", os.Getuid(), os.Getpid(), num)) if _, err := os.Stat(path); os.IsNotExist(err) { stor, err = storage.OpenFile(path) ExpectWithOffset(1, err).NotTo(HaveOccurred(), "creating storage at %s", path) closeFn = func() error { if storageKeepFS { return nil } return os.RemoveAll(path) } break } } } else { stor = storage.NewMemStorage() } s := &Storage{ Storage: stor, closeFn: closeFn, opens: make(map[uint64]bool), } s.stallCond.L = &s.mu return s }
func newTestStorage(t *testing.T) *testStorage { var stor storage.Storage var closeFn func() error if tsFS { for { tsMU.Lock() num := tsNum tsNum++ tsMU.Unlock() path := filepath.Join(os.TempDir(), fmt.Sprintf("goleveldb-test%d0%d0%d", os.Getuid(), os.Getpid(), num)) if _, err := os.Stat(path); err != nil { stor, err = storage.OpenFile(path) if err != nil { t.Fatalf("F: cannot create storage: %v", err) } t.Logf("I: storage created: %s", path) closeFn = func() error { for _, name := range []string{"LOG.old", "LOG"} { f, err := os.Open(filepath.Join(path, name)) if err != nil { continue } if log, err := ioutil.ReadAll(f); err != nil { t.Logf("---------------------- %s ----------------------", name) t.Logf("cannot read log: %v", err) t.Logf("---------------------- %s ----------------------", name) } else if len(log) > 0 { t.Logf("---------------------- %s ----------------------\n%s", name, string(log)) t.Logf("---------------------- %s ----------------------", name) } f.Close() } if tsKeepFS { return nil } return os.RemoveAll(path) } break } } } else { stor = storage.NewMemStorage() } ts := &testStorage{ t: t, Storage: stor, closeFn: closeFn, opens: make(map[uint64]bool), } ts.cond.L = &ts.mu return ts }
// OpenFile opens or creates a DB for the given path. OpenFile uses standard // file-system backed storage implementation as desribed in the leveldb/storage // package. // The DB will be created if not exist, unless ErrorIfMissing is true. // Also, if ErrorIfExist is true and the DB exist OpenFile will returns // os.ErrExist error. // // The DB must be closed after use, by calling Close method. func OpenFile(path string, o *opt.Options) (db *DB, err error) { stor, err := storage.OpenFile(path) if err != nil { return } db, err = Open(stor, o) if err != nil { stor.Close() } else { db.closer = stor } return }
func main() { flag.Parse() fmt.Printf("Using path: %s\n", filename) if child { fmt.Println("Child flag set.") } stor, err := storage.OpenFile(filename) if err != nil { fmt.Printf("Could not open storage: %s", err) os.Exit(10) } if !child { fmt.Println("Executing child -- first test (expecting error)") err := runChild() if err == nil { fmt.Println("Expecting error from child") } else if err.Error() != "exit status 10" { fmt.Println("Got unexpected error from child:", err) } else { fmt.Printf("Got error from child: %s (expected)\n", err) } } err = stor.Close() if err != nil { fmt.Printf("Error when closing storage: %s", err) os.Exit(11) } if !child { fmt.Println("Executing child -- second test") err := runChild() if err != nil { fmt.Println("Got unexpected error from child:", err) } } os.RemoveAll(filename) }