From f8d782c02de5e42c354f281b4f32c4128fa5db1e Mon Sep 17 00:00:00 2001 From: wiserain Date: Sat, 21 Sep 2024 10:22:31 +0900 Subject: [PATCH] pikpak: fix cid/gcid calculations for fs.OverrideRemote Previously, cid/gcid (custom hash for pikpak) calculations failed when attempting to unwrap object info from `fs.OverrideRemote`. This commit introduces a new function that can correctly unwrap object info from both regular objects and `fs.OverrideRemote` types, ensuring uploads with accurate cid/gcid calculations in all scenarios. --- backend/pikpak/helper.go | 14 +++++++++++++- backend/pikpak/pikpak.go | 2 +- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/backend/pikpak/helper.go b/backend/pikpak/helper.go index ee2815d94..e6f779da9 100644 --- a/backend/pikpak/helper.go +++ b/backend/pikpak/helper.go @@ -378,11 +378,23 @@ func calcGcid(r io.Reader, size int64) (string, error) { return hex.EncodeToString(totalHash.Sum(nil)), nil } +// unWrapObjectInfo returns the underlying Object unwrapped as much as +// possible or nil even if it is an OverrideRemote +func unWrapObjectInfo(oi fs.ObjectInfo) fs.Object { + if o, ok := oi.(fs.Object); ok { + return fs.UnWrapObject(o) + } else if do, ok := oi.(*fs.OverrideRemote); ok { + // Unwrap if it is an operations.OverrideRemote + return do.UnWrap() + } + return nil +} + // calcCid calculates Cid from source // // Cid is a simplified version of Gcid func calcCid(ctx context.Context, src fs.ObjectInfo) (cid string, err error) { - srcObj := fs.UnWrapObjectInfo(src) + srcObj := unWrapObjectInfo(src) if srcObj == nil { return "", fmt.Errorf("failed to unwrap object from src: %s", src) } diff --git a/backend/pikpak/pikpak.go b/backend/pikpak/pikpak.go index 25c27f1c4..b70ecf92a 100644 --- a/backend/pikpak/pikpak.go +++ b/backend/pikpak/pikpak.go @@ -1773,7 +1773,7 @@ func (o *Object) upload(ctx context.Context, in io.Reader, src fs.ObjectInfo, wi gcid, err := o.fs.getGcid(ctx, src) if err != nil || gcid == "" { fs.Debugf(o, "calculating gcid: %v", err) - if srcObj := fs.UnWrapObjectInfo(src); srcObj != nil && srcObj.Fs().Features().IsLocal { + if srcObj := unWrapObjectInfo(src); srcObj != nil && srcObj.Fs().Features().IsLocal { // No buffering; directly calculate gcid from source rc, err := srcObj.Open(ctx) if err != nil {