in lib/store/base/file_op.go [210:267]
func (op *localFileOp) createFileHelper(
name string, targetState FileState, sourcePath string, len int64) (err error) {
// Check if file exists in in-memory map and is in an acceptable state.
loaded := op.s.fileMap.LoadForRead(name, func(name string, entry FileEntry) {
err = op.verifyStateHelper(name, entry)
})
if err != nil && !os.IsNotExist(err) {
// Includes FileStateError.
return err
} else if loaded {
return os.ErrExist
}
// Check if file is on disk.
loaded, err = op.reloadFileEntryHelper(name)
if err != nil && !os.IsNotExist(err) {
// Includes FileStateError.
return err
} else if loaded {
return os.ErrExist
}
// Create new file entry.
err = nil
newEntry, err := op.s.fileEntryFactory.Create(name, targetState)
if err != nil {
return fmt.Errorf("create: %s", err)
}
if stored := op.s.fileMap.TryStore(name, newEntry, func(name string, entry FileEntry) bool {
if sourcePath != "" {
err = newEntry.MoveFrom(targetState, sourcePath)
if err != nil {
return false
}
} else {
err = newEntry.Create(targetState, len)
if err != nil {
return false
}
}
return true
}); err != nil {
return err
} else if !stored {
// Another goroutine created the entry before this one, verify again for
// correct error message.
// Since TryStore() updates LAT of existing entry, it's unlikely that
// the entry would be deleted before this function returns.
if loadErr := op.lockHelper(name, _lockLevelRead, func(name string, entry FileEntry) {
return
}); loadErr != nil {
return loadErr
}
return os.ErrExist
}
return nil
}