From 3ea1c5c4d224605b57bf08f018f610dec3f2e48a Mon Sep 17 00:00:00 2001 From: Nick Craig-Wood Date: Tue, 5 Sep 2023 17:22:36 +0100 Subject: [PATCH] compress: fix ChangeNotify ChangeNotify has been broken on the compress backend for a long time! Before this change it was wrapping the file names received rather than unwrapping them to discover the original names. It is likely ChangeNotify was working adequately though for users as the VFS just uses the directories rather than the file names. --- backend/compress/compress.go | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/backend/compress/compress.go b/backend/compress/compress.go index 6d99604b8..f635c5e59 100644 --- a/backend/compress/compress.go +++ b/backend/compress/compress.go @@ -257,6 +257,16 @@ func isMetadataFile(filename string) bool { return strings.HasSuffix(filename, metaFileExt) } +// Checks whether a file is a metadata file and returns the original +// file name and a flag indicating whether it was a metadata file or +// not. +func unwrapMetadataFile(filename string) (string, bool) { + if !isMetadataFile(filename) { + return "", false + } + return filename[:len(filename)-len(metaFileExt)], true +} + // makeDataName generates the file name for a data file with specified compression mode func makeDataName(remote string, size int64, mode int) (newRemote string) { if mode != Uncompressed { @@ -979,7 +989,8 @@ func (f *Fs) ChangeNotify(ctx context.Context, notifyFunc func(string, fs.EntryT wrappedNotifyFunc := func(path string, entryType fs.EntryType) { fs.Logf(f, "path %q entryType %d", path, entryType) var ( - wrappedPath string + wrappedPath string + isMetadataFile bool ) switch entryType { case fs.EntryDirectory: @@ -987,7 +998,10 @@ func (f *Fs) ChangeNotify(ctx context.Context, notifyFunc func(string, fs.EntryT case fs.EntryObject: // Note: All we really need to do to monitor the object is to check whether the metadata changed, // as the metadata contains the hash. This will work unless there's a hash collision and the sizes stay the same. - wrappedPath = makeMetadataName(path) + wrappedPath, isMetadataFile = unwrapMetadataFile(path) + if !isMetadataFile { + return + } default: fs.Errorf(path, "press ChangeNotify: ignoring unknown EntryType %d", entryType) return