// Verify attempts to find any structural errors in DB wrt the organization of // it as defined by lldb.Allocator. 'bitmap' is a scratch pad for necessary // bookkeeping and will grow to at most to DB size/128 (0,78%). Any problems // found are reported to 'log' except non verify related errors like disk read // fails etc. If 'log' returns false or the error doesn't allow to (reliably) // continue, the verification process is stopped and an error is returned from // the Verify function. Passing a nil log works like providing a log function // always returning false. Any non-structural errors, like for instance Filer // read errors, are NOT reported to 'log', but returned as the Verify's return // value, because Verify cannot proceed in such cases. Verify returns nil only // if it fully completed verifying DB without detecting any error. // // It is recommended to limit the number reported problems by returning false // from 'log' after reaching some limit. Huge and corrupted DB can produce an // overwhelming error report dataset. // // The verifying process will scan the whole DB at least 3 times (a trade // between processing space and time consumed). It doesn't read the content of // free blocks above the head/tail info bytes. If the 3rd phase detects lost // free space, then a 4th scan (a faster one) is performed to precisely report // all of them. // // Statistics are returned via 'stats' if non nil. The statistics are valid // only if Verify succeeded, ie. it didn't reported anything to log and it // returned a nil error. func (db *DB) Verify(log func(error) bool, stats *lldb.AllocStats) (err error) { bitmapf, err := fileutil.TempFile(".", "verifier", ".tmp") if err != nil { return } defer func() { tn := bitmapf.Name() bitmapf.Close() os.Remove(tn) }() bitmap := lldb.NewSimpleFileFiler(bitmapf) if err = db.enter(); err != nil { return } defer func() { if e := recover(); e != nil { err = fmt.Errorf("%v", e) } db.leave(&err) }() return db.alloc.Verify(bitmap, log, stats) }
// CreateTemp creates a new temporary DB in the directory dir with a basename // beginning with prefix and name ending in suffix. If dir is the empty string, // CreateTemp uses the default directory for temporary files (see os.TempDir). // Multiple programs calling CreateTemp simultaneously will not choose the same // file name for the DB. The caller can use Name() to find the pathname of the // DB file. It is the caller's responsibility to remove the file when no longer // needed. // // For the meaning of opts please see documentation of Options. func CreateTemp(dir, prefix, suffix string, opts *Options) (db *DB, err error) { f, err := fileutil.TempFile(dir, prefix, suffix) if err != nil { return } return create(f, lldb.NewSimpleFileFiler(f), opts, false) }
// CreateTemp creates a new temporary DB in the directory dir with a basename // beginning with prefix and name ending in suffix. If dir is the empty string, // CreateTemp uses the default directory for temporary files (see os.TempDir). // Multiple programs calling CreateTemp simultaneously will not choose the same // file name for the DB. The caller can use Name() to find the pathname of the // DB file. It is the caller's responsibility to remove the file when no longer // needed. // // For the meaning of opts please see documentation of Options. func CreateTemp(dir, prefix, suffix string, opts *Options) (db *DB, err error) { opts = opts.clone() opts._ACID = _ACIDFull f, err := fileutil.TempFile(dir, prefix, suffix) if err != nil { return } return create(lldb.NewSimpleFileFiler(f), opts, false) }