mirror of
https://github.com/rclone/rclone.git
synced 2024-11-22 00:13:49 +01:00
pikpak: non-buffered hash calculation for local source files
This commit is contained in:
parent
56caab2033
commit
846c1aeed0
@ -1695,18 +1695,31 @@ func (o *Object) upload(ctx context.Context, in io.Reader, src fs.ObjectInfo, wi
|
|||||||
|
|
||||||
// Calculate gcid; grabbed from package jottacloud
|
// Calculate gcid; grabbed from package jottacloud
|
||||||
var gcid string
|
var gcid string
|
||||||
// unwrap the accounting from the input, we use wrap to put it
|
if srcObj := fs.UnWrapObjectInfo(src); srcObj != nil && srcObj.Fs().Features().IsLocal {
|
||||||
// back on after the buffering
|
// No buffering; directly calculate gcid from source
|
||||||
var wrap accounting.WrapFn
|
rc, err := srcObj.Open(ctx)
|
||||||
in, wrap = accounting.UnWrap(in)
|
if err != nil {
|
||||||
var cleanup func()
|
return fmt.Errorf("failed to open src: %w", err)
|
||||||
gcid, in, cleanup, err = readGcid(in, size, int64(o.fs.opt.HashMemoryThreshold))
|
}
|
||||||
defer cleanup()
|
defer fs.CheckClose(rc, &err)
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("failed to calculate gcid: %w", err)
|
if gcid, err = calcGcid(rc, srcObj.Size()); err != nil {
|
||||||
|
return fmt.Errorf("failed to calculate gcid: %w", err)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// unwrap the accounting from the input, we use wrap to put it
|
||||||
|
// back on after the buffering
|
||||||
|
var wrap accounting.WrapFn
|
||||||
|
in, wrap = accounting.UnWrap(in)
|
||||||
|
var cleanup func()
|
||||||
|
gcid, in, cleanup, err = readGcid(in, size, int64(o.fs.opt.HashMemoryThreshold))
|
||||||
|
defer cleanup()
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to calculate gcid: %w", err)
|
||||||
|
}
|
||||||
|
// Wrap the accounting back onto the stream
|
||||||
|
in = wrap(in)
|
||||||
}
|
}
|
||||||
// Wrap the accounting back onto the stream
|
|
||||||
in = wrap(in)
|
|
||||||
|
|
||||||
if !withTemp {
|
if !withTemp {
|
||||||
info, err := o.fs.upload(ctx, in, leaf, dirID, gcid, size, options...)
|
info, err := o.fs.upload(ctx, in, leaf, dirID, gcid, size, options...)
|
||||||
|
Loading…
Reference in New Issue
Block a user