func()

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
}