in oss/filelike.go [654:698]
func (f *AppendOnlyFile) writeFrom(r io.Reader) (n int64, err error) {
offset := f.offset
request := &AppendObjectRequest{
Bucket: &f.bucket,
Key: &f.key,
Position: Ptr(f.offset),
Body: r,
RequestPayer: f.requestPayer,
}
f.applyCreateParamIfNeed(request)
var roffset int64
var rs io.Seeker
rs, ok := r.(io.Seeker)
if ok {
roffset, _ = rs.Seek(0, io.SeekCurrent)
}
var result *AppendObjectResult
if result, err = f.client.AppendObject(f.context, request); err == nil {
f.offset = result.NextPosition
f.hashCRC64 = result.HashCRC64
f.created = true
} else {
var serr *ServiceError
if errors.As(err, &serr) && serr.Code == "PositionNotEqualToLength" {
if position, hashcrc, ok := f.nextAppendPosition(); ok {
if rs != nil {
if curr, e := rs.Seek(0, io.SeekCurrent); e == nil {
if offset+(curr-roffset) == position {
f.offset = position
f.hashCRC64 = hashcrc
f.created = true
err = nil
}
}
}
}
}
}
return f.offset - offset, err
}