in component/loopback/loopback_fs.go [504:564]
func (lfs *LoopbackFS) CommitData(options internal.CommitDataOptions) error {
log.Trace("LoopbackFS::StageData : name=%s", options.Name)
mainFilepath := filepath.Join(lfs.path, options.Name)
blob, err := os.OpenFile(mainFilepath, os.O_RDWR|os.O_CREATE, os.FileMode(0777))
if err != nil {
log.Err("LoopbackFS::CommitData : error opening [%s]", err)
return err
}
if len(options.List) == 0 {
err = blob.Truncate(0)
if err != nil {
return err
}
}
for idx, id := range options.List {
path := fmt.Sprintf("%s_%s", filepath.Join(lfs.path, options.Name), strings.ReplaceAll(id, "/", "_"))
info, err := os.Lstat(path)
if err == nil {
block, err := os.OpenFile(path, os.O_RDONLY, os.FileMode(0666))
if err != nil {
return err
}
data := make([]byte, info.Size())
n, err := block.Read(data)
if int64(n) != info.Size() {
log.Err("LoopbackFS::CommitData : error [could not read entire file]")
return err
}
n, err = blob.WriteAt(data, int64(idx*(int)(options.BlockSize)))
if err != nil {
return err
}
if int64(n) != info.Size() {
log.Err("LoopbackFS::CommitData : error [could not write file]")
return err
}
err = block.Close()
if err != nil {
return err
}
} else if !os.IsNotExist(err) {
return err
}
}
// delete the staged files
for _, id := range options.List {
path := fmt.Sprintf("%s_%s", filepath.Join(lfs.path, options.Name), strings.ReplaceAll(id, "/", "_"))
_ = os.Remove(path)
}
err = blob.Close()
return err
}