mirror of
https://github.com/rclone/rclone.git
synced 2024-11-22 16:34:30 +01:00
chunker: fix NewFs when root points to composite multi-chunk file without metadata
Before this change, calling NewFs on a composite multi-chunk file with --chunker-meta-format "none" would fail due to f.base pointing to the wrong Fs. This change fixes the issue, which was discovered on the bisync integration tests.
This commit is contained in:
parent
21f3ba13f6
commit
8524afa9ce
@ -101,8 +101,10 @@ var (
|
|||||||
//
|
//
|
||||||
// And still chunker's primary function is to chunk large files
|
// And still chunker's primary function is to chunk large files
|
||||||
// rather than serve as a generic metadata container.
|
// rather than serve as a generic metadata container.
|
||||||
const maxMetadataSize = 1023
|
const (
|
||||||
const maxMetadataSizeWritten = 255
|
maxMetadataSize = 1023
|
||||||
|
maxMetadataSizeWritten = 255
|
||||||
|
)
|
||||||
|
|
||||||
// Current/highest supported metadata format.
|
// Current/highest supported metadata format.
|
||||||
const metadataVersion = 2
|
const metadataVersion = 2
|
||||||
@ -317,11 +319,13 @@ func NewFs(ctx context.Context, name, rpath string, m configmap.Mapper) (fs.Fs,
|
|||||||
// i.e. `rpath` does not exist in the wrapped remote, but chunker
|
// i.e. `rpath` does not exist in the wrapped remote, but chunker
|
||||||
// detects a composite file because it finds the first chunk!
|
// detects a composite file because it finds the first chunk!
|
||||||
// (yet can't satisfy fstest.CheckListing, will ignore)
|
// (yet can't satisfy fstest.CheckListing, will ignore)
|
||||||
if err == nil && !f.useMeta && strings.Contains(rpath, "/") {
|
if err == nil && !f.useMeta {
|
||||||
firstChunkPath := f.makeChunkName(remotePath, 0, "", "")
|
firstChunkPath := f.makeChunkName(remotePath, 0, "", "")
|
||||||
_, testErr := cache.Get(ctx, baseName+firstChunkPath)
|
newBase, testErr := cache.Get(ctx, baseName+firstChunkPath)
|
||||||
if testErr == fs.ErrorIsFile {
|
if testErr == fs.ErrorIsFile {
|
||||||
|
f.base = newBase
|
||||||
err = testErr
|
err = testErr
|
||||||
|
cache.PinUntilFinalized(f.base, f)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1134,8 +1138,8 @@ func (o *Object) readXactID(ctx context.Context) (xactID string, err error) {
|
|||||||
// put implements Put, PutStream, PutUnchecked, Update
|
// put implements Put, PutStream, PutUnchecked, Update
|
||||||
func (f *Fs) put(
|
func (f *Fs) put(
|
||||||
ctx context.Context, in io.Reader, src fs.ObjectInfo, remote string, options []fs.OpenOption,
|
ctx context.Context, in io.Reader, src fs.ObjectInfo, remote string, options []fs.OpenOption,
|
||||||
basePut putFn, action string, target fs.Object) (obj fs.Object, err error) {
|
basePut putFn, action string, target fs.Object,
|
||||||
|
) (obj fs.Object, err error) {
|
||||||
// Perform consistency checks
|
// Perform consistency checks
|
||||||
if err := f.forbidChunk(src, remote); err != nil {
|
if err := f.forbidChunk(src, remote); err != nil {
|
||||||
return nil, fmt.Errorf("%s refused: %w", action, err)
|
return nil, fmt.Errorf("%s refused: %w", action, err)
|
||||||
|
Loading…
Reference in New Issue
Block a user