nextcloud / nextcloud/desktop

"Remove download" option missing randomly for materialised files/folders in v34.0.0

Open
#10,517 0 comments 0 reactions 0 assignees View on GitHub
0. Needs triage bug feature: :file_folder: file provider os: :apple: macOS
Dominant language
C++
Stars
3.9k
Forks
1k
Avg merge
1d 17h
Merged PRs (30d)
123

Description

### ⚠️ Before submitting, please verify the following: ⚠️

- [x] This is a **bug**, not a question or a configuration issue.
- [x] This issue is **not** already reported on Github (I have searched for it).
- [x] Nextcloud Server and Desktop Client are **up to date**. See [Server Maintenance and Release Schedule](https://github.com/nextcloud/server/wiki/Maintenance-and-Release-Schedule) and [Desktop Releases](https://nextcloud.com/install/#install-clients) for supported versions.
- [x] I agree to follow Nextcloud's [Code of Conduct](https://nextcloud.com/contribute/code-of-conduct/)

### Bug description

The “Remove download” context‑menu option is randomly missing in v34.0.0, even when the item is fully materialised and should be eligible for eviction via File Provider.
This prevents freeing local disk space and makes it impossible to remove local copies of certain files or folders. The issue appears intermittently and is not tied to file type, size, or sync state.
This seems related to the new File Provider-only sync model introduced in v34.0.0, where Finder actions depend on macOS’s materialisation state. The state is not reflected correctly in the context menu.
Could be similar-ish to #10085 but it happens on files as well.

File:
Image

Folder:
Image

### Steps to reproduce

1. Install Nextcloud Desktop v34.0.0 on macOS 26.6
2. Sync any folder from the server
3. Right‑click a file or folder → choose “Download now”/"Always keep downloaded" to materialise it
4. Once fully downloaded, right‑click the same item again
5. “Remove Download” option is missing, and sometimes it is present, even for similar items in the same folder

### Expected behavior

The Finder context menu should show the “Remove download” option for any file or folder that is fully materialised, allowing the user to remove the local copy while keeping it in the cloud

### Which files are affected by this bug

Files and folders

### Operating system

macOS

### Which version of the operating system you are running.

macOS Tahoe 26.6 (25G72)

### Installation method

Official Installer for macOS 13 and later

### Nextcloud Server version

34.0.2

### Nextcloud Desktop Client version

34.0.0

### Did this occur after an update or on a clean installation?

Clean desktop client installation

### Are you using the Nextcloud Server Encryption module?

No

### Are you using an external user-backend?

- [x] Default internal user-backend
- [ ] LDAP or Active Directory
- [ ] SSO - SAML
- [ ] Other

### Nextcloud Server logs

```shell
{"reqId":"R5cVWv87dQJ4ZVQgjQle","level":3,"time":"2026-07-29T11:20:46+00:00","remoteAddr":"IPADDRESS","user":"USER","app":"core","method":"MOVE","url":"/remote.php/dav/uploads/USER/web-file-upload-529dc7d130d6676c/.file","scriptName":"/remote.php","message":"More than 1000 expressions in a list are not allowed on Oracle.","userAgent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.6 Safari/605.1.15","version":"34.0.2.1","exception":{"Exception":"Doctrine\\DBAL\\Query\\QueryException","Message":"More than 1000 expressions in a list are not allowed on Oracle.","Code":0,"Trace":[{"file":"/var/www/html/lib/private/DB/QueryBuilder/QueryBuilder.php","line":256,"function":"prepareForExecute","class":"OC\\DB\\QueryBuilder\\QueryBuilder","type":"->","args":[]},{"file":"/var/www/html/lib/private/FilesMetadata/Service/MetadataRequestService.php","line":117,"function":"executeQuery","class":"OC\\DB\\QueryBuilder\\QueryBuilder","type":"->","args":[]},{"file":"/var/www/html/lib/private/FilesMetadata/FilesMetadataManager.php","line":150,"function":"getMetadataFromFileIds","class":"OC\\FilesMetadata\\Service\\MetadataRequestService","type":"->","args":[[0,1,2,3,4,"And 1995 more entries, set log level to debug to see all entries"]]},{"file":"/var/www/html/apps/files/lib/Service/LivePhotosService.php","line":43,"function":"getMetadataForFiles","class":"OC\\FilesMetadata\\FilesMetadataManager","type":"->","args":[[0,1,2,3,4,"And 1995 more entries, set log level to debug to see all entries"]]},{"file":"/var/www/html/apps/files/lib/Listener/SyncLivePhotosListener.php","line":98,"function":"getLivePhotoPeerIds","class":"OCA\\Files\\Service\\LivePhotosService","type":"->","args":[[0,1,2,3,4,"And 1995 more entries, set log level to debug to see all entries"]]},{"file":"/var/www/html/apps/files/lib/Listener/SyncLivePhotosListener.php","line":68,"function":"handleCacheEntriesRemovedEvent","class":"OCA\\Files\\Listener\\SyncLivePhotosListener","type":"->","args":[{"__class__":"OCP\\Files\\Cache\\CacheEntriesRemovedEvent"}]},{"file":"/var/www/html/lib/private/EventDispatcher/ServiceEventListener.php","line":57,"function":"handle","class":"OCA\\Files\\Listener\\SyncLivePhotosListener","type":"->","args":[{"__class__":"OCP\\Files\\Cache\\CacheEntriesRemovedEvent"}]},{"file":"/var/www/html/3rdparty/symfony/event-dispatcher/EventDispatcher.php","line":220,"function":"__invoke","class":"OC\\EventDispatcher\\ServiceEventListener","type":"->","args":[{"__class__":"OCP\\Files\\Cache\\CacheEntriesRemovedEvent"},"OCP\\Files\\Cache\\CacheEntriesRemovedEvent",{"__class__":"Symfony\\Component\\EventDispatcher\\EventDispatcher"}]},{"file":"/var/www/html/3rdparty/symfony/event-dispatcher/EventDispatcher.php","line":56,"function":"callListeners","class":"Symfony\\Component\\EventDispatcher\\EventDispatcher","type":"->","args":[[{"__class__":"Closure"},{"__class__":"Closure"}],"OCP\\Files\\Cache\\CacheEntriesRemovedEvent",{"__class__":"OCP\\Files\\Cache\\CacheEntriesRemovedEvent"}]},{"file":"/var/www/html/lib/private/EventDispatcher/EventDispatcher.php","line":73,"function":"dispatch","class":"Symfony\\Component\\EventDispatcher\\EventDispatcher","type":"->","args":[{"__class__":"OCP\\Files\\Cache\\CacheEntriesRemovedEvent"},"OCP\\Files\\Cache\\CacheEntriesRemovedEvent"]},{"file":"/var/www/html/lib/private/EventDispatcher/EventDispatcher.php","line":86,"function":"dispatch","class":"OC\\EventDispatcher\\EventDispatcher","type":"->","args":["OCP\\Files\\Cache\\CacheEntriesRemovedEvent",{"__class__":"OCP\\Files\\Cache\\CacheEntriesRemovedEvent"}]},{"file":"/var/www/html/lib/private/Files/Cache/Cache.php","line":669,"function":"dispatchTyped","class":"OC\\EventDispatcher\\EventDispatcher","type":"->","args":[{"__class__":"OCP\\Files\\Cache\\CacheEntriesRemovedEvent"}]},{"file":"/var/www/html/lib/private/Files/Cache/Cache.php","line":581,"function":"removeChildren","class":"OC\\Files\\Cache\\Cache","type":"->","args":[{"__class__":"OC\\Files\\Cache\\CacheEntry"}]},{"file":"/var/www/html/lib/private/Files/Cache/Wrapper/CacheWrapper.php","line":199,"function":"remove","class":"OC\\Files\\Cache\\Cache","type":"->","args":["uploads/web-file-upload-529dc7d130d6676c"]},{"file":"/var/www/html/lib/private/Files/Cache/Updater.php","line":108,"function":"remove","class":"OC\\Files\\Cache\\Wrapper\\CacheWrapper","type":"->","args":["uploads/web-file-upload-529dc7d130d6676c"]},{"file":"/var/www/html/lib/private/Files/View.php","line":292,"function":"remove","class":"OC\\Files\\Cache\\Updater","type":"->","args":["uploads/web-file-upload-529dc7d130d6676c"]},{"file":"/var/www/html/lib/private/Files/View.php","line":1249,"function":"removeUpdate","class":"OC\\Files\\View","type":"->","args":[{"__class__":"OCA\\TermsOfService\\Filesystem\\StorageWrapper","cache":null,"scanner":{"__class__":"OC\\Files\\Cache\\Scanner"},"watcher":null,"propagator":null,"updater":{"__class__":"OC\\Files\\Cache\\Updater"},"mountPoint":"/USER/"},"uploads/web-file-upload-529dc7d130d6676c"]},{"file":"/var/www/html/lib/private/Files/View.php","line":319,"function":"basicOperation","class":"OC\\Files\\View","type":"->","args":["rmdir","/web-file-upload-529dc7d130d6676c",["delete"]]},{"file":"/var/www/html/apps/dav/lib/Connector/Sabre/Directory.php","line":316,"function":"rmdir","class":"OC\\Files\\View","type":"->","args":["/web-file-upload-529dc7d130d6676c"]},{"file":"/var/www/html/apps/dav/lib/Upload/FutureFile.php","line":89,"function":"delete","class":"OCA\\DAV\\Connector\\Sabre\\Directory","type":"->","args":[]},{"file":"/var/www/html/3rdparty/sabre/dav/lib/DAV/Tree.php","line":182,"function":"delete","class":"OCA\\DAV\\Upload\\FutureFile","type":"->","args":[]},{"file":"/var/www/html/apps/dav/lib/Upload/ChunkingPlugin.php","line":78,"function":"move","class":"Sabre\\DAV\\Tree","type":"->","args":["uploads/USER/web-file-upload-529dc7d130d6676c/.file","files/USER/FOLDER/FILE"]},{"file":"/var/www/html/apps/dav/lib/Upload/ChunkingPlugin.php","line":60,"function":"performMove","class":"OCA\\DAV\\Upload\\ChunkingPlugin","type":"->","args":["uploads/USER/web-file-upload-529dc7d130d6676c/.file","files/USER/FOLDER/FILE"]},{"file":"/var/www/html/3rdparty/sabre/event/lib/WildcardEmitterTrait.php","line":89,"function":"beforeMove","class":"OCA\\DAV\\Upload\\ChunkingPlugin","type":"->","args":["uploads/USER/web-file-upload-529dc7d130d6676c/.file","files/USER/FOLDER/FILE"]},{"file":"/var/www/html/3rdparty/sabre/dav/lib/DAV/CorePlugin.php","line":603,"function":"emit","class":"Sabre\\DAV\\Server","type":"->","args":["beforeMove",["uploads/USER/web-file-upload-529dc7d130d6676c/.file","files/USER/FOLDER/FILE"]]},{"file":"/var/www/html/3rdparty/sabre/event/lib/WildcardEmitterTrait.php","line":89,"function":"httpMove","class":"Sabre\\DAV\\CorePlugin","type":"->","args":[{"__class__":"Sabre\\HTTP\\Request"},{"__class__":"Sabre\\HTTP\\Response"}]},{"file":"/var/www/html/3rdparty/sabre/dav/lib/DAV/Server.php","line":472,"function":"emit","class":"Sabre\\DAV\\Server","type":"->","args":["method:MOVE",[{"__class__":"Sabre\\HTTP\\Request"},{"__class__":"Sabre\\HTTP\\Response"}]]},{"file":"/var/www/html/apps/dav/lib/Connector/Sabre/Server.php","line":215,"function":"invokeMethod","class":"Sabre\\DAV\\Server","type":"->","args":[{"__class__":"Sabre\\HTTP\\Request"},{"__class__":"Sabre\\HTTP\\Response"}]},{"file":"/var/www/html/apps/dav/lib/Server.php","line":432,"function":"start","class":"OCA\\DAV\\Connector\\Sabre\\Server","type":"->","args":[]},{"file":"/var/www/html/apps/dav/appinfo/v2/remote.php","line":25,"function":"exec","class":"OCA\\DAV\\Server","type":"->","args":[]},{"file":"/var/www/html/remote.php","line":152,"args":["/var/www/html/apps/dav/appinfo/v2/remote.php"],"function":"require_once"}],"File":"/var/www/html/lib/private/DB/QueryBuilder/QueryBuilder.php","Line":232,"message":"More than 1000 expressions in a list are not allowed on Oracle.","query":"SELECT `file_id`, `json`, `sync_token` FROM `*PREFIX*files_metadata` WHERE `file_id` IN (:dcValue1)","exception":"{\"class\":\"Doctrine\\DBAL\\Query\\QueryException\",\"message\":\"More than 1000 expressions in a list are not allowed on Oracle.\",\"code\":0,\"file\":\"/var/www/html/lib/private/DB/QueryBuilder/QueryBuilder.php:232\",\"trace\":\"#0 /var/www/html/lib/private/DB/QueryBuilder/QueryBuilder.php(256): OC\\DB\\QueryBuilder\\QueryBuilder->prepareForExecute()\\n#1 /var/www/html/lib/private/FilesMetadata/Service/MetadataRequestService.php(117): OC\\DB\\QueryBuilder\\QueryBuilder->executeQuery()\\n#2 /var/www/html/lib/private/FilesMetadata/FilesMetadataManager.php(150): OC\\FilesMetadata\\Service\\MetadataRequestService->getMetadataFromFileIds(Array)\\n#3 /var/www/html/apps/files/lib/Service/LivePhotosService.php(43): OC\\FilesMetadata\\FilesMetadataManager->getMetadataForFiles(Array)\\n#4 /var/www/html/apps/files/lib/Listener/SyncLivePhotosListener.php(98): OCA\\Files\\Service\\LivePhotosService->getLivePhotoPeerIds(Array)\\n#5 /var/www/html/apps/files/lib/Listener/SyncLivePhotosListener.php(68): OCA\\Files\\Listener\\SyncLivePhotosListener->handleCacheEntriesRemovedEvent(Object(OCP\\Files\\Cache\\CacheEntriesRemovedEvent))\\n#6 /var/www/html/lib/private/EventDispatcher/ServiceEventListener.php(57): OCA\\Files\\Listener\\SyncLivePhotosListener->handle(Object(OCP\\Files\\Cache\\CacheEntriesRemovedEvent))\\n#7 /var/www/html/3rdparty/symfony/event-dispatcher/EventDispatcher.php(220): OC\\EventDispatcher\\ServiceEventListener->__invoke(Object(OCP\\Files\\Cache\\CacheEntriesRemovedEvent), 'OCP\\\\Files\\\\Cache...', Object(Symfony\\Component\\EventDispatcher\\EventDispatcher))\\n#8 /var/www/html/3rdparty/symfony/event-dispatcher/EventDispatcher.php(56): Symfony\\Component\\EventDispatcher\\EventDispatcher->callListeners(Array, 'OCP\\\\Files\\\\Cache...', Object(OCP\\Files\\Cache\\CacheEntriesRemovedEvent))\\n#9 /var/www/html/lib/private/EventDispatcher/EventDispatcher.php(73): Symfony\\Component\\EventDispatcher\\EventDispatcher->dispatch(Object(OCP\\Files\\Cache\\CacheEntriesRemovedEvent), 'OCP\\\\Files\\\\Cache...')\\n#10 /var/www/html/lib/private/EventDispatcher/EventDispatcher.php(86): OC\\EventDispatcher\\EventDispatcher->dispatch('OCP\\\\Files\\\\Cache...', Object(OCP\\Files\\Cache\\CacheEntriesRemovedEvent))\\n#11 /var/www/html/lib/private/Files/Cache/Cache.php(669): OC\\EventDispatcher\\EventDispatcher->dispatchTyped(Object(OCP\\Files\\Cache\\CacheEntriesRemovedEvent))\\n#12 /var/www/html/lib/private/Files/Cache/Cache.php(581): OC\\Files\\Cache\\Cache->removeChildren(Object(OC\\Files\\Cache\\CacheEntry))\\n#13 /var/www/html/lib/private/Files/Cache/Wrapper/CacheWrapper.php(199): OC\\Files\\Cache\\Cache->remove('uploads/web-fil...')\\n#14 /var/www/html/lib/private/Files/Cache/Updater.php(108): OC\\Files\\Cache\\Wrapper\\CacheWrapper->remove('uploads/web-fil...')\\n#15 /var/www/html/lib/private/Files/View.php(292): OC\\Files\\Cache\\Updater->remove('uploads/web-fil...')\\n#16 /var/www/html/lib/private/Files/View.php(1249): OC\\Files\\View->removeUpdate(Object(OCA\\TermsOfService\\Filesystem\\StorageWrapper), 'uploads/web-fil...')\\n#17 /var/www/html/lib/private/Files/View.php(319): OC\\Files\\View->basicOperation('rmdir', '/web-file-uploa...', Array)\\n#18 /var/www/html/apps/dav/lib/Connector/Sabre/Directory.php(316): OC\\Files\\View->rmdir('/web-file-uploa...')\\n#19 /var/www/html/apps/dav/lib/Upload/FutureFile.php(89): OCA\\DAV\\Connector\\Sabre\\Directory->delete()\\n#20 /var/www/html/3rdparty/sabre/dav/lib/DAV/Tree.php(182): OCA\\DAV\\Upload\\FutureFile->delete()\\n#21 /var/www/html/apps/dav/lib/Upload/ChunkingPlugin.php(78): Sabre\\DAV\\Tree->move('uploads/USER/w...', 'files/USER/FOLDER...')\\n#22 /var/www/html/apps/dav/lib/Upload/ChunkingPlugin.php(60): OCA\\DAV\\Upload\\ChunkingPlugin->performMove('uploads/USER/w...', 'files/USER/FOLDER...')\\n#23 /var/www/html/3rdparty/sabre/event/lib/WildcardEmitterTrait.php(89): OCA\\DAV\\Upload\\ChunkingPlugin->beforeMove('uploads/USER/w...', 'files/USER/FOLDER...')\\n#24 /var/www/html/3rdparty/sabre/dav/lib/DAV/CorePlugin.php(603): Sabre\\DAV\\Server->emit('beforeMove', Array)\\n#25 /var/www/html/3rdparty/sabre/event/lib/WildcardEmitterTrait.php(89): Sabre\\DAV\\CorePlugin->httpMove(Object(Sabre\\HTTP\\Request), Object(Sabre\\HTTP\\Response))\\n#26 /var/www/html/3rdparty/sabre/dav/lib/DAV/Server.php(472): Sabre\\DAV\\Server->emit('method:MOVE', Array)\\n#27 /var/www/html/apps/dav/lib/Connector/Sabre/Server.php(215): Sabre\\DAV\\Server->invokeMethod(Object(Sabre\\HTTP\\Request), Object(Sabre\\HTTP\\Response))\\n#28 /var/www/html/apps/dav/lib/Server.php(432): OCA\\DAV\\Connector\\Sabre\\Server->start()\\n#29 /var/www/html/apps/dav/appinfo/v2/remote.php(25): OCA\\DAV\\Server->exec()\\n#30 /var/www/html/remote.php(152): require_once('/var/www/html/a...')\\n#31 {main}\"}","CustomMessage":"More than 1000 expressions in a list are not allowed on Oracle."}}
```

### Additional info

Happy to share the Desktop client logs if needed!

Really appreciating all the effort you put into the development and maintenance🫰

Contributor guide

Open the contributing guide

Research direction

No desktop source file or test is named. First reproduce the missing Finder “Remove download” action after choosing “Download now” on a fully materialised file and folder, then trace the macOS File Provider context-menu integration. Done means the action appears consistently for eligible materialised items and remains absent when it should not apply.

Written by the indexing model from the issue text.

Assessment

Tech stack
cpp, macos
Domain
desktop
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Quiet
Clarity
Mostly clear
Newbie friendliness
45/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.