in file.go [93:127]
func Open(path string, mode os.FileMode, opts Options) (*File, error) {
const op = "txfile/open"
if err := opts.Validate(); err != nil {
return nil, fileErrWrap(op, path, err)
}
file, err := osfs.Open(path, mode)
if err != nil {
return nil, fileErrWrap(op, path, err).report("can not open file")
}
initOK := false
defer cleanup.IfNot(&initOK, cleanup.IgnoreError(file.Close))
waitLock := (opts.Flags & FlagWaitLock) == FlagWaitLock
if err := file.Lock(true, waitLock); err != nil {
return nil, fileErrWrap(op, path, err).report("failed to lock file")
}
defer cleanup.IfNot(&initOK, cleanup.IgnoreError(file.Unlock))
// initialize the file
f, err := openWith(file, opts)
if err != nil {
return nil, fileErrWrap(op, path, err).report("failed to open file")
}
tracef("open file: %p (%v)\n", f, path)
traceMetaPage(f.getMetaPage())
f.reportOpen()
initOK = true
return f, nil
}